In Delphi è possibile sviluppare un’applicazione MDI (Multiple Document Interface); utilizzando tale approccio, vengono visualizzate, all’interno della form principale, le varie form figlie. A tal proposito c’è da dire però che, con il passar del tempo, il Multiple Document Interface è sempre meno usato.
Infatti, in Delphi, sfruttando la Visual Form Inheritance ed i frame, possiamo suddividere l’interfaccia della nostra applicazione in varie pagine, ognuna delle quali è selezionabile in modo distinto, evitando anche le possibili limitazioni che un applicazione MDI potrebbe avere.
A questo punto non ci resta che iniziare il nostro cammino nella costruzione dell’applicazione. Avviamo Delphi, lanciamo un nuovo progetto, salviamo la form come UnitMain.pas ed il progetto come VFIFrame, successivamente, sulla form principale, inseriamo un componente MainMenu che conterrà i vari menu dell’applicazione ed un Panel che invece sarà il contenitore dei nostri frame; rinominiamo il Panel in pnlContenitore, allineiamolo al client in modo che lo spazio vuoto sia occupato automaticamente; a questo punto inseriamo altri due TPanel all’interno di pnlContenitore, rinominiamoli in pnlTitolo e pnlDescrizione, questi conterranno il titolo e la descrizione del frame che, di volta in volta, andremo a caricare.
A questo punto dobbiamo creare la pagina base della nostra applicazione, quindi dal menu file clicchiamo su Nuovo –> Frame, salviamo il frame come UnitPersonalizzata e settiamogli la proprietà del nome in frmPersonalizzata, dopo di che visualizziamo il codice del frame, dichiariamo, in strict protected, i seguenti metodi o funzioni:
function RiportaTitolo: string; virtual;
function RiportaDescrizione: string; virtual
In public dichiarimo le proprietà:
property Titolo: string read RiportaTitolo;
property Descrizione: string read RiportaDescrizione;
Successivamente i metodi RiportaTitolo e RiportaDescrizione dovranno essere ridefiniti nelle classi di ogni pagina in modo che vengano visualizzati i titoli e le descrizioni dei relativi frame; adesso passiamo all’implementazione della UnitPersonalizzata, nella sezione implementation, inseriamo:
function TfrmPersonalizzata.RiportaTitolo: string;
begin
Result:='';
end;
Tale dichiarazione ci permetterà di creare dinamicamente la pagina desiderata.
function TfrmPersonalizzata.RiportaDescrizione: string;
begin
Result:='';
end;
Fra la sezione type e implementation inseriamo la dichiarazione:
TPageFrameClass = class of TfrmPersonalizzata;
A questo punto inseriamo un nuovo frame nel nostro progetto, però dobbiamo fare in modo che tale frame erediti la classe TfrmPersonalizzata, quindi andiamo su File–>Nuovo–>Altro, nella finestra che apparirà selezioniamo Inheritable Items, facciamo doppio click sul frame personalizzato frmPersonalizzata e sarà creata una nuova pagina derivata da quella personalizzata, salviamo la unit come UnitHome, settiamo i parametri del nostro nuovo frame, assegnamo il nome del frame frmHome ed inseriamo i componenti che ci interessano, se per esempio vogliamo visualizzare questa pagina come pagina di avvio della nostra applicazione, basta inserire un componente TImage e legargli una immagine da visualizzare oppure se si tratta di un’applicazione che utilizza un database, potremmo visualizzare determinati dati su una DBGrid.
Passiamo adesso ad implementare il codice della nostra pagina, quindi andiamo a dichiarare, anche in questo frame, i metodi protetti:
strict protected
function RiportaTitolo: string; override;
function RiportaDescrizione: string; override;
Adesso implementiamo i su indicati metodi:
function TfrmHome.RiportaTitolo: string;
begin
Result:='Nome applicazione';
end;
function TfrmHome.RiportaDescrizione: string;
begin
Result:='Breve descrizione applicazione';
end;
Inseriamo un nuovo frame seguendo gli step su indicati per la costruzione della UnitHome e salviamola con il nome di UnitDati, a questo punto passiamo a scrivere il metodo che ci permette di visualizzare le varie pagine nella nostra applicazione, quindi, ritorniamo nella nostra form principale (UnitMain), inseriamo fra le uses della form la UnitPersonalizzata e successivamente definiamo il metodo CaricaPagina:
strict private
FCurrentPage: TfrmPersonalizzata;
...
public
procedure CaricaPagina (Pagina: TPageFrameClass);
Nella sezione dell’implementazione inseriamo:
procedure TfrmMain.CaricaPagina (Pagina: TPageFrameClass);
begin
if Pagina = nil then
Exit;
if FCurrentPage nil then
if FCurrentPage.ClassType = Pagina then
Exit;
if FCurrentPage nil then
FreeAndNil(FCurrentPage);
pnlTitolo.Caption:='';
pnlDescrizione.Caption:='';
FCurrentPage:=Pagina.Create(Self);
try
FCurrentPage.Parent:=pnlContenitore;
FCurrentPage.Align:=alClient;
pnlTitolo.Caption:=FCurrentPage.Titolo;
pnlDescrizione.Caption:=FCurrentPage.Descrizione;
except
FreeAndNil(FCurrentPage);
raise;
end;
end;
Nella form principale aggiungiamo fra le uses la UnitHome e la UnitDati, successivamente selezioniamo la form, facciamo doppio click sull’evento OnCreate e, nel metodo creato, richiamiamo il metodo CaricaPagina:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
CaricaPagina(TfrmHome);
end;
Facciamo doppio click sul TMainMenu, inseriamo il menu File e quello Visualizza, in File inseriamo la voce Esci, doppio click e dichiariamo il metodo:
procedure TfrmMain.EsciClick(Sender: TObject);
begin
Application.Terminate;
end;
Ritorniamo nel MainMenu ed in Visaulizza inseriamo due voci, una per la home e l’altra per la pagina dei dati; facciamo doppio click su ognuna e richiamiamo il metodo CaricaPagina:
procedure TfrmMain.Home(Sender:TObject);
begin
CaricaPagina(TfrmHome);
end;
procedure TfrmMain.Dati(Sender:TObject);
begin
CaricaPagina(TfrmDati);
end;
Proviamo a compilare ed avviare la nostra applicazione e se non abbiamo commesso errori, visualizzeremo la nostra applicazione con l’immagine inserita nel frame Home, proviamo a cliccare su Visualizza e cambiamo frame, selezioniamo la voce Dati, dovrebbo visualizzare il frame relativo ai dati. Nel caso in cui si vogliono visualizzare dei dati contenuti in un database, è necessario che nell’applicazione sia inserito anche un DataModule dove poter sistemare tutti i componenti utili per collegare il database esterno con la nostra applicazione e successivamente inseriremo anche il DataModule fra le uses dei nostri frame.

Venerdì 14 Agosto 2009 alle 18:44 |
Questo approccio mi è molto famigliare.
~/|/|arco
Domenica 16 Agosto 2009 alle 9:07 |
Ciao Marco, lo spunto per scrivere un articolo sui frame è nato dopo aver letto l’articolo che hai pubblicato sul tuo blog.
Ciao
Filippo