BluePink BluePink
XHost
Servere virtuale de la 20 eur / luna. Servere dedicate de la 100 eur / luna - servicii de administrare si monitorizare incluse. Colocare servere si echipamente de la 75 eur / luna. Pentru detalii accesati site-ul BluePink.

Delphi - scurta prezentare

 Cu ajutorul mediului Delphi se pot dezvolta aplicatii complexe intr‑un timp scurt, indiferent de experienta pe care o are programatorul.

Inceputul este intotdeauna partea cea mai grea la invätarea unui nou instrument de dezvoltare software. Totusi, in Delphi nu trebuie decät cäteva minute pentru crearea unei aplicatii. In continuare vom prezenta principalele caracteristici ale mediului vizual de programare Delphi.

Cåi de migrare

Fiecare nouä versiune de Delphi a märit complexitatea produsului. Din cauza modificärilor aduse acestuia, unele aplicatii si componente mai vechi trebuie så fie revizuite inainte de a putea fi compilate si folosite in Delphi.

Totusi, in majoritatea cazurilor, aceste modificäri sunt minore. Unul dintre motivele pentru care actualizarea aplicatiilor Delphi se face atåt de usor este faptul cä interfetele claselor de obiecte au föst imbunätätite, dar nu s‑au modificat semnificativ. Implementärile obiectelor au fost revizuite, in multe cazuri radical, dar, intrucåt interfetele claselor nu au fost afectate, programele care le folosesc trebuie doar sä fie recompilate in vederea unor dezvoltäri ulterioare folosind versiunile Delphi mai noi.

In definitiv, acesta este unul dintre avantajele promise de programarea onentatå pe obiect. Este pläcut sä gäsesti un exemplu in care o tehnologie promiså chiar exista

Pentru transformarea aplicatiilor Turbo Pascal si Borland Pascal in Delphi este necesarä insa o re‑dezvoltare pe scarå largå. De fapt, majoritatea aplicatiilor trebuie så fie rescrise de la zero, eventual folosind numai fragmente din codul original. Pe långå mediul vizual complet no«, biblioteca de componente vizuale (VCL ‑ Visual Component Library) din Delphi este incomparabil mai mare decåt bibliotecile din Borland Pascal, ObjectWindows si TurboVision. Din acest motiv, migrarea codului existent cåtre Delphi este extrem de dificilå pentru majoritatea aplicatiilor.

In schimb insa, aplicatiile DOS scrise in Turbo Pascal pot fi usor transformate in aplicatii de consolå Win32, folosind Delphi.

Din punct de vedere tehnic, Delphi 1 era 100% compatibil cu OWL si Turbo Pascal sub Windows (TPW). De fapt, OWL era livrat impreunå cu Delphi 1.0, astfel incåt dezvoltatorii så poatå recompila programele fårå nici o modificare. Totusi, conversia aplicatiilor OWL in programe Delphi care foloseau noile componente VCL insemna rescrierea aplicatiilor pornind de la zero, ceea ce majoritatea dezvoltatorilor chiar au fäcut..

Existå douå motive pentru care Borland a rupt legåtura cu modelul OWL. In primul ränd, acesta nu era potrivit pentru programarea componentelor vizuale, deoarece nu asigura suportul pentru proprietåti si metode ‑ ingrediente esentiale in modelul componentelor. In al doilea rånd, OWL avea nevoie de modificåri majore pentru trecerea la 32 de biti, asa cå Borland a luat decizia logicå, desi dureroaså, de a renunta la OWL si a introduce componentele vizuale si caracteristicile Object Pascal pentru acceptarea acestora.

Evolutia mediului Delphi. Caracteristici

Versiunea Delphi 1, lansatå aproape in acelasi timp cu sistemul de operare Wiridows 95, reprezintä primul mediu de programare vizualä care genereazä prin compilare cod nativ real. Desi limbajul Visual Basic (VB) exista de ceva timp, acesta producea cod care rula sub controlul unui interpretor. Delphi compileazä codul sursä direct in instructiuni de cod nativ.

Prima versiune de Delphi nu continea suportul pentru programarea pe 32 de biti, care a apårut abia in versiunea Delphi 2.

Principalele caracteristici ale versiunii Delphi 1 au fost påstrate, in mare måsurä nemodilicate, dar semnficativ imbunåtätite, pånä in versiunile actuale. Aceste caracteristici sunt:

