Türetilmiş bir formu dinamik olarak yaratma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Türetilmiş bir formu dinamik olarak yaratma

Mesaj gönderen AraGorN »

Merhaba arkadaşlar,

nett ve forumda arama yaptım ama istediğim şeyi bir türlü tam olarak yapamadım. şöyle bir sıkıntım var;

TBaseForm diye TForm dan türettiğim bir base form yapım var, bu TBaseForm da Create constructor ını da override edip temel olarak ekranlarımda olacak olan pek çok işlemi yazdım. bundan sonra projemde kullanacağım her ekranı TBaseForm'dan türeterek yapacağım. örneğin TFrm1, TFrm2, TFrm3... bunların hepsi TBaseForm dan türedi. şimdi temel bir CreateForm prosedürü yazıp verdiğim formID parametresi ile istenilen formu yaratmak istiyorum ama şöyle bir kod olsun istemiyorum

Kod: Tümünü seç

procedure CreateForm(ForMID: String);
var ABaseForm: TBaseForm;
begin

if FormID = 'TFrm1' then ABaseForm := TFrm1.Create(Param1, Param2, Param3); //Create i override edip parametreler ekledim
if FormID = 'TFrm2' then ABaseForm := TFrm2.Create(Param1, Param2, Param3); //Create i override edip parametreler ekledim
if FormID = 'TFrm3' then ABaseForm := TFrm3.Create(Param1, Param2, Param3); //Create i override edip parametreler ekledim
...
...
end;
şimdi bu kod bana çok hantal geliyor ayrıca 100lerce formum olursa tek tek yazmak zorunda kalıcam, bunun yerine o an verdiğim FormID parametresine göre doğrudan o formu yaratacak bir kod yazamaz mıyım.

GetClass ve FindClass fonksiyonlarını kullanarak bu formların classlarını alıp yaratmayı deniyorum ama ben Create i override ettiğim için istediğim parametreleri veremiyorum ve gerekli ayarlamalar yapılmıyor. fikri olan var mı acaba?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Türetilmiş bir formu dinamik olarak yaratma

Mesaj gönderen sabanakman »

-Öncelikle Create gibi temel bileşen metodunu override yaparken parametre değişikliklerinden mümkün olduğunca kaçınılmalı. Bunun yerine ek bir metot çalıştırılmalı.

Kod: Tümünü seç

  TFrm1 = class(TBaseForm)
...
    procedure Hazirla(const Param1,Param2,Param3:String);
...
...
...
var xFrm1: TFrm1;
begin
  xFrm1:=TFrm1.Create(Application);
  xFrm.Hazirla(Param1,Param2,Param3);
end;
gibi. Create işleminin ardından gerekli metod (Hazirla) çalıştırılarak gereken ayarlar bu şekilde create metodu dışında yapılmalı.

-RegisterClass(TFrm1); gibi bir kodla form sınıfını kayıt etmelisin. Mesela bu kodu pas dosyasında

Kod: Tümünü seç

initialization
  RegisterClass(TFrm1);
end.
bloğuna ayrı ayrı yazabileceğin gibi, projenin ilk açılışı esnasında bir prosedür içerisine de toplayabilirsin. Artık FindClass ile aradığımızı bulup gerektiği şekilde kullanabiliriz.

Kod: Tümünü seç

function CreateForm(const ForMID: String):TBaseForm;
var ABaseForm: TBaseForm; FormSinifi:TFormClass;
begin
  FormSinifi:=TFormClass(FindClass(ForMID));
  if Assigned(FormSinifi) then begin
    ABaseForm:=TBaseForm(FormSinifi.Create(Application));
    ABaseForm.Hazirla(Param1,Param2,Param3);
  end else ABaseForm:=nil;
  Result:=ABaseForm;
end;
Artık "CreateForm('TFrm1').ShowModal;" gibi bir kodla gereken form çalıştırılabilir. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Türetilmiş bir formu dinamik olarak yaratma

Mesaj gönderen AraGorN »

@sabanakman teşekkür edreim cevabınız için bu şekilde düzenleyerek tekrar deneyeceğim. sonucu da yazacağım.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Türetilmiş bir formu dinamik olarak yaratma

Mesaj gönderen sabanakman »

Bu arada bir noktayı es geçtiğimi fark ettim. Hazırla prosedürü TBaseForm'da virtual olarak tanımlamalı ve daha sonra bundan türeyen formlarda override ile yeniden kodlamanız gerekmektedir. Ancak,

Kod: Tümünü seç

 TBaseForm = class(TForm)
...
    procedure Hazirla(const Param1,Param2,Param3:String);virtual;
...


...
TFrm1 = class(TBaseForm)
...
    procedure Hazirla(const Param1,Param2,Param3:String);override;
...
gibi bir yapıyla yukarıdaki mantık işleyecektir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Türetilmiş bir formu dinamik olarak yaratma

Mesaj gönderen AraGorN »

evet ben de direk virtual tanımlamıştım zaten, haklsınız Create i override etmemek lazım, bu mantıkla da gayet düzgün çalıştı. çok teşekkür ederim yardımınız için :)
Cevapla