Delphi 7. Kompendium programisty
Spis treści
- Wstęp
- Część I
- Rozdział 1. Podstawy Delphi
- Rozdział 2. Język Object Pascal
- Rozdział 3. Programowanie Obiektowe
- Rozdział 4. IDE Delphi
- Podsumowanie części I
- Część II
- Rozdział 5. Obsługa komunikatów
- Rozdział 6. Rejestry i pliki INI
- Rozdział 7. Obsługa plików
- Rozdział 8. Aplikacje wielowątkowe
- Rozdział 9. Multimedia
- Rozdział 10. Biblioteki DLL
- Rozdział 11. Aplikacje sieciowe
- Rozdział 12. Win API
- Rozdział 13. COM i ActiveX
- Podsumowanie części II
- Część III
- Podsumowanie części III
- Część IV
- Podsumowanie części IV
- Część V
- Podsumowanie części V
- Zakończenie
- Dodatek A. Zasady pisania kodu
44 komentarze
moze mi ktos pomóc, chce aby aplikacja poza rysowaniem otoczki dla losowych punktów i wskazanych myszka, wczytywala je z pliku i dla nich znajdowała otoczke
Delphi 7. Kompendium programisty - http://allegro.pl/show_item.php?item=1756727337
W rozdziale 4. nie ma także załącznika z listingami, a przydały by się.
W rozdziale 4 brak jest rysunku 4.6. Mozna prosic o uzupelnienie?
A ja kupiłem i nie żałuę Dobra książka dla tych, którzy nie koniecznie muszą uważać się za wzorce doskonałości Wiele dobrych i co najważniejsze dobrze tłumaczonych wątków jakże potrzebnych w nauce programowania Gratuluje Adam
Dobra rzecz dla każdego, kto po prostu nie udaje programisty ale uczy sie od tych, którzy coś zrozumieli To moje zdanie i tyle
pepol jak masz problem z labelem? Trochę nie skumałem... Musiał byś powiedzieć coś więcej o tym zadaniu...
ludzie pomozcie!!! staram sie delikatnie wejsc w swiat programowania a tu juz na starcie jakis glupi problem:-) sam poczatek instrukcji gdzie zadanie polega na wprowadzeniu jednego labela, no i nie wiem co tam mozna skopac a wyskakuje mi error unable to create process
@pobrać się tego nie da. To jest wersja online.
Książka jest super.
Nie, to byly myslniki :/ pewnego razu byly problemy z baza danych i z kodowaniem w wyniku czego doszlo do zamiany na "kraczki" (w tym przypadku - znak "?"). Nalezy to poprawic :(
W tekście zdarzają się ? pytajniki ? w środku zdania (te pytajnik zostały wstawione umyślnie, zeby pokazać o co chodzi). Należy ? to ? poprawić.
Rozdział 4. IDE Delphi, czy ten rozdział zostanie dodany? czy nie ma co na to liczyć?
@Trok: http://pl.wikipedia.org/wiki/Z[...]C5%9Brodowisko_programistyczne
@Bartek 121: :|
"Rozdział 4. IDE Delphi" - Rozdzial ten niestety nie dziala, czy ktos wyjasni mi co to IDE Delphi i czy to jest bardzo wazne przy poczatkowej nauce Delphi?
@wodnick: a po co komu spis treści, skoro jest na stronie? :/ A jeśli chodzi o ten "rozbudowany" to jest on w poszczególnych rozdziałach przecież.
Super sprawa z tą książką :) przyda się mi na pewno. Na tym semestrze mam programowanie w Delphi. Ciekaw jestem rozdziału 4-go i mam nadzieje, że się pojawi :).
sie ma, jeśli ktoś chce mogę przesłać w DOC powyższy "rozbudowany" spis treści, gtelec@op.pl
a jest kompedium do ściągnięcia??
Chodzi mi o wersję PDF.
Dajcie mi znać na mój e-mail: kaban_os@yahoo.com
podziwiam autora książki że ją udostępnił bo zwykle nikt tak nie robi. Dzięki bardzo mi się przyda.
Deepshock: o programowaniu obiektowym masz też tu: http://4programmers.net/Delphi/OOP a o plikach sam poszukaj (jest tego trochę, jest :)) :P
@Coldpeer: dziękuje za podpowiedź. Jestem tutaj nowy, więc wiecie. :) Nie obeznany też. Strata że nie ma tych początkowych, bo ja właśnie na tym etapie jestem. Dopiero zaczynam naukę programowania, ale jestem dobrej myśli. Oby jak najszybciej zostały dodane brakujące materiały. :)
Deepshock: dlatego, że jeszcze tych tekstów nie ma :) Wkrótce je Adam zapewne doda :) Na przyszłość: linki koloru niebieskiego nie istnieją - czerwone tak.
Nie działa Rozdział 3 i 4 w części I. Po kliknięciu na linku pojawia mi się możliwość edycji.
Linku do listingow powinny juz dzialac ok. W razie jakichkolwiek problemow z linkami prosze pisac na adam@boduch.net
@lukasz_j: po co?
@przemekgodula: ktoś Ci każe??
@sazian: Ctrl+S :|
Było by fajnie, gdyby kiedys wyszla wersja w pliku PDF lub DOC.
Feratoin: nie wszystko naraz :p Tobie by się chciało tak formatował od razu każdy, cały, długi rozdział? ;>
NIe przesadzajcie ludzie Delphi 7 "MOŻNA" powiedzieć że to przeżytek wiec nic się nie stało że kupiliście sobie książkę 2-3 lata temu. Ja np. lubie mieć ksiązki w tradycyjnej postaci i elektronicznej bo można wykożystać dobre strony obu tych form.
Ehhh co ja tu będe dużo mówił... poczekam na następne książki też w formie strony :P
WeeR - zapłaciłeś by nie męczyć oczu czytając z monitora ;p
A ja ci powiem że niepotrzebnie kupiłeś bo prawie wszystko można (i można było) znaleźć w tym serwisie ;P
Mam nadzieję, że jednak będzie się to różniło chociaż troche od wersji książkowej, np. czegoś nie będzie, albo będzie opisane w skrócie, bo jednak ja kupiłem tą książke...

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Spin, math;
const
maxPunktow=20;
type
TPointArray = array of TPoint;
TPunkt = record x,y:real;end;
TWielokat=array[1..MaxPunktow] of TPunkt;
TPointFloat = Record
X : Real;
Y : Real;
end;
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
SpinEdit1: TSpinEdit;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Button4: TButton;
GroupBox1: TGroupBox;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Przelicz(xt,yt:real;var xe,ye:integer);
procedure RysujWielokat();
procedure DoMemo();
procedure Ekstrama();
function WyznaczSkale(xp,yp,xk,yk:real):real;
procedure Linia(xp,yp,xk,yk,color,grubosc:integer);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function ZnajdzOtoczke(var APunkty : TPointArray) : boolean;
procedure SprawdzKat(var A: TPointArray; Katy : array of Real; iLo, iHi: Integer);
var
Form1: TForm1;
NumPunkty : integer;
PierwszyPunkt : boolean;
Wielokat:TWielokat;
Punkty : TPointArray;
xmin,xmax,ymin,ymax,x2,y2:real;
skala,skalap:real;
nPunktow,margines,zakresx,zakresy,zakresxp,zakresyp,wx,wy,xx1,xx2,yy1,yy2,xe,ye,c,g,wxp,wyp,suwx,suwy,x1,y1,x3,y3:integer;
implementation
{$R *.dfm}
function ZnajdzOtoczke(var APunkty : TPointArray) : boolean;
var
LKaty : array of Real;
Lindex, LMinY, LMaxX, LPivotIndex, LPunktyHi : integer;
LPivot : TPoint;
LPoprzedni, LNastepny : TPoint;
LPoPrawej : boolean;
LVecPointX, LVecPointY : Real;
LPunktyize : integer;
begin
Result := True;
LPunktyHi := High(APunkty);
if LPunktyHi = 2 then Exit;
if LPunktyHi <> LMaxX then begin
LMaxX := APunkty[Lindex].X;
LPivotIndex := Lindex;
end;
end else if APunkty[Lindex].Y < LMinY then begin
LMinY := APunkty[Lindex].Y;
LMaxX := APunkty[Lindex].X;
LPivotIndex := Lindex;
end;
end;
LPivot := APunkty[LPivotIndex];
APunkty[LPivotIndex] := APunkty[LPunktyHi];
SetLength(APunkty, LPunktyHi);
SetLength(LKaty, LPunktyHi);
Dec(LPunktyHi);
for Lindex := 0 to LPunktyHi do begin
LVecPointX := LPivot.X - APunkty[Lindex].X;
LVecPointY := LPivot.Y - APunkty[Lindex].Y;
LKaty[Lindex] := LVecPointX / Hypot(LVecPointX, LVecPointY);
end;
SprawdzKat(APunkty, LKaty, 0, LPunktyHi);
Lindex := 1;
Repeat
if Lindex = 0 then LPoPrawej := True else begin
LPoprzedni := APunkty[Lindex - 1];
if Lindex = LPunktyHi then LNastepny := LPivot
else LNastepny := APunkty[Lindex + 1];
if ((LPoprzedni.X-APunkty[Lindex].X)*(LNastepny.Y-APunkty[Lindex].Y))-
((LNastepny.X-APunkty[Lindex].X)*(LPoprzedni.Y-APunkty[Lindex].Y)) < 0 then
LPoPrawej := true else
LPoPrawej := false;
end;
if LPoPrawej then begin
Inc(Lindex);
end else begin
if Lindex = LPunktyHi then begin
SetLength(APunkty, LPunktyHi);
Dec(LPunktyHi);
end else begin
Move(APunkty[Lindex + 1], APunkty[Lindex], (LPunktyHi - Lindex) * LPunktyize + 1);
SetLength(APunkty, LPunktyHi);
Dec(LPunktyHi);
end;
Dec(Lindex);
end;
until Lindex = LPunktyHi;
Inc(LPunktyHi);
SetLength(APunkty, LPunktyHi + 1);
APunkty[LPunktyHi] := LPivot;
end;
procedure SprawdzKat(var A: TPointArray ; Katy : array of Real; iLo, iHi: Integer);
var
Lo, Hi : Integer;
Mid : real;
TempPoint : TPoint;
TempAngle : Real;
begin
Lo := iLo;
Hi := iHi;
Mid := Katy[(Lo + Hi) shr 1];
repeat
while Katy[Lo] <> Mid do Dec(Hi);
if Lo <> Hi;
if Hi > iLo then SprawdzKat(A, Katy, iLo, Hi);
if Lo < iHi then SprawdzKat(A, Katy, Lo, iHi);
end;
procedure TForm1.Przelicz(xt,yt:real;var xe,ye:integer);
var dx,dy:real;
begin
dx:=xt-xmin;
dy:=yt-ymin;
xe:=round(dy*skala)+margines;
ye:=Image1.ClientHeight-round(dx*skala)-margines;
end;
procedure TForm1.DoMemo();
var s1,s2:string;i:integer;
begin
Memo1.Lines.Clear;
for i:=1 to nPunktow do
begin
Str(wielokat[i].x:12:3,s1); Str(wielokat[i].y:12:3,s2);
Memo1.lines.Add(IntToStr(i)+' '+s1+' '+s2);
end;
end;
procedure TForm1.ekstrama();
var i:integer;
begin
xmin:=wielokat[1].x;xmax:=wielokat[1].x;ymin:=wielokat[1].y;ymax:=wielokat[1].y;
for i:=1 to nPunktow do
begin
if wielokat[i].x <> xmax then xmax:=wielokat[i].x else xmax:=xmax;
if wielokat[i].y <> ymax then ymax:=wielokat[i].y else ymax:=ymax;
end;
//ShowMessage('xmin='+FloatToStr(xmin)+'xmax'+FloatToStr(xmax)+'ymin='+FloatToStr(ymin)+'ymax'+FloatToStr(ymax));
end;
procedure TForm1.RysujWielokat();
var i,xe,ye,xe2,ye2:integer;
begin
c:=100;
g:=2;
//Image1.Canvas.Font.Style:=[fsBold];
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Font.Size:=1;
image1.Canvas.Rectangle(0,0,Image1.Clientwidth,Image1.ClientHeight);
for i:=1 to (nPunktow-1) do
begin
Przelicz(wielokat[i].x,wielokat[i].y,xe,ye);
Przelicz(wielokat[i+1].x,wielokat[i+1].y,xe2,ye2);
Linia(xe,ye,xe2,ye2,c,g);
image1.Canvas.TextOut(xe2+15+wx,ye2-15-wy,floattostr(i+1));
end;
Przelicz(wielokat[nPunktow].x,wielokat[nPunktow].y,xe,ye);
Przelicz(wielokat[1].x,wielokat[1].y,xe2,ye2);
Linia(xe,ye,xe2,ye2,c,g);
end;
function TForm1.WyznaczSkale(xp,yp,xk,yk:real):real;
var dxe,dye,dxt,dyt:real;sx,sy:real;
begin
margines:=17;
dxe:=Image1.ClientHeight-2*margines;
dye:=Image1.ClientWidth-2*margines;
dxt:=xk-xp;
dyt:=yk-yp;
sx:=dxe/dxt;
sy:=dye/dyt;
result:=sx;if sy<sx then result:=sy;
end;
procedure TForm1.Linia(xp,yp,xk,yk,color,grubosc:integer);
begin
Image1.canvas.Pen.Color:=color;
Image1.canvas.Pen.Width:=grubosc;
Image1.canvas.MoveTo(xp+wx,yp-wy);
Image1.canvas.LineTo(xp+wx,yp-wy);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage('Aplikacja znajduje otoczke wypukla dla punktow (Algorytm Grahama)');
PierwszyPunkt := True;
Randomize;
Image1.Canvas.Brush.Color := clwhite;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
YLindex : integer;
XRand, YRand : integer;
begin
NumPunkty := SpinEdit1.Value;
Image1.Canvas.FillRect(Image1.ClientRect);
SetLength(Punkty, 0);
for YLindex := 1 to NumPunkty do begin
XRand := random(250) + 25; YRand := random(250) + 25;
if Image1.Canvas.Pixels[XRand, YRand] = clwhite then begin
Image1.Canvas.Pixels[XRand,YRand] := clblack;
SetLength(Punkty,length(Punkty) + 1);
Punkty[High(Punkty)].X := XRand;
Punkty[High(Punkty)].Y := YRand;
end;
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if PierwszyPunkt then begin
Image1.Canvas.FillRect(Image1.ClientRect);
PierwszyPunkt := False;
SetLength(Punkty, 0);
end;
if Image1.Canvas.Pixels[X, Y] = clblack then Exit;
SetLength(Punkty, length(Punkty) + 1);
Punkty[High(Punkty)].X := X;
Punkty[High(Punkty)].Y := Y;
Image1.Canvas.Pixels[X, Y] := clblack;
end;
procedure TForm1.Button2Click(Sender: TObject);
Var
LPoint : integer;
begin
PierwszyPunkt := True;
if not ZnajdzOtoczke(Punkty) then begin
ShowMessage('Zbyt mała liczba punktów (n<3)');
Exit;
end;
SetLength(Punkty, length(Punkty) + 1);
Punkty[High(Punkty)] := Punkty[0];
Image1.Canvas.Pen.Color := clred;
Image1.Canvas.Polyline(Punkty);
Image1.Canvas.Pen.Color := clblue;
for LPoint := 0 to High(Punkty) do
Image1.Canvas.Ellipse(Punkty[LPoint].X - 3, Punkty[LPoint].Y - 3,
Punkty[LPoint].X + 3, Punkty[LPoint].Y + 3);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button4Click(Sender: TObject);
var punkty:TextFile; {linia:string;} x,y:real; ww:integer; nrlinii:integer;
begin
if not OpenDialog1.execute then exit;
nrlinii:=0;nPunktow:=0;
AssignFile(punkty,OpenDialog1.FileName);Reset(punkty);
while not eof(punkty) do
begin
{$i-}
inc(NrLinii);Readln(punkty,x,y);
{$i+} ww:=IOResult;
if ww<>0 then ShowMessage('Blad odczytu w linii '+IntToStr(NrLinii))
else begin inc(nPunktow);wielokat[npunktow].x:=x;wielokat[npunktow].y:=y;
DoMemo();
end;
end;
CloseFile(punkty);ShowMessage('Wczytano '+IntToStr(nPunktow)+' punktów.');
Ekstrama();
skala:=WyznaczSkale(xmin,ymin,xmax,ymax);
skalap:=skala;
Przelicz(xmin,ymin,xx1,yy1);
Przelicz(xmax,ymax,xx2,yy2);
zakresx:=xx2-xx1;
zakresy:=yy1-yy2;
zakresxp:=zakresx;
zakresyp:=zakresy;
wx:=round((Image1.Clientwidth-2*margines-zakresx)/2);
wy:=round((Image1.Clientheight-2*margines-zakresy)/2);
wxp:=wx;
wyp:=wy;
RysujWielokat();
end;
procedure TForm1.Button5Click(Sender: TObject);
Var
LPoint : integer;
begin
PierwszyPunkt := True;
if not ZnajdzOtoczke(Wielokat) then begin
ShowMessage('Zbyt mała liczba punktów (n<3)');
Exit;
end;
SetLength(Punkty, length(Punkty) + 1);
Punkty[High(Punkty)] := Punkty[0];
Image1.Canvas.Pen.Color := clred;
Image1.Canvas.Polyline(Punkty);
Image1.Canvas.Pen.Color := clblue;
for LPoint := 0 to High(Punkty) do
Image1.Canvas.Ellipse(Punkty[LPoint].X - 3, Punkty[LPoint].Y - 3,
Punkty[LPoint].X + 3, Punkty[LPoint].Y + 3);
end;
end.