[Delphi] VFI e frame.

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.

2 Risposte a “[Delphi] VFI e frame.”

  1. Marco Breveglieri Dice:

    Questo approccio mi è molto famigliare. :)

    ~/|/|arco

  2. Filippo Malaspina Dice:

    Ciao Marco, lo spunto per scrivere un articolo sui frame è nato dopo aver letto l’articolo che hai pubblicato sul tuo blog.
    Ciao
    Filippo

Lascia un commento

Occorre aver fatto il login per inviare un commento