Form Create Edilmiş ise Oluşturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
osmantn
Üye
Mesajlar: 6
Kayıt: 23 Tem 2004 11:45
İletişim:

Form Create Edilmiş ise Oluşturma

Mesaj gönderen osmantn »

Arkadaşlar form oluştururken
if not assigned(KullaniciListesi) then
KullaniciListesi := TKullaniciListesi.Create(AnaMenu);
KullaniciListesi.Show;

şeklinde bir kod kullanıyorum.
Formu kapatırkende

--> Kullanicilistesi := Nil;
---> self.free;
diyerek formları sağlıklı şekilde free edebiliyorum ancak bu close işleminde KullaniciListesi := nil yazmak yerine KullaniciListesi yerine parametrik bir kod yazmak istiyorum. Her formun close olayına kendine özel kod eklemek yerine standart bir kod yazmak istiyorum. Bunu nasıl yapabilirim. Amacım eğer form oluşturulmuş ise tekrar oluşturma ve oluşturulmuş formu göster , formu kapatırsa formu tamamiyle free et.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

KullaniciListesi aslında bir degisken, icinde formun (yada Tform nesnesinin) adresini tutmakta. siz global bu degiskeni kullanacaksanız parametrik bir Close yordamı yazamazsınız.
bunun yerine programınızın basında bir TStringList olusturarak create edilen formları buraya obje olarak ekleyebilirsiniz. ilgili formun close unda da bu listedeki elemanı silebilirsiniz.
aynı formu tekrar cagırdıgınızda listede varmı diye bakmanız yeterli eger yok ise formu olusturup listeye eklemelisiniz eger listede var ise kayıtlı adresten formu cagırmalısınız.
ornegin formu create ederken

Kod: Tümünü seç

try 
  KullaniciListesi:=TKullaniciListesi.create(nil)
  FormListem.AddObject('KullaniciListesiFormu',KullaniciListesi);
except
  ShowMessage('bir hata oldu.')
end;
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...
@osmantn yazdı:if not assigned(KullaniciListesi) then
KullaniciListesi := TKullaniciListesi.Create(AnaMenu);
KullaniciListesi.Show;
- Burada bringtofront komutu kullanırsan sorununu baştan halletmiş ve de parametrik çözüm aramaktan kurtulmuş olursun... :idea:

Kod: Tümünü seç

  if not assigned(KullaniciListesi) then 
  begin
    KullaniciListesi := TKullaniciListesi.Create(AnaMenu); 
    KullaniciListesi.Show;
  end else KullaniciListesi.Bringtofront;
@osmantn yazdı:Formu kapatırkende

--> Kullanicilistesi := Nil;
---> self.free;
Self.Free; yerine

Kod: Tümünü seç

Action := caFree;
tercih etmeni tavsiye ederim...

- Sorun yaşamamışsın belki de yaşamayacaksın ama bunu Action olarak sırası geldiğinde kendiliğinden yapılmasını sağlamak bence daha doğrusu.

- FREE kullanmana izin veriliyor keza belki de başka bir formu free etmek istersin...
Resim
Resim ....Resim
osmantn
Üye
Mesajlar: 6
Kayıt: 23 Tem 2004 11:45
İletişim:

Mesaj gönderen osmantn »

abstract error hatası alıyorum.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

nerede, ne yaparken?
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Önce free işlemi olsun sonra Nil edersin. Satırları ters yazmış olabilirsin, bir kontrol eder misin? ... :idea:

Kod: Tümünü seç

  Action := caFree;
  KullaniciListesi := Nil;
Not: Bunları FormClose eventinde yazılıp yazılmadığını sormuyorum bile... :?:
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

OnClose Event inde Action := caFree;
OnDestroy Event inde KullaniciListesi := Nil;
kullan
ayrıcada

Kod: Tümünü seç

if not assigned(KullaniciListesi) then
KullaniciListesi := TKullaniciListesi.Create(AnaMenu);
KullaniciListesi.Show; 
tam sağlıklı çalışabilmesi içinde
@mrmcop da belirttiği gibi

Kod: Tümünü seç

if not assigned(KullaniciListesi) then
  begin
    KullaniciListesi := TKullaniciListesi.Create(AnaMenu);
    KullaniciListesi.Show;
  end else KullaniciListesi.Bringtofront;
kullan ayrıca bu kodun sağlaması yani kesin çalışması içinde
end. nın hemen üzerine

Kod: Tümünü seç

initialization
  KullaniciListesi := Nil;
yazmalısın. Daha önceleri application çalıştığında bu değişkenlerin tam olarak nil olmadıklarıyla karşılaşmıştım.initialization Application çalıştığında herşeyden önce ilk çalıştırılır.

Ayrıca parametrik yapıcaksanda @gmikri nin dediği yöntemi kullanmanı öneririm. Ben Eskiden dos tan kalma hala memory tasarrufu alışkanlığından TList i kullanıyorum :) Tlist i bir pointer array gibi düşünebilirsiniz. Kullanımı basit.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
osmantaskiran
Üye
Mesajlar: 34
Kayıt: 17 Nis 2004 09:27
İletişim:

Mesaj gönderen osmantaskiran »

Ben her formun destroy olayına kullanıcılistesi := nil
yazmak istemiyorum. temel form sınıfımda bunu söyleyip türettiğim formlarda bunun otomatik olmasını istiyorum.
Bunu yapabilir miyim?
Cevapla