Titlul documentului


in sus pana se afiseaza ThisPoint:2.Introduceti cea de a doua valoare si



Yüklə 1,42 Mb.
səhifə15/16
tarix03.01.2019
ölçüsü1,42 Mb.
#89992
1   ...   8   9   10   11   12   13   14   15   16

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,

Yüklə 1,42 Mb.

Dostları ilə paylaş:
1   ...   8   9   10   11   12   13   14   15   16




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin