Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 969
Kayıt: 29 Haz 2005 05:57
Konum: Bursa

Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek

Mesaj gönderen NewMember » 11 Eki 2019 11:12

Arkadaşlar Merhaba;
Bir sorum olucak.Açıklamaya çalışayım.Ancak eğer yeterince açık olmazsa diye örnek bir küçük projeyide paylaşıyor olacağım.

Şimdi

1 Adet BaseList Formum var.
1 Adette BaseEdit Formum var.

Sonra bunlardan onlarca Form türeteceğim.

Örneğin
BaseListten CariList,KasaList,HesapHareketList,........ gibi gibi giden.
BaseEditten CariEdit,KasaEdit,HesapHareketEdit,........ gibi gibi giden.

Şimdi türetmiş olduğum child bir form olan CariList üzerine aldığım bir butonun clickine aşağıda ki kodu yazarsam CariEdit formu create der ve gösteririm.

Kod: Tümünü seç

Application.CreateForm(TFrmCariEditForm,FrmCariEditForm);
FrmCariEditForm.ShowModal;

Ancak bunun için her türettiğim XXXListForma bu kodu yazmam gerekir.

Oysa ben ata form olan BaseList Forma bir button koymalı ve onun clickine bir kod yazmalıyım.Sonra türettiğim form hangi alanla ilgili ListForm ise o alanla ilgili EditFormu açmalı,
bu türettiğim ListFormda yukarıdaki kodu tekrar tekrar yazmamalıyım.

Bunu şu şekilde çözmeye çalıştım.

BaseList Formda public blokta şöyle bir değişken tanımladım.

Kod: Tümünü seç

   MyEditForm:TFrmBaseEditForm;


Sonra BaseList Formdaki EditFormu açtırmak istediğim butonun clcikine aşağıdaki kodu yazdım.

Kod: Tümünü seç

Application.CreateForm(TFrmBaseEditForm,MyEditForm);
MyEditForm.ShowModal;
Sonrada türettiğim her ListFormda bu yukarıda tanımladığım MyEditForm değişkenini alakalı EditFormla set ediyorum.

Örnek CariList formda şu şekilde set ediyorum.

Kod: Tümünü seç

  MyEditForm:=FrmCariEditForm;

Ancak bu atamaya rağmen CariList formdaki click eventindeki inherit cod CariEdit formu create etmek yerine BaseEdit formu create ediyor.
Aşağıdaki gibi.
Resim




Oysa olmaısnı istediğim görüntü aşağıdaki gibi:

Resim



Hatalı kod yazdığımın farkındayım.Bu şekilde çalışmaması gayet doğal.Ancak bu yapmak istediğimi nasıl yapabilirm.
Yardımcı olacak arkadaşlara şimdiden teşekkürler....


Örnek Projeyide daha net olması açısından paylaşıyorum.

Project1.rar - 9 KB

Kullanıcı avatarı
csunguray
Üye
Mesajlar: 850
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek

Mesaj gönderen csunguray » 11 Eki 2019 12:15

Kod: Tümünü seç

procedure TFrmCariList.FormCreate(Sender: TObject);
begin
  inherited;
  MyEditForm := TFrmCariEdit.Create(Self);
end;
ile her liste formunun create'inde edit formunun ne olduğunu belirlerseniz sorun kalmaz. Böylece base formdaki "Değiştir" düğmesine bastığınızda:

Kod: Tümünü seç

procedure TFrmBaseListForm.ButtonEditClick(Sender: TObject);
begin
  inherited;
  MyEditForm.ShowModal;
end;
kodu doğru tipteki form açılacaktır.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)

Kullanıcı avatarı
NewMember
Üye
Mesajlar: 969
Kayıt: 29 Haz 2005 05:57
Konum: Bursa

Re: Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek

Mesaj gönderen NewMember » 11 Eki 2019 01:46

@csunguray çok teşekkürler.
Yukarıda yazmadım ama hep bu EditFormun create işlemlerini bir Class tanımlayıp onun üzerinden BaseList formda create etme denemelerim olmuştu.
Çok pratik bir şekilde yardımcı oldunuz.
Bu kod doğru formu açıyor.
Çok sağolun.
Ama bu şekilde düşünmememin bir sebebi de şu.
Form bellekte sanki yer tutmuyor gibi.Yada ben bildiğim yöntemlerle bunu tespit edemiyorum.
Genel kullanım alışkanlığım gereği projelerimde hep formun bellekte olup olmadığını control eder sonra create eder yada gösteririm.

Projenin ana formunda CariEdit formun bellekte olup olmadığını sorgulayı yoksa bir daha manuel create ettiğimde aynı formdan bir tane daha oluşturuyor.FrmCariEditForm_1 ismiyle.

Assigned metoduyla veya Nil olup olmadığına göre kontrol ettiğimde CariEditForm yok şeklinde cevap alıyorum.
Yani Nil True,Assigned ise False döndrüyor.Dolayısıyla bir adet daha CariEditForm oluşuyor ve adı FrmCariEditForm_1 oluyor.
Bir kez daha kontrol ederek create etmek istersem bu sefer bellekte görüyor ve create etmiyor.

Bunu nasıl aşabiliriz?

Kullanıcı avatarı
NewMember
Üye
Mesajlar: 969
Kayıt: 29 Haz 2005 05:57
Konum: Bursa

Re: Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek

Mesaj gönderen NewMember » 11 Eki 2019 09:17

@csunguray

Bir şeyi gözden kaçırmışım.
Her ne kadar Name propertysi FrmCariEdit form olsa da, MyEdit form isimli referans ile revize edildiğinden, Assigned ve/veya Nil kontrolü yaparken, Form ekranda görünmesine rağmen Assigned False dönmesinin sebebi buymuş.Dolayısıyla projelerimde başka formlarda fazladan bir değişken tanımlamamak için, formun kullanımda olup olmadığını, açık olup olmadığını öğrenmek amaçlı yaptığım Assigned kontrolünü, Visible propertysi ile yaparsam sanırım bu sorun çözülmüş olacak.
Yani

Kod: Tümünü seç

 if Assigned(FrmXXX) then 
begin
//Şunu Yapma
//Bunu Yap
end
else
begin
//Bunu Yapma
//Şunu Yap
end;

yerine

Kod: Tümünü seç

 if FrmXXX.Visible then 
begin
//Şunu Yapma
//Bunu Yap
end
else
begin
//Bunu Yapma
//Şunu Yap
end;

Kodu işimi çözecek.
Assigned kontrolunun gerektirdiği durumlarda da, MyEdit form üzerinden kontrol yapacağım.
İlgi ve alakanıza teşekkürler....

Cevapla