2011-12-13 15 views
5

che cosa devo fare è qualcosa di simile:Passando una classe come parametro di una procedura in Delphi XE

procedure A(type_of_form); 
var form: TForm; 
begin 
    form := type_of_form.Create(application); 
    form.showmodal; 
    freeandnil(form); 
end; 

Ho fatto questo per ogni forma creata in modo dinamico:

form1 := TForm1.Create(application); 
form1.showmodal; 
freeandnil(form1); 

What i farà all'interno della procedura A è più complessa, ma il problema risiede in come rendere la creazione della forma un po 'generale. Forse qualcosa con l'operatore @ ... davvero non lo so.

Grazie per qualsiasi suggerimento!

risposta

6
procedure Test(AMyFormClass: TFormClass); 
var 
form: TForm; 
begin 
    form := AMyFormClass.Create(Application); // you can use nil if you Free it in here 
    try 
    form.ShowModal; 
    finally 
    form.Release; // generally better than Free for a Form 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Test(TForm2); 
end; 
+0

'form.Free' sta bene lì. Vale la pena ricordare che questo funziona solo se il costruttore del form è un override del costruttore 'TForm'. –

+0

@David, stai dicendo che questo non funzionerà se il costruttore è denominato Crea, con parametri di corrispondenza, se nasconde il costruttore discendente? –

+2

@Marcus Questo è corretto. È necessario utilizzare i costruttori virtuali per ottenere l'istanziazione tramite riferimento di classe al lavoro. Altrimenti si finisce con un 'TMyForm' ogni volta, indipendentemente da ciò che è nel riferimento di classe. –

3

Quello che chiediamo è fondamentalmente ciò che TApplication.CreateForm() fa, ad esempio:

Application.CreateForm(TForm1, form1); 
form1.ShowModal; 
FreeAndNil(form1); 

È possibile simulare che senza chiamare TAppliction.CreateForm() come questo:

procedure A(AClassType: TFormClass); 
var 
    form: TForm; 
begin 
    form := AClassType.Create(Application); 
    try 
    form.ShowModal; 
    finally 
    FreeAndNil(form); 
    end; 
end; 

... 

begin 
    A(TForm1); 
end; 
+0

Sì ... il codice è simile all'altro (e simile al metodo CreateForm) ... jeje ... non lo realizzo mai! – Speaker

+0

Solo un'altra domanda ... qual è il modo migliore per liberare le forme? Form.release? o FreeAndNil (Form) io abbia mai usare FreeAndNil ... ma ... – Speaker

+2

'TForm.Release()' è pensato per essere utilizzato solo quando il modulo ha bisogno di liberarsi da dentro di uno dei suoi eventi gestori. Il free viene posticipato fino a quando il controllo ritorna al loop del messaggio principale per assicurarsi che TForm non venga utilizzato da nulla. Se sai che TForm non viene più utilizzato (come in questa situazione), puoi chiamare immediatamente 'Free()'. 'FreeAndNil()' è eccessivo per un utilizzo così semplice di una variabile locale come questo esempio. Non è necessario azzerare un puntatore che non verrà più utilizzato. –

Problemi correlati