Domanda

sto imparando Delphi per gli ultimi 3 anni, a livello hobby / lavoro. Sono felice di dire che ora ho progredito al punto che posso guardare indietro alla mia presto il codice di orrore e di imbarazzo. Così ora sto passando attraverso alcuni dei miei primi apps e riscrittura / li refactoring.

Una delle cattive abitudini che sto cercando di allontanarsi da sta accedendo componenti su una forma da un'altra unità. Nel tentativo di far rispettare questo, ho avuto modo di sperimentare con l'utilizzo di frame come metodo di nascondere informazioni. Così, invece di avere un modulo con componenti su di esso, sto creando una cornice per contenere tutti i componenti di forma, poi mettendo la cornice su un modulo, spostando la dichiarazione telaio nelle dichiarazioni private,

type
  TMyForm = class(TForm)
   private
    MyFrame: TMyFrame;
    procedure SetTimeDate(const Value: TMyItem);
    function ReadTimeDate:TMyItem ;

quindi registrare il telaio nella sezione di inizializzazione modulo

initialization 
begin
RegisterClasses([TMyFrame])

Sono poi dichiarando le proprietà desiderate nella sezione pubblica dell'unità forma, che ha accesso al telaio e dei suoi componenti.

  public
    property TimeDate: TOverlayItem  read ReadTimeDate  write SetTimeDate;

Sono anche utilizzando telai di consolidare gruppi di componenti spesso ripetuti.

Questo sembra funzionare per gli scopi che voglio (nascondendo MyFrame e dei suoi componenti), ma Qualcun altro ha alcuna esperienza di questo metodo?

Ci sono degli svantaggi con l'utilizzo di frame? Sto in realtà guadagnando alcun beneficio dal fare questo? Ci sono problemi con l'utilizzo di frame nidificati all'interno di cornici? Ci sono delle guide di buone prassi di utilizzare telai in Delphi? Ci sono migliori / modi più semplici per raggiungere lo stesso effetto per quanto riguarda gui information hiding in Delphi?

HMcG

È stato utile?

Soluzione

Sembra che si verificano ancora un sacco di logica nel vostro livello di interfaccia utente. Forme / I pannelli non dovrebbero avere che le proprietà molto valore (tranne forse per finestre di dialogo).

Se si desidera più la struttura che leggere sul pattern MVC.

Detto questo, cornici può essere un buon modo per organizzare la GUI. Come con tutto, non un uso eccessivo.

Altri suggerimenti

mi piace telaio generalmente per la creazione bit riutilizzabili complesse. Per la maggior parte penso che possano essere un modo veramente pulito per costruire schermi. Tuttavia, come accennato da Henk Holterman le schermate ei telai dovrebbe contenere solo la logica relative al funzionamento dell'interfaccia utente e di essere ignorante come possibile sulla logica di business.

Un paio di punti ri telai e informazioni nascondono nell'interfaccia utente:

  1. in un'altra domanda su StackOverflow è necessario fare attenzione quando si usano i gestori di eventi in il telaio.
  2. Cornici hanno ancora un sacco di proprietà pubblicati e in realtà non risolvono il problema delle forme essere in grado di perdere tempo in modo inappropriato con l'un l'altro bit. Anche se non lo fai, se il codice lo permette che qualcuno finirà per scrivere codice che manomette dove non dovrebbe. Rimuovo sempre variabile forma globale Delphi sullies il codice con e spesso scrivere oggetti wrapper o implementare interfacce che forniscono accesso all'interfaccia utente controllato.

Così, invece di avere codice come questo:

ClientForm := TClientViewForm.Create(Self);
try
  ClientForm.Client := MyClient;
  ClientForm.ShowModal;
finally
  ClientForm.Free;
end;

Io in genere costringono le persone a scrivere qualcosa del genere:

ClientViewer := TClientViewer.Create(MyClient);
try
  ClientViewer.Show;
finally
  ClientViewer.Free;
end;

o anche

TClientViewer.ShowClient(MyClient);

e hanno il metodo della classe ShowClient gestire il bit mostrato nel primo elenco. In questo modo il codice chiamante non riceve mai il puntatore del modulo e non può toccare qualsiasi bit che non sono forniti specificamente dalla classe wrapper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top