2011-12-13 18 views
5

böyle bir şeydirDelphi XE bir prosedürün bir parametre olarak bir sınıf geçme ı yapmanız gerekenler

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

Ne ben A prosedürü daha karmaşıktır, fakat problem formun oluşturulmasını biraz genel hale getirme konusundadır. Belki de @ operatörüyle ilgili bir şey ... gerçekten bilmiyorum.

Herhangi bir öneriniz için teşekkürler!

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

Böyle TAppliction.CreateForm() uğramadan bu taklit edebilir:

cevap

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' orada iyi. Bunun yalnızca formun kurucusunun 'TForm' yapıcısının bir geçersiz kılma olması durumunda işe yaradığını belirtmek gerekir. –

+0

@David, kurucu Oluşturucu, eşleşen parametrelerle, eğer alt yapıcıyı gizlerse, bunun işe yaramayacağını mı söylüyorsunuz? –

+2

@Marcus Bu doğru. Çalışmaya sınıf referansı yoluyla örnek almak için sanal kurucuları kullanmanız gerekir. Aksi takdirde, sınıf referansında ne olduğuna bakılmaksızın, her seferinde bir TMyForm ile sonuçlanırsınız. –

3

Ne soruyorsun, örneğin TApplication.CreateForm() gelmez temelde ne

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

Evet ... kod diğerine (ve CreateForm yöntemine benzer) benzer ... jeje ... bunu asla anlayamıyorum! – Speaker

+0

Sadece başka bir soru ... formları serbest bırakmanın en iyi yolu hangisidir? Form.release? veya FreeAndNil şimdiye FreeAndNil kullanmak (Form) ... ama ... – Speaker

+2

'TForm.Release()' form, olayın içinden birinden de özgür gerektiğinde kullanılmalıdır anlamına gelir işleyicileri. TForm'un hiçbir şey tarafından kullanılmadığından emin olmak için kontrol ana mesaj döngüsüne geri dönene kadar serbest kalır. Eğer TForm'un artık kullanılmadığını biliyorsanız (ki bu durumda durum böyle), o zaman hemen 'Free() 'diyebilirsiniz. 'FreeAndNil()', bu örnek gibi yerel değişkenlerin bu kadar basit kullanımı için aşırı derecede kullanışlıdır. Artık kullanılmayacak bir işaretçi sıfırlamaya gerek yok. –