|
in sus pana se afiseaza ThisPoint:2.Introduceti cea de a doua valoare si
|
səhifə | 15/16 | tarix | 03.01.2019 | ölçüsü | 1,42 Mb. | | #89992 |
| in sus pana se afiseaza ThisPoint:2.Introduceti cea de a doua valoare si
confirmati cu Apply.Apasati sageata pentru ThisPoint: 3 apoi introduceti
valoarea si confirmati cu Apply...etc.
Restul optiunilor sunt pentru personalizarea obiectului:culori,texte,
legenda,axe,fonturi,titluri etc.
Pentru setarea aspectului general si/sau pentru imprimarea datelor se
poate utiliza optiunea General.
Setati toate optiunile dorite,apoi tastati F9 si executati obiectul.
-113- assembler
In Delphi se pot utiliza proceduri si functii scrise in assembler.La
fel ca si in Pascal,procedurile scrise in assembler vor fi incluse intre
cuvintele cheie "asm...end;" si vor contine doar tipurile de date accepta-
te de limbajul Assembler.Delphi accepta si setul de instructiuni 80386 si
80387,astfel incat se pot utiliza registrii de 32 de biti (EAX,EBX...etc.)
Ca rezultat,puterea de calcul este mult mai mare in Delphi decat in Pascal
iar posibilitatile de conversie a datelor sunt nelimitate.
In Delphi numerele hexazecimale se simbolizeaza prin adaugarea pre-
fixului $ (in locul sufixului h).Ca rezultat,nu se pot utiliza procedurile
scrise in assembler care apeleaza la intreruperi de DOS (prin instructiu-
nea INT).
In general,Delphi este un limbaj inalt structurat,conceput pentru a
conecta intre ele obiecte vizuale mari,module,baze de date sau chiar
programe intregi.Exista putine situatii in care limbajul assembler poate
fi util,dar exista si situatii in care este indispensabil (Exemple: pentru
a conecta doua unitati hardware incompatibile direct,pentru a schimba
dinamic formatul datelor,pentru a prelua date direct din procesor etc.).
Un exemplu clasic ar fi conectarea de dispozitive care utilizeaza formate
diferite (16 si 32 de biti).
Procedurile scrise in assembler nu accepta orice format al datelor(de
exemplu nu accepta tipul "variant").Pentru a utiliza astfel de date,este
necesara o conversie la un tip de data acceptabil:
EXEMPLU: (vezi si Prj108)
Salvati o fila noua si proiectul in Prj108.Adaugati un buton,trei campuri
edit si doua TLabel.In primele doua TEdit se vor introduce valori numerice
iar in cel de al treilea se va afisa rezultatul inmultirii.TLabel se vor
utiliza pentru semnele X si =.Pentru operatia de inmultire,sa va atribui
butonului urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x,y,z: variant;
a,b,c: double;
d: integer;
begin
x:=Edit1.Text;
Val(x,a,d);
y:=Edit2.Text;
Val(y,b,d);
asm
FLD a
FMUL b
FST c
end;
z:=c;
Edit3.Text:=z;
end;
Tastati F9 si executati aplicatia.In Delphi,aceeasi operatie se putea
codifica direct z:=x*y.In assembler,procesorul 80387 nu accepta decat
tipul double,astfel incat tipul variant trebuie convertit inainte de a
fi incarcat in registrul ST.
Se pot utiliza proceduri in assembler pentru a simplifica diverse
operatii matematice (dar atentie maxima la formatul datelor).
-114-
Exista situatii in care datele arhivate intr-o baza de date mai veche
sunt in format de 16 biti,si doriti sa utilizati aceste date cu un pro-
gram modern care opereaza pe 32 de biti.Pentru conversia simpla din word
in dword se poate utiliza instructiunea CWD.
EXEMPLU: (vezi si Prj109)
Salvati o fila noua si proiectul in Prj109.Adaugati un camp TEdit,un buton
si 3 campuri TLabel.In Label3.Caption introduceti textul: "Introduceti un
numar mai mare decat 65535"( adaugat deasupra campului TEdit).
Pentru buton atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender; tObject);
var a:word;
b:dword;
c,d:string;
nr:variant;
begin
nr:=Edit1.Text;
a:=nr;
asm
MOV AX,a
CWD
MOV b,EAX
end;
Str(a,c);
Str(b,d);
Label1.Caption:=c + ' (in format de 16 biti)';
Label2.Caption:=d + ' (in format de 32 de biti)';
end;
Tastati F9 si executati aplicatia.Formatul de 16 biti accepta tipul word,
adica numere cuprinse intre 0 si 65535.Pentru numerele cuprinse in acest
interval,valorile afisate vor fi egale,dar pentru valorile mai mari de
65535 tipul word va afisa diferenta fata de valoarea maxima.
Trebuie remarcat faptul,ca si atunci cand afiseaza aceeasi valoare,
cele doua numere a si b nu sunt egale,deoarece a este reprezentat pe 16
biti iar b este reprezentat pe 32 de biti.Ca rezultat,cele doua numere
nu pot fi superpozabile si nu pot utiliza aceeasi registri (a poate utili-
za registrul AX in timp ce b trebuie sa utilizeze registrul EAX).
Aceasta deosebire este esentiala atunci cand este implementata la
nivel de hardware (de exemplu centrale telefonice pe 16 sau 32 de biti).
Se pot utiliza proceduri editate in assembler si pentru a opera asupra
unor date arhivate in structuri,cu conditia ca datele apelate sa fie in
format acceptabil.In aceste situatii,se vor utiliza conventiile de apel
obisnuite (se utilizeaza punctul pentru a apela membrul unei structuri.
De exemplu,pentru a desena un paralelipiped dreptunghic cu ajutorul
functiei Rectangle(),coordonatele trebuiesc precizate prin valori de tip
integer.Pentru arhivarea acestor valori se pot utiliza structuri de tip
TPoint sau TRect.Valorile din aceste structuri se pot apela direct si
din interiorul unei proceduri editate in assemmbler cu ajutorul unei
expresii de genul: TRect.TPoint.Valoarea
Acest gen de operatii este extrem de util,mai ales atunci cand se
lucreaza cu structuri mari de date de tip matriceal (bi-tridimensionale),
sau cand se extrage o valoare numerica simpla dintr-o structura complexa.
-115-
EXEMPLU: (vezi si Prj110)
Salvati o fila noua si proiectul in Prj110.
In portiunea de interfata,adaugati doua tipuri de data de tip "record"
astfel: ( imediat dupa type TForm1 = class(TForm)...public end; )
type TPoint = record
x,y: Integer;
end;
type TRect = record
a,b: TPoint;
end;
Apoi adaugati urmatoarea variabila (dupa Form1:TForm1) : var R:TRect.
Acum aplicatia va contine o variabila de tip TRect,care este formata din
doua variabile de tip TPoint.Rezultatul este o structura in care cei
patru membri pot fi referiti prin: R.A.X si R.A.Y / R.B.X si R.B.Y
Pentru a opera cu aceasta structura,adaugati un buton si urmatoarea pro-
cedura OnClick:
procedure TForm1.Button1Click(Sender: tObject);
var n,m:integer;
begin
Randomize;
for n:=1 to 10 do
begin
R.A.X:=1;
R.A.Y:=1;
m:=n*30;
asm
MOV EAX,E.A.X
ADD EAX,m
MOV R.B.X,EAX
MOV EDX,R.A.Y
ADD EDX,m
MOV R.B.Y,EDX
end;
Form1.Canvas.Brush.Color:=RGB(Random(255),100,Random(255));
Form1.Canvas.Rectangle(R.A.X,R.A.Y,R.B.X,R.B.Y);
sleep(1000);
end;
Exit;
end;
Tastati F9 si executati aplicatia,apoi apasati butonul de cateva ori.
Functia Random() va genera o culoare aleatorie pentru fiecare pas al
buclei,iar procedura in assembler va incrementa valorile coltului din
dreapta jos al patrulaterului.
Exemplul prezinta simplist modul de operare intr-o structura matriceala
formata din patru elemente.Puteti incerca sa preluati sau sa actualizati
date numerice in si din structuri complexe,tridimensionale.De exemplu,
puteti incerca sa realizati un filtru matriceal pentru date preluate
de la o placa I/O (cu ajutorul instructiunilor IN si OUT ).
In rezumat,limbajul assembler poate fi utilizat pentru editarea de
functii noi,sau pentru a executa operatii care nu sunt implementate prin
functiile Delphi.Se pot edita obiecte cu metode definite in assembler.
-116- Grafica
In Delphi exista trei modalitati de a afisa datele sub forma de repre-
zentari grafice:
1.-se pot utiliza desene si imagini digitale realizate anterior si
prezentate cu ajutorul unor obiecte specializate (TImage...etc.)
2.-se pot realiza desene si imagini BitMap in etapa de desing,iar apoi
se prezinta aceste date in timpul executiei programului.
3.-desenele si graficele se realizeaza direct in timpul executiei
Prima modalitate a fost deja prezentata impreuna cu obiectele specifice.
Pentru cea de a doua modalitate,se va utiliza din Form proprietatea Canvas
impreuna cu functiile grafice de tip GDI(Graphic Device Interface).Canvas
este de fapt un obiect independent,cu proprietati si metode proprii.
Acest obiect prezinta o serie de avantaje: nu mai este necesara preci-
zarea contextului de dispozitiv grafic si nici codul intern de manipulare
(handle) a datelor,deoarece Canvas gestioneaza singur atat memoria cat si
procesarea mesajelor Windows (prin care comunica cu restul obiectelor din
interfata).
Referitor la realizarea de imagini grafice se utilizeaza doi termeni:
"drawing" si "painting".Drawing (desenarea) este termenul utilizat atunci
cand se creaza un element grafic unic(linie,poligon etc.).Paint(imaginea)
se utilizeaza pentru a descrie intregul obiect grafic,care poate contine
unul sau mai multe elemente grafice izolate.Actiunea Paint actualizeaza
datele iar evenimentul OnPaint este apelat ori de cate ori a intervenit
o actiune de actualizare a datelor din obiect.
Obiectul Canvas are patru proprietati principale: Pen(penita grafica),
Brush(pensula pentru colorare),Font(caracterele utilizate pentru editarea
textului) si Pixels(o arie in care imaginea poate fi precizata pixel cu
pixel).Metodele obiectului Canvas descriu desene si imagini grafice spe-
cializate(Arc,Ellipse,LineTo,Pie,Polygon,Rectangle..etc.) sau determina
actiunile si inactiunile obiectului(Create,Destroy,FillRect,FloodFill,
Lock,Unlock).
EXEMPLU: (vezi si Prj111)
Salvati o fila noua si proiectul in Prj111.Pentru Form1 alegeti din Events
proprietatea OnMouseMove si adaugati urmatoarea procedura:
procedure TForm1.FormMouseMove(Sender: TObject;Shift: TShiftState;
X,Y: Integer);
begin
Form1.Canvas.Pen.Color:=clRed;
Form1.Canvas.Pen.Width:=5;
Form1.Canvas.Brush.Color:=clYellow;
Form1.Canvas.Ellipse(X-15,Y-15,X+15,Y+15);
end;
Tastati F9 si executati aplicatia.Deplasati indicatorul mouse in inte-
riorul ariei Form1 (fara click).
Observati ca din Canvas am utilizat Pen pentru a preciza culoarea si
grosimea penitei si Brush pentru a specifica o culoare de umplere.Metoda
Ellipse deseneaza direct obiectul cerut,la pozitia precizata cu ajutorul
coordonatelor preluate de la dispozitivul mouse.Pentru a realiza aceleasi
operatii in Pascal,ar fi necesare mult mai multe linii de cod.Daca doriti
puteti schimba culorile,puteti utiliza patrulatere in loc de cercuri sau
puteti programa diverse artificii grafice prin care sa semnalati pozitia
cursorului in interiorul ariei Form1.
-117-
Pozitia indicatorului mouse poate fi semnalizata si cu ajutorul unei
imagini de tip Bitmap realizata anterior (puteti utiliza o poza digitala).
EXEMPLU: (vezi si Prj112);
Salvati o fila noua si proiectul in Prj112.Adaugati un obiect TImage si
utilizati Picture pentru a incarca o imagine .bmp(de exemplu din Images
alegeti Icons/Earth).Apoi setati proprietatea Visible=False.
Din Form1 alegeti evenimentul OnMouseDown si adaugati urmatoarea procedura
procedure TForm1.FormMouseDown(Sender: TObject;Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
Image1.Top:=y-Round(Image1.Height/2);
Image1.Left:=x-Round(Image1.Width/2);
Image1.Visible:=True;
end;
Tastati F9 si executati aplicatia.La fiecare click de mouse se va afisa
imaginea incarcata in Image1.Picture.
Pentru prezentarea imaginilor grafice se pot utiliza toate nuantele
de culoare,sau se pot utiliza efecte de animatie,realizate prin operatii
succesive cu interval de executie foarte scurt.O aplicatie de acest gen
poate prezenta destul de spectaculos domeniul de reprezentare al unor
functii liniare,scheme de distributie a fortelor intr-un sistem mecanic,
etapele de evolutie ale unui proces dinamic etc.
EXEMPLU: (vezi si Prj113)
Salvati o fila noua si proiectul in Prj113.Adaugati un buton si urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
for x:=0 to 255 do
begin
Canvas.Pen.Color:=RGB(200,250,x);
Canvas.MoveTo(1,x);
Canvas.LineTo(800,x);
Canvas.Pen.Color:=RGB(x,200,200);
Canvas.MoveTo(x+x*2,x);
Canvas.LineTo(2*x,x);
Canvas.Pen.Color:=RGB(250,x,100);
Canvas.MoveTo(800-2*x,x);
Canvas.LineTo(1,255-x);
Sleep(20);
end;
Tastati F9 si executati aplicatia.Apasati butonul de mai multe ori.
Pentru a edita un text oarecare la pozitia indicatorului mouse,puteti
utiliza evenimentul OnMouseDown si urmatoarea procedura:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TmouseButton;
Shift: TShiftState; X,Y: Integer);
begin
Canvas.Font.Color:=clBlue;
Canvas.Font.Size:=22;
Canvas.TextOut(x,y,'Text');
end; (vezi si Prj114).
-118-
Pentru a realiza un efect de animatie,se poate utiliza si obiectul spe-
cializat TShape.
EXEMPLU: (vezi si Prj115)
Salvati o fila noua si proiectul in Prj115.Adaugati un obiect TShape.
Setati forma,dimensiunea,culorile,apoi adaugati un buton si urmatoarea
procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x:integer;
begin
for x:=1 to 250 do
begin
Shape1.Top:=x;
Shape1.Left:=x;
Shape1.Repaint;
Sleep(20);
end;
Imaginile realizate cu TShape se pot combina cu cele realizate prin
Canvas,pentru a obtine diverse efecte grafice:
EXEMPLU: (vezi si Prj116)
Salvati o fila noua si proiectul in Prj16.Adaugati un obietc TShape si
fixati pozitia (left=136 top=64),dimensiunile,culorile etc.Apoi adaugati
un buton si urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=7;
Canvas.Brush.Style:=bsClear;
Canvas.Rectangle(100,100,300,200);
end;
Daca se foloseste pentru Brush stilul bsClear,obiectul va fi transparent.
Pentru a realiza diverse efecte grafice,in anumite situatii este nece-
sar sa incarcati diferite file de tip BitMap sau .JPG in timpul executiei.
Cea mai simpla modalitate este sa utilizati functia LoadFromFile:
EXEMPLU: (vezi si Prj117)
Salvati o fila noua si proiectul in Prj117.Adaugati un obiect TImage si
un buton.Pentru buton atribuiti urmatoarea procedura OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('desen117.bmp');
end;
Pentru ca sa nu aveti dificultati create de interpretarea caii de acces
la fisier,cel mai simplu este daca fila .BMP care urmeaza sa fie incarcata
este in acelasi director cu fila .EXE.In general,este bine ca filele de
resurse sa fie cat mai usor accesibile(filele .JPG pot fi afisate cu
obiectul TJPEGImage,definit in unitatea jpeg).
Exista un numar foarte mare de procedee tehnice prin care se pot
obtine efecte vizuale extrem de complexe(efecte speciale).Pentru scopuri
banale,este bine sa utilizati fie obiectul dedicat,fie solutia care ocupa
cea mai putina memorie.Solutiile laborioase incarca procesorul si unitatea
de memorie cu operatii inutile.Pentru programarea jocurilor exista pro-
grame specializate (se poate utiliza si Delphi,cu rezultate foarte bune).
-119- Drag and Drop
Una dintre cele mai spectaculoase facilitati oferite de sistemul de
operare Windows poarta numele de "Drag and Drop" si consta din posibili-
tatea de a trage un obiect peste altul,pentru a transmite obiectului
tinta o serie de date sau de proprietati.Exemplul clasic este atunci
cand trageti o fila intr-un fisier,pentru a fi arhivata.
Pentru a realiza acest gen de interactiune grafica,Windows utilizeaza
un set intreg de mesaje si un grup de proceduri specifice.In Delphi,
aceste operatii sunt simplificate de faptul ca programatorul nu trebuie
sa tina evidenta mesajelor Windows (Delphi organizeaza toate mesajele).
Operatia poate fi subimpartita in patru etape succesive:
1.Initierea operatiei de tragere (controlata prin proprietatea DragMode
si prin evenimentul BeginDrag).
2.Acceptarea obiectului suprapus (controlata prin evenimentul OnDragOver).
3.Eliberarea obiectului tras (conrolata prin evenimentul OnDragDrop).
4.Finalizarea operatiei (controlata prin evenimentul OnEndDrag).
Pentru fiecare dintre aceste etape,se poate redacta o procedura speci-
fica si se pot seta proprietatile obiectului,astfel incat la sfarsitul
operatiei sa se obtina rezultatul scontat.
Obiectele care pot beneficia de aceasta facilitate au in Object Inspec-
tor proprietatile DragCursor si DragMode.Pentru a simplifica operatia de
tragere,setati DragMode la valoarea dmAutomatic.
EXEMPLU: (vesi si Prj118)
Salvati o fila si proiectul in Prj118.Adaugati un camp TLabel si un buton.
Vom utiliza "drag and drop" pentru a transmite butonului textul din
Label1.Caption.
Selectati Label1 si setati Caption la textul dorit.Apoi setati proprieta-
tea DragMode=dmAutomatic.Din Events alegeti OnClick si adaugati urma-
toarea procedura:
procedure TForm1.Label1Click(Sender: TObject);
begin
BeginDrag(true);
EndDrag(true);
end;
Apoi alegati evenimentul OnDragEnd si adaugati urmatoarea procedura:
procedure TForm1.Label1EndDrag(Sender,Target: TObject;X,Y: Integer);
begin
Button1.Caption:=Label1.Caption;
end;
Tastati F9 si executati aplicatia.In timpul executiei executati un clic
pe campul Label si si apoi eliberati butonul.Observati ca indicatorul
mouse are alt cursor.Procedura din OnEndDrag se va executa indiferent de
pozitia in care eliberati cursorul,deoarece nu a fost fixata nici o
restrictie (implicit toate obiectele au proprietatea Accept=True).
Acceasi operatie putea fi efectuata si direct,dar prin initierea unui
proces de "drag and drop",Windows va aloca pentru operatie un spatiu
suplimentar de memorie,va transmite un set intreg de mesaje si va activa
o serie intrega de functii si proceduri care pot fi apelate pentru a
obtine diferite efecte,pentru a executa mai multe operatii simultan,
Dostları ilə paylaş: |
|
|