Dopo l'esempio di semplicissima applicazione realizzato nella sezione riguardante le
interfacce grafiche, vediamo ora di approfondire un po' il discorso sulle forms
presentandone le proprietà i metodi e gli eventi più interessanti.
Proprietà
Come abbiamo visto le forms sono principalmente dei contenitori per gli altri oggetti
dell'interfaccia grafica. Alucne delle loro proprietà permettono di adattarle alle
esigenze del progettista. Una form è per esempio caratterizzata da un titolo. Questo
titolo può essere impostato sia a design time che a run time agendo sulla proprietà
Caption della form. La proprietà Caption è una delle proprietà comuni a molti dei
componenti della VCL e fa riferimento di solito a testo che viene visualizzato come
intestazione del componente stesso (TLabel, TForm, TButton, ecc). Nella barra del titolo,
dove compare appunto il titolo della form, compaiono anche dei pulsanti il comportamento
è quello standard di tutte le finestre di Windows: massimizzare la finestra,
minimizzarla, chiuderla. Vi è anche un altro pulsante che non sempre compare ed è quello
dell'help contestuale. I Delphi, è possibile decidere quali pulssanti visualizzare e
quali no agendo sulla proprietà borderIcons della form. La proprietà borderIcons è di
tipo Set e può contenere tutti, alcuni o nessuno dei pulsanti standard. tramite questa
proprietà è anche possibile decidere se disattivare o no il menu di sistema che compare
cliccando con il mouse sull'icona della finestra in alto a sinistra (o tramite tastiera);
questo contiene l'elenco dei comandi che possono essere applicati alla finestra, come la
massimizzazione, minimizzazione, la chiusura, ecc. tramite codice è anche possibile
aggiungere comandi speciali a questo menu. Da notare che le voci di menu rispecchiano lo
stato dei pulsanti sulla destra; percui se il tasto minimizza è disattivato, lo sarà
anche la relativa voce nel menu di sistema.
tra le caratteristiche di una form c'è anche il bordo. Per tipo di bordo in Delphi si
intende la funzione che il bordo avrà. Una Form può avere un bordo che permetta di
ridimensionare la finestra, può non avere bordo (per esempio una splash form), può avere
un bordo non ridimensionabile, può avere un bordo che dia alla form le caratteristiche
tipiche di una finestra di dialogo (come quella utilizzata nell'esempio delle interfacce
grafiche) oppure il bordo può fare assumere alla form altre caratterische come per
esempio cambiare il tipo di finestra in ToolWindow sia ridimensionabile che non (le tool
window sono quelle finestre utilizzate da molti software di grafica per contenere gli
strumenti di lavoro, pennelli, colori, ecc).
Una proprietà molto importante che influisce sul comportamento della finestra è la
proprietà FormStyle che permette di definire se la form sarà una finestra di una
applicazione SDI (Single Document Interface), come per esempio il Notepad di windows,
oppure comportarsi come una finestra di un'applicazione MDI (Multiple Document Interface)
come Word. In questo caso abbiamo due tipi di finestre MDI una finestra detta frame
(cornice) che il contenitore per le altre form definite Children. L'impostazione di
default quando si crea una nuova Form è fsNormal che indica che la finestra si
comporterà come SDI. C'è anche un'altro valore che può essere impostato per questa
propietà ed è fsStayOnTop che indica che la finestra sarà visualizzata sempre al
disopra di tutte le altre. Ritorneremo sulle applicazioni SDI ed MDI più avanti dove
approfondiremo il discorso e realizzeremo degli esempi.
Un form è caratterizzata oltre ad una dimensione, anche da una posizione. Per
posizionare un Form nello schermo è sufficiente modificare i valori delle proprietà
Top e Left della form. Queste sono le coordinate espresse in pixels relative
all'angolo superiore dello schermo ed all'angolo superiore sinistro della form. Vi è
un'altra proprietà che influisce sul posizionamento della form nello schermo, è Position
i cui valori validi sono: poDefault, poDefaultPosOnly, poDefaultsizeOnly, poDesktopCenter,
poMainFormCenter, poOwnerFormCenter, poScreenCenter. Con poDesigned la form appare
posizionata nello schermo e con la stessa larghezza ed altezza definita a design time. Con
poDefault la form appare nello schermo in una posizione e con delle dimensioni definite da
Windows. Ad ogni avvio dell'applicazione, la form si muove verso il basso e verso destra.
Con poDefaultPosOnly la form viene visualizzata con le dimensioni con cui è stata creata
a design time, ma la posizione è definita da Windows. Ad ogni avvio dell'applicazione, la
forma si sposta verso il basso e verso destra. Con poDefaultsizeOnly la form appra nella
posizione in cui è stata lascita a design time, ma la dimensione è stabilita da Windows.
Con poScreenCenter la form mantine le dimensioni definite a design time, ma viene
posizionata al centro dello schermo. Con poDesktopCenter la form mantiene le dimensioni
definite a design time, ma viene posizionata al centro del desktop. Con poMainFormCenter
la form mantiene le dimensioni assegnatele a design time, ma è posizionata al centro
della form principale dell'applicazione. Questa posizione può essere solamente usata con
le forms secondarie. Se utilizzata in una form principale l'effetto è lo stesso di
poScreenCenter. Con poOwnerFormCenter la form mantiene le dimensioni assegnatele a design
time, ma è posizionata al centro della form indicata nella proprietà Owner della form
stessa. Se in Owner non viene specificata alcuna form, questa impostazione restituisce lo
stesso risultato di poMainFormCenter.
Si può anche decidere di rendere una form autodimensionante in base ai componenti in
essa contenuti o allo spostamento di essi. Ciò è possibile impostando la proprietà
Autosize della form stessa. Normalmente questa proprietà è impostata a False e fa
si che qualora dei componenti non risultassero visibili nell'area client della form,
vengano visualizzate le barre di scorrimento orizzontale e verticale.
Si può decidere il comportamento delle barre di scorrimento sia orizzontale che
verticale. Se viene impostata la proprietà Autosize della form a true, non si ha la
comporsa automatica delle barre di scorrimento ma la form verrà ridimensionata sia in
orizzontale che verticale per accogliere i componenti che prima non erano completamente
visibili nell'area client.
Le Form di Delphi permettono anche di definire su aquale monitor visualizzare la form
nel caso di un ambiente fornito di più monitor, come nel caso delle schede Matrox
DualHead. Per fare ciò bisogna impostare adeguatamente la proprietà DeafultMonitor della
form che vuole venga visualizzata in un monitor particolare.
Un'altra proprietà interessante è quella che permette di stabilire come una form
viene visualizzata alla sua prima visualizzazione. La proprietà WindowState permette di
scegliere tra wsNormal, che indica lo stato di visualizzazione normale della form,
wsMaximized che indica che la form è massimizzata o wsMinimized che indica che la form è
minimizzata. Questa proprietà può anche essere letta per verificare lo stato attuale
della form.
Ancora più interessante è la proprietà KeyPreview che peremtte di intercettare la
pressione dei tasti della tastiera prima che il componente attivo nella form si accorga
dell'accaduto. In poche parole quando viene premuto un tasto sulla tastiera, il componente
attivo in quel momento riceve un messaggio di Windows che lo informa dell'accaduto.
Impostando la proprietà KeyPreview a true, questo comportamento viene alterato
permettendo alla form di intercettare il messaggio di Windows prima che questo giunga al
componente attivo.
Vediamo ancora un'altra proprietà delle forms ed è la proprietà Icon che permette di
definire l'icona visualizzata in alto a sinitra nella barra del titolo della form. Se a
questa proprietà non viene assegnata una icona, la form prenderà l'icona
dell'applicazione, che di default Delphi 5 imposta a .
Metodi
Dopo aver visto le proprietà più interessanti delle froms, vediamone ora i metodi.
Sicuramente il più importatnte è il metodo Create comune a tutti i componenti della VCL.
Questo metodo crea un oggetto di classe TForm. Da notare che il metodo crea solamento
l'oggetto, percui non ci si deve aspettare di vedere visualizzare la form dopo la sua
chiamata.
Della visualizzazione della form si occupano due metodi: Show e ShowModal. Il primo
visualizza la form e restituisce il controllo all'applicazione, mentre il secondo
visualizza la form e attende che questa venga chiusa prima di restituire il controllo
all'applicazione. L'effetto è quello che abbiamo visto nell esempio delle interfacce
grafiche: la finestra di dialogo. Il metodo ShowModal restituisce anche un valore che
identifica il tipo di chiusura della finestra. Un elenco dei valori validi è: mrNone,
mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrYes, mrNo, mrAll. Per chiudere una finestra
modale è sufficiente assegnare alla proprietà ModalResult della stessa un valore diverso
da zero
Il metodo Hide nasconde la form. Da notare che la form viene solamente nascosta ma non
viene eliminata dalla memoria. Quindi, giocando con i metodi Show e Hide, si può
visualizzare e nascondere la form fino a che la forma non sarà chiusa. Per eliminare
dalla memoria la form, chiamare il metodo Free, come per tutti i componenti della VCL. La
chiamata a questo metodo imposta la proprietà Visible della form a False.
Il metodo Close chiude la form. Anche questo metodo non distrugge l'oggetto form. per
distruggerlo occorre chiamare il metodo Free oppure assegnare alla variabile Action
nell'evento OnClose della form il valore caFree. Così alla chiusura della form questa
verrà anche eliminata dalla memoria automaticamente.
Eventi
Sicuamente l'evento più utilizzato di una form è l'evento OnShow che viene invocato
quando appunto la form viene visualizzata tramite il metodo Show o impostando la
proprietà visible della form a true.
Come per il metodo Show esiste l'evento OnShow, così per il metodo Hide esiste il
metodo OnHide. Questo viene appunto attivato quando viene chiamato il metodo Hide della
form oppure impostata a False la sua proprietà Visible.
L'evento OnCreate permette di effettuare operazioni speciali durante la creazione della
form. Se vengono creati degli oggetti in questo evento, questi dovranno essere eliminati
nell'evento OnDestroy della form. Evitare di lavorare su componenti inseriti nella form in
questio evento poichè potrebbero non essere accessibili e si avrebbe il sollevamento di
una eccezione di "Access Violation". Se la proprietà Visible della form è
impostato a true, si ha la seguente sequenza di eventi alla creazione della stessa:
OnCreate, OnShow, OnActivate, OnPaint.
L'evento Onclose viene attivato quando la form viene chiusa. Questo viene invocato
immediatamente prima della chiusura della form. In questo evento è disponibile un
parametro che permette di definire l'azione da eseguire in chiusura della form. Valori
validi sono: caNone, caHide, caFree, caMinimize.
L'evento OnCloseQuery viene invocato prima dell'evento OnClose e permette di eseguire
del codice per decidere se la form può o no chiudersi. Potrebbe essere il caso di un
editor di testo che controlla se il contenuto del file aperto è stato modificato e
visualizza una finestra di dialogo che chiede se salvare o no le modifiche. In questo
evento è presente un parametro che permette appunto di annullare la chiusura della form.
Per fare ciò occorre impostare il parametro CanClose a False. Da notare che il parametro
viene passato all'evento con il valore true, percui se non si deve arrestare la chiusura
della form non occorre assegnargli questo valore.
L'evento OnActivate viene invocato quando la form riceve il fuoco. Una form riceve il
fuoco quando l'utente vi fa click con il mouse. Nel caso di form di tipo MDIChild,
l'evento OnActivate della form si genera solamente quando il fuoco cambia da una form
child all'altra.
L'evento OnResize permette di eseguire del codice speciale quando la form viene
ridimensionata. Per l'esesattzza, l'evento viene attivato a conclusione del
ridimensionamento della form. L'Evento OnResize è una degli eventi comuni a molti
controlli della VCL. Parallelamente all'evento OnResize, c'è l'evento OnCanResize che
permette di intercettare il ridimensionamento della form e di decidere se il
ridimensionamento richiesto debba essere consolidato oppure annullato.
Ci sono poi gli eventi attivati in risposta alle azioni generate dal mouse, come
OnClick relativo a quando un utente fa click con il mouse sulla form, OnMouseMove,
relativo al movimento del mouse sopra la form, OnDblClick che intercetta il doppio click
con il mouse sopra la form, OnMouseDown ed OnMouseUp che vengono generati in risposta
realtivamente alla pressione del tasto del mouse ed al suo rilascio.
Come sono presenti eventi collegati alle azioni del mouse così sono presenti eventi
collegati alle azioni relative alla tastiera Quindi c'è l'evento OnKeyPress, OnKeyDown ed
OnKeyUp che rispettivamente si riferiscono alla pressione generica di un tasto sulla
tastiera, alla pressione ed al rilascio di un tasto.
Ovviamente quelli trattati in questa sezione del corso sono solo una parte delle
proprietà, dei metodi e degli eventi definiti dalla classe TForm e per una trattazione
più dettagliata si rimanda ai manuali sia in linea che cartacei del linguaggio.