Un metodo che ho utilizzato con grande successo è quello di utilizzare i frame con un TPageControl e di associare in ritardo i frame al tPageControl la prima volta che si seleziona la pagina. Ciò mantiene il tempo di caricamento del modulo verso il basso, non creando frame che non vengono mai visualizzati, ma consente comunque la flessibilità della creazione, lo stato viene mantenuto quando si passa da una scheda all'altra. Recentemente sono passato a utilizzare i moduli e incorporarli invece dei frame ... ma il concetto è lo stesso.
Lo stesso può essere fatto utilizzando un singolo "punto di montaggio" su un TTabControl e spegnendolo mentre la scheda viene cambiata, ma poi si presenta anche il problema di come gestire lo stato della scheda come le schede vengono rimandate indietro.
[EDIT] Viene fuori la domanda come gestisco la comunicazione tra il frame e il modulo padre. Questo in realtà è molto facile da fare usando le interfacce. Basta creare una nuova unità che sarà condiviso dal modulo e il telaio e aggiungere due interfacce:
type
IFormInterface = interface
[guid]
procedure FormProc;
end;
IFrameInterface = interface
[guid]
procedure SetFormController(Intf:IFormInterface);
end;
hanno la forma implementare l'IFormInterface, e il telaio attuare l'IFrameInterface.Quando si fa clic su una scheda e mostrare una cornice, quindi eseguire codice simile al seguente:
var
FrameIntf : IFrameInterface;
begin
if Supports(FrameObj,IFrameINterface,FrameIntf) then
FrameIntf.SetFormController(Self);
end;
l'implementazione cornice del metodo SetFormController sarebbe poi tenere sul riferimento passato, che le consentirebbe di chiamare verso l'alto nella forma .
procedure TFrame1.SetFormController(Intf:IFormInterface);
begin
fFormController := Intf;
end;
Procedure TFrame1.Destroy; override;
begin
fFormController := nil; // release the reference
inherited;
end;
Procedure TFrame1.Button1Click(Sender:tObject);
begin
if fFormController <> nil then
fFormController.FormProc
else
Raise Exception.Create('Form controller not set');
end;
Grazie Jim. Quindi TTabControl è una soluzione preferita quando si riempie una scheda con oggetti in fase di esecuzione, mentre un PageControl + TabSheets + Frame è un'opzione migliore quando si imposta l'interfaccia in fase di progettazione? – Gulbahar
No. A TTabControl è la soluzione preferita quando si modificano le proprietà di un elenco di oggetti dello stesso tipo, poiché la modifica delle schede non modifica i controlli visualizzati, ma solo l'indice di tabulazione. Un controllo di pagina consente di inserire più di una pagina di controlli diversi su un modulo alla volta. (E Jim non ha scritto quella risposta, io l'ho fatto. Ne ha fatto una modifica.) –
Grazie Mason, ha senso. Per il mio uso, sembra un PageControl + alcuni tabsheet, ognuno dei quali con una cornice è la soluzione preferita per quello che devo fare. – Gulbahar