Sempre facendo riferimento alla parte introduttiva storica di questo corso, abbiamo
visto che Delphi si basa su Object Pascal. Si tratta, come d'altronde il Pascal, di un
linguaggio compilato, fortemente tipizzato, che supporta la progettazione strutturata e
orientata agli oggetti. Offre un codice di facile lettura, una compilazione veloce e l'uso
di più file unit per la programmazione modulare. Object Pascal ha delle speciali
funzionalità che supportano la struttura a componenti e l'ambiente RAD di Delphi.
I programmi Delphi sono generalmente divisi in moduli di codice sorgente denominati unit.
Ogni programma inizia con una intestazione, che ne specifica il nome, la quale è seguita
da una clausola opzionale uses e da un blocco di dichiarazioni e di istruzioni. La
clausola uses elenca le unit che sono collegate nel programma; queste possono
essere condivise da programmi diversi ed hanno spesso proprie clausole uses. La
clausola uses fornisce al compilatore informazioni sulle dipendenze esistenti tra i
moduli. Dal momento che queste informazioni vengono memorizzate nei moduli stessi, i
programmi in Object Pascal non richiedono né makefile, né file header, né direttive
"include" per il preprocessore come per esempio nel C++.
Diamo un'occhiata alle estensioni utilizzate dal compilatore Delphi. Questo si aspetta
di trovare il codice sorgente in Pascal in di tre tipi:
- File sergente di unit, che terminano con l'estensione .PAS
- File progetto, che hanno come estensione .DPR
- File sorgente di package, che terminano con l'estensione .DPK
I file sorgente delle unit contengono la maggior parte del codice di un'applicazione.
Ogni applicazione Delphi ha un singolo file progetto e diversi file unit; il file progetto,
corrispondente al file "principale" nel Pascal tradizionale, organizza i file
unit in un'applicazione. Delphi mantiene automaticamente un file progetto per ciascuna
applicazione. I file sorgente dei packages sono simili ai file progetto, ma vengono usati
per costruire speciali librerie a collegamento dinamico, denominate package.
Esistono altri file utilizzati nella realizzazione di una applicazione Delphi che non
contengono codice Pascal. Questi file vengono di norma mantenuti automaticamente da
Delphi. Essi sono:
- I file from, terminano con l'estensione .DFM
- I file di risorse, che hanno come estensione .RES
- I file di opzioni di progetto, che terminano in .DOF
Esistono anche altri tipi di file utilizzati esclusivamente per le impostazioni
dell'ambiente di sviluppo come per esempio i file .DSK che contengono le impostazioni del
desktop dell'IDE.
I file .DFM sono dei file di risorse di Windows che contengono bitmap, stringhe e così
via. Ogni file form è la rappresentazione binaria della scheda Delphi corrispondente
generalmente ad una finestra o ad una finestra di dialogo di una applicazione Windows.
L'IDE di Delphi permette anche di modificare in maniera testuale il contenuto di questi
file; tranne in casi eccezionali, come il recupero di schede danneggiate a causa di
componenti malfunzionanti, non sia ha la necessità di intervenire direttamente in maniera
testuale su questo tipo di file. La gestione viene generalmente tenuta dai tool visuali di
Delphi. Ad ogni scheda è altresì associato un file .PAS contenente il codice Pascal che
si riferisce alla scheda in oggetto. Questo file contiene il codice degli eventi degli
oggetti nella scheda, le routines definite dall'utente per quella scheda, ecc. Per
impostazione predefinita questi file hanno lo stesso nome del file form.
I file di risorse sono file di risorse standard di Windows (.RES) per contenere la
bitmap per l'icona dell'applicazione.
Questo è quello che si ha prima di effettuare la compilazione del codice. Una volta
che il codice è stato compilato, troveremo dei nuovi file nella directory del progetto,
alcuni con lo stesso nome di quelli appena visti ma con estensioni differenti. Queste
sono:
- .DCU (Delphi Compiled Unit): sono le estensioni che il compilatore da alle unit
compilate che in seguito verranno linkate insieme nel file .EXE - .DLL (Dinamic Link Library): solo le estensioni che contraddistinguono una libreria a
collegamento dinamico; ovviamente questo tipo di estensione sarà disponibile qualora sia
stato compilato un progetto di libreria a collegamento dinamico. - .BPL (Borland Package Library): sono le estensioni delle librerie a collegamento
dinamico della borland ovvero i package; anche queste estensioni non saranno sempre
disponibili tranne se si effettua la compilazione di un progetto di package.
Diamo uno sguardo ad un semplice esempio, il tipico programmino "Hello
World!" che si è soliti realizzare in fase di apprendimento di un nuovo linguaggio.
Si tratta di una semplice applicazione per console che può essere compilato ed
eseguito dalla riga di comando.
Program Hello_World;
{$APPTYPE CONSOLE}
Var MessageStr : String;
Begin
MessageStr := 'Hello world!';
Writeln(MessageStr);
End.
La prima riga di questo codice, dichiara il nome del programma. La direttiva {$APPTYPE
CONSOLE} indica al compilatore che si tratta di una applicazione console, da eseguire
dalla riga comandi.
La riga successiva dichiara una variabile di tipo stringa.
Successivamente, all'interno del blocco Begin..End., che costituisce il blocco
principale del programma, viene dapprima assegnata alla variabile MessageStr il valore
contenuto nella stringa 'Hello world!'. In ultimo con l'istruzione Writeln(MessageStr)
il contenuto della variabile MessageStr viene visualizzato sullo schermo dopo di che il
programma termina.
Per compilare il programma dell'esempio, è possibile, se Delphi è stato correttamente
installato e nella path di sistema è riportato il percorso ..BIN nella directory di
installazione di Delphi, utilizzare il seguente comando: supponendo di aver chiamato il
file del programma Hworld.Pas o Hworld.dpr possiamo scrivere
DCC32 Hworld.pas
Otterremo un file eseguibile di nome Hworld.exe che se eseguito stamperà a video il
teso 'Hello world!'.
Questo non è solitamente l'uso che si fa di Delphi. Delphi è
solitamente utilizzato per la realizzazione di applicazioni Windows con interfaccia
grafica non eseguibili dalla riga di comando. Anche la struttura del file di progetto è
leggermente differente e non contiene generalmente codice effettivo dell'applicazione se
non poche chiamate ai metodi definiti nelle unit.
Vediamo un attimo alcune particolarità che avrete sicuramente già notato. Prima di
tutto il segno ";" (punto e virgola) che delimita la fine di una
istruzione. Il Pascal, come il C++ ed altri linguaggi simili, necessita di questo segno di
punteggiatura per riconoscere il termine di una istruzione. Un'altra particolarità è il
"." (punto) che delimita la fine del blocco principale del codice. Come
vedremo più avanti, solamente il blocco principale delle unit avrà il punto dopo l'End
del blocco principale, i blocchi delle Funzioni e delle Procedure utilizzeranno
normalmente il punto e virgola.
Ma passiamo ora ad esaminare in maniera più approfondita la sintassi e la struttura
del linguaggio.