% O paletå de componente vizuale care pot fi inserate in formulare ‑ Fiecare componenta este un obiect descris, din punct de vedere al programärii, ca o clasä Object Pascal.

% Un editor de proprietåti ‑ fereastra Object Inspector ‑ folositä pentru a atribui proprietätilor componentelor valori, cum ar fi explicatii, dimensiuni si culori.

% Un editor de evenimente ‑ selectat tot prin fereastra Object Inspector ‑ insereaza proceduri de tratare a evenimentelor pentru obiecte, cum ar fi o procedurä apelata atunci cänd utilizatorul executä clic pe un buton.

% Generarea automatä a codului ‑ Delphi genereazä declaratii de clase si variabile, precum si proceduri pentru tratarea evenimentelor. Pentru crearea unei noi aplicatii, se irisereaza obiecte in formulare, se selecteaza proprietåtile obiectelor, apoi se creaza proceduri de tratare a evenimentelor, in care se introduce codul aplicatiei. Generarea automatä a codului este una dintre cele mai atractive caracteristici ale mediului Delphi.

% Fisiere .exe in cod nativ ‑ Aplicatiile compilate contin intreaga bibliotecå de componente vizuale. Ca urmare, aplicatiile sunt destul de mari, dar foarte rapide si, de obicei, mai mici decät aplicatiile similare construite cu bibliotecile de clase C++, care pot produce fisiere executabile cu adevårat uriase. (Editorul de legäturi inteligent si limbajul de programare optimizat conduc in mod natural la un fisier de cod optimizat.) Foarte important este faptul cå, spre deosebire de VB, in timpul rularii nu este necesar un interpretor pentru folosirea aplicatiilor Delphi.

% Sfärsitul pointerilor (!) ‑ Pointerii nu au dispårut, sunt incä acceptati si folositi in Object Pascal. Dar, in majoritatea cazurilor, nu mai este nevoie sä fie folositi in mod explicit. Motivul principal este faptul cä, intr‑un mediu real de programare vizualä, gestionarea memoriei este realizatä de biblioteca de componente, nemaifiind responsabilitatea programatorului. Ca urmare, rareori este necesar så alocam memorie pentru obiecte si så folosim pointeri pentru a ne referi la ele. Obiectele sunt create automat atunci cånd sunt necesare si sunt referite prin reprezentärile vizuale. Rezultatul este cå pointerii sunt ascunsi in fundal, dar ii putem folosi, dacä avem nevoie de ei.

% Suport pentru controalele Visual Basic (VBX) ‑ In Delphi 1 nu se pot crea controale VBX, dar putem sä le folosim, impachetändu‑le in componente Delphi.

% Programare pentru baze de date folosind componente vizuale si BDE (Borland Database Engine) ‑ Posibilitatea de a scrie aplicatii complet functionale pentru baze de date a fost probabil factorul cheie in succesul uimitor al mediului Delphi.

CARACTERISTICI INTRODUSE IN DELPHI 2

Principala caracteristicå introduså in versiunea Delphi 2 este suportul peritru programarea pe 32 de biti. Alte noi caracteristici sunt:

% Siruri de caractere lungi si scurte ‑ care eliminå, in sfårsit, fantomaa din Borland Pascal -  sirul de 255 de caractere (de „lungime octet"). Tipu] original de sir de caractere exista inca, dar, avånd la dispozitie sirurile lungi, programatorii nu mai suut nevoiti så foloseascå nenumårate artificii pentru stocarea in memorie a unor obiecte text de lungime mare.

% Numere intregi pe 32 de biti ‑ ceea ce a distrus multe programe care se bazau pe tipul intreg cu lungime de 16 biti. Programatorii au descoperit valabilitatea avertismentelor de a nu se baza pe faptul cå dimensiunea tipurilor de date råmåne neschimbatå.

% Alocarea memoriei este limitatå numai de cantitatea de memorie disponibilå, care exprimä in multipli de megaocteti.

% Matrice uriase, indexate cu valori pe 32 de biti.

% Cod multifir (multithreaded).

% Suport complet pentru controalele Windows pe 32 de biti, cum ar fi schitele TreeView

% Suport imbunätätit pentru legarea si inglobarea obiectelor (OLE ‑ Object Linking and Embedding).

% Variante imbunätätite ale motorului pentru baze de date (Borland Database Engine) si ale legåturilor SQL.

Pentru modernizarea unei aplicatii care foloseste resurse pe 16 biti, trebuie sä o recompilam pentru ca editorul de legäturi pe 32 de biti sä construiascä fisierul de cod .exe final. De exemplu, dacä importam imagini bitmap pentru cursoare, folosim editorul de imagini (Image Editor) ca sä cream o nouä resursä pe 32 de biti, apoi legam imaginile obtinute cu aplicatia noasträ.

CARACTERISTICI INTRODUSE IN DELPHI 3

% Suport pentru pachete de cod – acestea permit mai multor aplicatii sa foloseasca aceleasi fisiere de cod. Principalul avantaj este ca nu este nevoie ca fiecare aplicatie compilatå så continå intreaga bibliotecå de componente vizuale (VCL), asa cum se intåmpla in cele douå versiuni anterioare. Totusi, folosirea pachetelor de cod inseamnå cå dezvoltatorii de componente trebuie så‑si revizuiascå produsele si så fumizeze utilizatorilor finali pachete pentru compilare si pentru rulare. Toate componentele Delphi sunt acum livrate ca pachete de cod.

% Numeroase imbunåtåtiri in biblioteca de componente vizuale (VCL) ‑ inclusiv noi componente Win32. De asemenea, sunt livrate componente sofisticate pentru rapoarte si diagrame, produse de terti. Acestea nu sunt exemple de componente, fiind complet acceptate in aplicatii (de fapt, sunt biblioteci intregi de componente).

% Suport complet pentru controalele ActiveX, inclusiv pentru crearea acestora ‑ Delphi 3 permite folosirea limbajului nativ pentru interfete, ceea ce simplificå folosirea si crearea obiectelor COM in codul Delphi.

% Posibilitatea de compilare a unitåtilor in fisiere de cod obiect (.obj) ‑ o schimbare indelung solicitatå, incå din vremurile folosirii limbajului Turbo Pascal. Aceasta permite importarea modulelor Delphi compilate in alte sisteme de dezvoltare, cum ar fi C++.

% Componente Internet si intranet in variantele profesionalå si client‑server. Aceste componente realizeazå comunicarea cu un server Web si simplificä dezvoltarea aplicatiilor Web, deoarece programatorii nu mai sunt nevoiti så gestioneze protocoalele de comunicatii HTML.

% Suport pentru tipul de siruri WideString.

% Versiuni revizuite ale motorului pentru baze de date (Borland Database Engine) si ale legåturilor SQL, pentru imbunåtåtirea dezvoltårii aplicatiilor pentru baze de date.

% Distribuire in 3 variante: standard, profesional si client‑server. Majoritatea componentelor si instrumentelor de dezvoltare pentru bazele de date sunt livrate in toate variantele. Totusi, varianta client‑server oferå instrumente pentru construirea aplicatiilor de baze de date multistrat (adicä pe mai multe calculatoare), folosind servere SQL la distantå si retele locale. Editia profesionalå oferä posibilitåti de construire a aplicatiilor ­client in retele locale si permite accesul la bazele de date ODBC prin intermediul driverelor produse de terti.

De fapt, universul Delphi are si a patra dimensiune. Dacå ne permite buzunarul, putem så cumpäram editia Delphi Enterprise, care include si alte instrumente, pentru conectarea aplicatiilor Delphi la sursele de date de la nivelul corporatiei, folosind tehnologia Borland Entera. Pretul? Mai bine nu intrebam...

CARACTERISTICI INTRODUSE IN DELPHI 4

% Object Pascal Language Extensions ‑ Extensiile de limbaj aduc cåteva modificäri limbajului Object Pascal, dar acestea sunt de nivel avansat si este improbabil sä impiedice functionarea codului existent. Unele modificäri fac ca limbajul Object Pascal sä semene mai mult cu C++ si sunt utile mai ales celor care doresc sä ofere produse in versiuni Delphi si C++ Builder. Noile caracteristici ale limbajului includ matrice dinamice, supradefinirea metodelor, parametri prestabiliti, un nou tip intreg pe 64 de biti, modificäri in tipul de date Pascal Real si modificäri minore in apelurile si parametrii funetiilor Windows API.

% Administratorul de proiecte (Project Manager) ‑ Vechiul administrator de proiecte a fost complet revizuit, fiind transformat intr‑un model cu organizare ierarhicä, ceea ce permite urmärirea mai usoarä a formularelor si fisierelor unui proiect. De asemenea, acum este posibilä crearea unor grupuri de proiecte, ceea ce poate automatiza compilarea proiectelor multiple. Un grup de proiecte este stocat sub forma unui fisier de text Make. Acest fisier poate fi folosit pentru compilarea proiectelor din linia de comandä DOS, cu ajutorul programului utilitar Make.

% Module Explorer ‑ Editorul de cod Delphi este de douä ori mai inteligent in noua versiune. Fereastra Module Explorer, care in mod normal este afisatå in stänga ferestrei de editare a codului, dar poate fi redatä si ca o fereasträ separatå, simplificä operatiile de cäutare in fisierul sursä Pascal. Fereastra Module Explorer prezintä toate declaratiile din unitatea respectivä si poate fi folositä pentru localizarea diferitelor secvente de program din text. De exemplu, avem la dispozitie o metodä foarte simplä de a trece de la declaratia unei metode la implementarea acesteia.

% Ferestre de instrumente ancorabile ‑ Ferestrele care contin instrumente sunt ancorabile. De exemplu, putem sä luam o fereasträ cu instrumente sau o altä fereasträ, cum ar fi Module Explorer, si sä o afisam ca fereasträ independentä. De asemenea, putem sa folosim aceasta posibilitate pentru a crea ferestre de instrument cu mai multe pagini. De exemplu, in loc så afisam separat ferestrele Breakpoints si Watches, puteti så le ancoram intr‑o singurå fereastrå si så le afisam alternativ prin selectarea etichetelor de pagini . Executam clic si tragem fereastra pe care vrem så o ancoram. Pentru ancorarea unei ferestre, o tragem pånå la marginea unei alte ferestre, cum ar fi editorul de cod. Continuam sa tragem pånå cånd chenarul ferestrei isi schimbå dimensiunea, apoi eliberam butonul mouse‑ului ca så finalizam operatia de ancorare.

% Depanare imbunåtåtitå ‑ Trei elemente oferä servicii imbunåtåtite de depanare:

bullet

Fereastra CPU afiseazå starea la nivel scåzut a unei aplicatii, inclusiv valorile registrilor si indicatoarele CPU. Putem de asemenea så examinam si så depanam aplicatia la nivelul limbajului de asamblare.

bullet

Fereastra Modules afiseazå modulele unei aplicatii, o listå a fisierelor surså care au fost compilate pentru construirea modulului si o listå a simbolurilor globale si a punctelor de intrare.

bullet

Fereastra de evenimente (Event) afiseazå mesaje pentru controlul procesului, mesaje pentru punctele de intrerupere, mesaje Output‑Debug‑String si mesaje de fereastrå. In plus, Delphi 4 oferå elemente avansate de depanare, cum ar fi depanarea la distantå, depanarea multiproces, depanarea in mai multe limbaje (cross‑language) si depanarea obiectelor CORBA.

% Imbunåtåtiri VCL ‑ In Delphi 4 sunt disponibile o serie de noi componente si imbunåtåtiri VCL. Acestea includ liste de comenzi pentru legarea råspunsurilor la obiecte similare din punct de vedere functional, cum ar fi meniurile si butoanele, suport pentru servicii sub Windows NT, componente TControl si TWinControl ancorabile pentru crearea ferestrelor si barelor cu instrumente ancorabile si alte modificåri. Varianta client‑server include o nouå componentå TQueryClientDataSet si alte componente.

% Programarea aplicatiilor pentru baze de date multistrat ‑ O serie de noi componente imbunåtåtesc programarea bazelor de date client‑server. Conexiunile sunt imbunåtåtite prin unitatea mconnect, iar serverul de socluri (socket server) acceptå apeluri inverse (callbacks ). Serverul de socluri poate rula si ca serviciu Windows NT. Alte caracteristici avansate pentru baze de date includ suportul pentru tipurile abstracte de date Oracle8 (Abstract Data Types ‑ADT), cum ar fi cåmpurile din tabele.

% Imbunåtåtiri pentru programarea bazelor de date ‑ Putem så parcurgem bazele de date si så modificam tabelele cu multå usurintå folosind comenzile pop‑up ale componentei TTable pentru seturi de date. Executam clic cu butonul din dreapta pe un obiect TTable ca sä obtinem acces la editorul de cåmpuri si ca så stergem, så redenumim, sau så actualizam structura tabelelor. De asemenea, din acest meniu pop‑up putem så rulam programul Database Explorer. Dacå tabela este conectatå la o surså de date, in Explorer sunt afisate tabela si informatiile acesteia.

% Imbunåtåtiri ActiveX ‑ Suportul Delphi pentru controale ActiveX este imbunätätit, permitånd includerea interfetelor de date Visual Basic si crearea controalelor ActiveX non‑vizuale.

Prezentarea proiectului

Aplicatia se numeste "Calculator 1.0" si demonstreaza posibilitatea realizarii unui program pentru calcule uzuale cu unul sau doua numere, folosind mediul de programare Delphi.

Numerele folosite pot fi intregi sau reale. Calculele cu un singur numar sunt:

bullet patratul unui numar
bullet radicalul unui numar
bullet inversul
bullet exponentiala
bullet logaritmul natural
bullet logaritmiul zecimal
bullet sinusul
bullet cosinusul
bullet tangenta
bullet arctangenta
bullet factorialul (pentru numere naturale)
bullet decizia daca numarul este prim (pentru numere naturale)
bullet afisarea divizorilor proprii ai numarului (pentru numere naturale)
bullet descompunerea numarului in factori primi
bullet conversia numarului (natural) din baza 10 in bazele 2, 3, 4, 5, 6, 7, 8, 9 sau 16

Calculele cu doua numere sunt:

bullet adunarea
bullet scaderea
bullet inmultirea
bullet impartirea
bullet ridicarea la putere
bullet cel mai mare divizor comun (pentru numere naturale)
bullet cel mai mic multiplu comun (pentru numere naturale)
bullet combinari de x luate cate y (pentru numere naturale)

Rezultatele calculelor apar in casetele de editare din figura prin simpla modificare a lui x sau y (folosind casetele numerice corespunzatoare).

Un mod putin diferit de lucru apare pentru numere reale: se  completeaza mai intai cele doua casete de editare reprezentand valorile lui x si y, apoi se apasa butonul "Calculeaza"

In plus fata de calculatorul clasic de buzunar, programul rezolva urmatoarele probleme:

bullet - decide daca un numar este prim sau nu
bullet - afiseaza divizorii unui numar
bullet - descompune un numar in factori primi
bullet - calculeaza c.m.m.d.c si c.m.m.m.c a doua numere
bullet - calculeaza combinari de n luate cate k

Apasand butonul "Wincalc" se poate lansa programul Calculator din grupul Accessories din Windows XP, pentru comparatie sau pentru suplinirea anumitor nevoi de calcul.

Meniul programului permite: optarea pentru calculul cu numere intregi sau reale, lansarea programului Windows Calculator si afisarea de informatii despre program si autor.

Formularul programului in faza de proiectare, este urmatorul:

Datorita faptului ca sunt afisate simultan rezultatele tuturor calculelor, s-au impus anumite limitari asupra numerelor folosite. Astfel, numerele naturale folosite sunt din intervalul [0, 1500]. De asemenea, pentru a evita aparitia unor erori la conversia in baza 2, numarul folosit este in intervalul [1, 1020].

Folosind tipul de date extended, a putut fi calculat corect factorialul (si implicit combinarile) prin  algoritmul clasic bazat pe inmultiri repetate, pentru numere mai  mari decat 1000 - fara a folosi vectori pentru simularea operatiilor cu numere mari.

In figura de mai jos este prezentata bara de meniu in timpul proiectarii - fereastra aparuta prin dublu clic in formular pe obiectul MainMenu.

Conversia lui x din baza 10 in bazele 2, 3, 4, 5, 6, 7, 8, 9 si 16 se face cu ajutorul functiei conversie. Pentru baza 16, ea consta in simpla apelare a functiei speciale InttoHex. Pentru celelalte baze, s-a folosit algoritmul clasic bazat pe impartirea repetata a numarului n la baza b (vezi declaratia functiei conversie).

//conversie n din baza 10 in baza b=2,3,...,9 sau 16 si reprezentare ca string
function conversie(n:longint;b:integer):string;
var nb,p:longint;
begin
case b of
16: conversie:=inttohex(n,0);
2,3,4,5,6,7,8,9: begin
nb:=0;p:=1;
while n<>0 do begin
nb:=nb+(n mod b)*p;
p:=p*10;
n:=n div b;
end;
conversie:=inttostr(nb);
end
else conversie:='~~~';
end;//case}
end;

Pentru simplificarea programului, s-a preferat pentru calculul c.m.m.d.c, o varianta recursiva in locul uneia iterative, folosind functia cmmdc.

/cmmdc
function cmmdc(a,b:integer):integer;
begin
if a=b then cmmdc:=a
else if a>b then cmmdc:=cmmdc(a-b,b)
else cmmdc:=cmmdc(a,b-a);
end;

Pentru descompunerea in factori primi si afisarea acestora, s-a folosit urmatoarea secventa de cod:

//afisare factori primi
f_p_combobox.Clear; f_p_combobox.Text:='Factori primi';
if not checkbox1.Checked then begin
n:=spinedit1.value;
i:=2;
repeat
fm:=0;
while (n mod i=0) do begin
fm:=fm+1;
n:=n div i;
end;
if fm<>0 then f_p_combobox.Items.Add(inttostr(i)+' putere: '+inttostr(fm));
i:=i+1;
until n=1;
end;//if

Se observa ca secventa de mai sus este bazata pe impartirea repetata a numarului la divizorii sai primi, pana cand numarul devine egal cu 1.

Codul sursa al programului este urmatorul:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls, Buttons, Menus,unit2,
fmxutils; //ptr.executarea unui program extern

type
TForm1 = class(TForm)
SpinEdit1: TSpinEdit;
numLabel: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label12: TLabel;
SpinEdit2: TSpinEdit;
CheckBox1: TCheckBox;
Label13: TLabel;
Label14: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Label15: TLabel;
Edit14: TEdit;
Label16: TLabel;
Edit15: TEdit;
Label17: TLabel;
Edit16: TEdit;
Label18: TLabel;
Edit17: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label19: TLabel;
Edit18: TEdit;
Label11: TLabel;
Edit11: TEdit;
Bevel3: TBevel;
MainMenu1: TMainMenu;
parcmenu: TMenuItem;
fileexit: TMenuItem;
helpmenu: TMenuItem;
helpAbout: TMenuItem;
Label20: TLabel;
Label21: TLabel;
primEdit: TEdit;
ComboBox1: TComboBox;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Edit19: TEdit;
Edit20: TEdit;
Edit21: TEdit;
Label25: TLabel;
x_b_Edit: TEdit;
bazaComboBox: TComboBox;
Bevel2: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Edit5: TEdit;
wincalc: TMenuItem;
wincalcBitBtn: TBitBtn;
f_p_ComboBox: TComboBox;
calcul_reale: TMenuItem;
prez_program: TMenuItem;
procedure SpinEdit1Change(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Edit12KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure helpAboutClick(Sender: TObject);
procedure fileexitClick(Sender: TObject);
procedure BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure wincalcClick(Sender: TObject);
procedure calcul_realeClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
x,y:extended; //prt.calc. cu nr.reale
startup:boolean;
 
implementation
 

uses splashUnit;

{$R *.DFM}

//conversie n din baza 10 in baza b=2,3,...,9 sau 16 si reprezentare ca string
function conversie(n:longint;b:integer):string;
var nb,p:longint;
begin
case b of
16: conversie:=inttohex(n,0);
2,3,4,5,6,7,8,9: begin
nb:=0;p:=1;
while n<>0 do begin
nb:=nb+(n mod b)*p;
p:=p*10;
n:=n div b;
end;
conversie:=inttostr(nb);
end
else conversie:='~~~';
end;//case}
end;

//cmmdc
function cmmdc(a,b:integer):integer;
begin
if a=b then cmmdc:=a
else if a>b then cmmdc:=cmmdc(a-b,b)
else cmmdc:=cmmdc(a,b-a);
end;

//factorial
function factorial(x:extended):extended;
var xx,fact:extended;
begin
if (x=0)or(x=1)then factorial:=1;
fact:=1;
if (x>1)and(x=int(x)) then begin
xx:=1;
while xx<=x do begin
fact:=fact*xx;
xx:=xx+1;
end;
end;
factorial:=fact;
end;

//realizeaza calculele si afiseaza rezultatele la modificarea lui x sau y
procedure TForm1.SpinEdit1Change(Sender: TObject);
var x,y:extended;
i,n,k,a,b:longint;//pentru verificare x prim, conversie, cmmdc
prim:boolean;//pentru verificare x prim
fm:integer;//factor de multiplicitate - pentru descompunere in factori primi
begin
if checkbox1.Checked then
begin
primedit.Visible:=false; label21.Visible:=false; combobox1.Visible:=false;
end;

//preluare x,y
if not checkbox1.Checked
then
begin
with spinedit1 do begin
if (Text='')or(Value=0) then spinedit1.Value:=1;
if (value>1751) then value:=1751;
end;
with spinedit2 do
if (value>1500) then value:=1500;
x:=spinedit1.Value;
y:=spinedit2.Value;
end
else
begin
x:=strtofloat(edit12.text);
y:=strtofloat(edit13.text);
end;

//radicalul
if x>=0
then
edit1.text:=floattostr(sqrt(x))
else
edit1.text:='nedefinit';

//patratul
edit2.text:=floattostr(x*x);

//puterea
if x<=0
then edit3.text:='nedefinit'
else edit3.text:=floattostr(exp(y*ln(x)));

//inversul
if x=0
then edit4.text:='operatie fara sens'
else edit4.text:=floattostr(1/x);

//exponentiala
edit5.text:=floattostr(exp(x));

//logaritmul
if x<=0
then edit6.text:='nedefinit'
else edit6.text:=floattostr(ln(x));

//logaritmul zecimal
if x<=0
then edit7.text:='nedefinit'
else edit7.text:=floattostr(ln(x)/ln(10));

//sinusul
edit8.text:=floattostr(sin(x));

//cosinusul
edit9.text:=floattostr(cos(x));

//tangenta
if cos(x)<>0
then edit10.text:=floattostr(sin(x)/cos(x))
else edit10.text:='nedefinit';

//arctangenta
edit18.text:=floattostr(arctan(x));

//factorialul
if (x<0)or not(x=int(x))or checkbox1.Checked then
edit11.text:='nedefinit'
else edit11.text:=floattostr(factorial(x));

//adunare, scadere, inmultire, impartire
edit14.text:=floattostr(x+y);
edit15.text:=floattostr(x-y);
edit16.text:=floattostr(x*y);
if y=0
then edit17.text:='operatie fara sens'
else edit17.text:=floattostr(x/y);

//verficare daca x este prim si in caz afirmativ afisarea divizorilor
n:=spinEdit1.value;
if (n<0) or (n>2000000000) then
begin
primedit.Visible:=false; label21.Visible:=false; combobox1.Visible:=false;
end;
primEdit.text:='';
combobox1.Clear; combobox1.text:='Divizori proprii:';
k:=-1;
if (n>0) and (n<=2000000000) then
begin
prim:=true;
for i:=2 to n-1 do
if n mod i=0 then
begin
prim:=false;
k:=k+1;
combobox1.items[k]:=inttostr(i);
end;
if prim then
begin
primEdit.color:=clyellow;
primEdit.text:='da';
end
else
begin
primEdit.color:=clwhite;
primEdit.text:='nu';
end;
end
else
begin
primEdit.text:='';
end;

//conversie x in baza b si afisare
with spinedit1 do
if (strtoint(bazacombobox.Text)=2) and (spinedit1.Value>1020)
then x_b_edit.Text:='~~~'
else x_b_edit.Text:=conversie(value,strtoint(bazacombobox.text));

//cmmdc si cmmmc
a:=spinedit1.Value; b:=spinedit2.Value;
if (a>0) and (b>0) then begin
edit19.Text:=inttostr(cmmdc(a,b));
edit20.Text:=inttostr(a*b div cmmdc(a,b));
end;

//combinari de x luate cate y
if (x<=1500)and(y<=1500)and(x>=y)and not checkbox1.Checked then
edit21.Text:=floattostr(factorial(x)/(factorial(y)*factorial(x-y)))
else edit21.Text:='~~~';

//afisare factori primi
f_p_combobox.Clear; f_p_combobox.Text:='Factori primi';
if not checkbox1.Checked then begin
n:=spinedit1.value;
i:=2;
repeat
fm:=0;
while (n mod i=0) do begin
fm:=fm+1;
n:=n div i;
end;
if fm<>0 then f_p_combobox.Items.Add(inttostr(i)+' putere: '+inttostr(fm));
i:=i+1;
until n=1;
end;//if

end;

//stabileste informatiile afisate daca se lucreaza cu nr. intregi sau reale
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.Checked=true //se lucreaza cu reale
then
begin
primedit.Visible:=false; label21.Visible:=false; combobox1.Visible:=false;
edit12.Visible:=true;
edit13.Visible:=true;
label13.Enabled:=true;
label14.Enabled:=true;
numlabel.Enabled:=false;
label12.Enabled:=false;
spinedit1.Visible:=false;
spinedit2.Visible:=false;
bitbtn1.Enabled:=true;
label25.Visible:=false; bazacombobox.Visible:=false;
x_b_edit.Visible:=false; label22.Visible:=false; label23.Visible:=false;
label24.Visible:=false; edit19.Visible:=false; edit20.Visible:=false;
edit21.Visible:=false; f_p_combobox.Visible:=false;
calcul_reale.Checked:=true;
end
else //se lucreaza cu intregi
begin
primedit.Visible:=true; label21.Visible:=true; combobox1.Visible:=true;
edit12.Visible:=false;
edit13.Visible:=false;
label13.Enabled:=false;
label14.Enabled:=false;
numlabel.Enabled:=true;
label12.Enabled:=true;
spinedit1.Visible:=true;
spinedit2.Visible:=true;
bitbtn1.Enabled:=false;
label25.Visible:=true; bazacombobox.Visible:=true;
x_b_edit.Visible:=true; label22.Visible:=true; label23.Visible:=true;
label24.Visible:=true; edit19.Visible:=true; edit20.Visible:=true;
edit21.Visible:=true; f_p_combobox.Visible:=true;
calcul_reale.Checked:=false;
end
end;

//simuleaza apasarea butonului Calculeaza la apasarea tastelor Enter si Space
procedure TForm1.Edit12KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key in [vk_return,vk_space] then spinedit1change(sender);
end;

procedure TForm1.helpAboutClick(Sender: TObject);
begin
aboutbox.ShowModal;
end;

procedure TForm1.fileexitClick(Sender: TObject);
begin
close;
end;

//ascunde informatiile despre x prim cand se face click pe acest buton
procedure TForm1.BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
primedit.Visible:=false; label21.Visible:=false; combobox1.Visible:=false;
end;

//executa programul calc.exe din dosarul aplicatiei
procedure TForm1.wincalcClick(Sender: TObject);
var s:string;
h:thandle;
begin
s := ExtractFilePath(Application.ExeName) + 'calc.exe';
h:=executefile(s,'','',sw_shownormal);
end;

procedure TForm1.calcul_realeClick(Sender: TObject);
begin
calcul_reale.Checked:=not calcul_reale.Checked;
checkbox1.Checked:=not checkbox1.Checked;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
spinedit1change(sender);
primedit.Visible:=true; label21.Visible:=true; combobox1.Visible:=true;
if Startup then
begin
Startup := False;
Splashform.Show;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
startup:=true;
end;

end.

Ecranul introductiv (splash) care apare inainte de lansarea programului:

Formularul pentru ecranul introductiv se numeste SplashForm si are codul sursa in unitul SplashUnit de mai jos.

In acest formular exista un obiect Timer cu intervalul de 3 secunde, care inchide formularul cand este generat primul eveniment OnTimer  - vezi mai jos procedura TsplashForm.Timer1Timer .

unit splashUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, jpeg;

type
TsplashForm = class(TForm)
Timer1: TTimer;
Image1: TImage;
Label3: TLabel;
Label4: TLabel;
Label2: TLabel;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;

var
splashForm: TsplashForm;

implementation

{$R *.DFM}

procedure TsplashForm.Timer1Timer(Sender: TObject);
begin
close;
end;

procedure TsplashForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_space then close;
end;

end.

Informatiile despre autor sunt afisate in timpul rularii programului prin accesarea comenzii de meniu Informatii >Autor sau apasarea tastei F2. Ele sunt oferite de catre formularul AboutBox de mai jos.

Codul sursa al formularului este prezentat mai jos si este scris in intregime de catre Delphi prin generarea automata a codului, programatorul nefacand decat sa introduca obiectele in formular:

unit Unit2;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, jpeg;

type
TAboutBox = class(TForm)
Panel1: TPanel;
OKButton: TButton;
Comments: TLabel;
ProgramIcon: TImage;
Calculator: TLabel;
Version: TLabel;
Image1: TImage;
Copyright: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;

var
AboutBox: TAboutBox;

implementation

{$R *.DFM}

end.