Bak şöyle yap istersen.
Ya da önce şunu söylüyeyim; bir formu Create ederken, nil olarak create etmek iyi bir yaklaşım değildir ki bunu sende farketmiş olacaksın.
Form.Create(Self) yada
Form.Create(Application) şeklinde yapman en doğrusudur. Çok özel nedenlerden ötürü Create ederken nil kullanabilirsin.
Burda create işleminde Self dediğinde, yeni create edilen form'un Parent'i ni belirlemiş oluyoruz ve bir anlamda yeni create edilen form, altaki formun bir uzantısı haline geliyor.
Şimdi esas konuya geleyim.
senin iki formun var.
anaform.pasve
personel.pas
anaform.pas içinde uses'e doğal olarak personel'i eklemişsindir.
Tabi delphi default'ta global değişken olarak personel.pas içinde global VAR kısmında
frmPersonel:TfrmPersonel (ya da sen ne yazdıysan) diye bişi koymuştur. Bu demek değildir ki, her personel formu create ederken bu dğeişkeni kullanayım.
Sen şimdi 50 tane personel formunu açmak isteyebilirsin, doğaldır. Ama hepsinide frmPersonel adı altında create edersen, önce create edilen formun tutacağı n'olacak. Güme gidecek elbet. Uygulama patlamayacak ama sen önce creste edilen aynı formalara ulaşamayacaksın.
Şimdi bununi çin bir kaç yöntem var. en iyi yaklaşım. şudur.
Personle formunu çağırdığın illaki bir button yada menü vardır. Diyelim ki bunu ana form üstündeki bir buttona basında yapıyorsun.
O zaman şunu yazalım.
Kod: Tümünü seç
Procedure ButtonClick(Sender:TObject);
var PF : TfrmPersonel;
begin
PF := TfrmPersonel.Create(Self);
PF.Show;
end;
İşte iyi bir yaklaşımla formu create ettik. 50 tane aç. bişi olmaz.
Ama şimdi burda da başka bir sorun var, 50 tane form creste edildi, peki bu formları close yaparsam, FREE olacağının garantisi var mı?:
HAYIR YOK.
Bunun için ne yapacağım. Tabi ki, Personel formunun FormClose kısmına
yazmanız gerekiyor. Bu form kapandığında kendini FREE et demektir.
Gelelim, şehir listesine.
Şimdi sen 3 tane personel formu create ettin diyelim.
ve 2. create ettiğin formun üstünde şehir listesi düğmesine bastın. ne güzel. bas abi.. şimdi sen seviniyorsun. şehiri seçtikten sonra 2. forma gelecek diyorsun. ama yanılıyorsun. 3. forma gelir bilgi. niye mi?
Çünkü frmPersonel tutmaçıyla en son 3. form create edildiği için..
İşte senin sorun burda çözülüyor şimdi.
Bu durumda, atama işlemini şehir listesini seçtirtiğin yerde değil, şehir listesini çağırdığın yerde yapmandır. Nasıl peki?
Şöyleki:
Kod: Tümünü seç
procedure TfrmPersonel.SehirSecDugmesiClick(Sender:TObject);
var SEHIR : TfrmSehirListesi;
begin
SEHIR := TfrmSehirListesi.Create(Self);
if SEHIR.ShowModal = mrOK Then
begin
SehirLabel.Caption := SEHIR.SecilenSehir;
end;
SEHIR.Free;
end;
bu arada yukarıda gösterdiğim personel formuna alternatif şunuda kullanabilirsiniz.
Kod: Tümünü seç
Procedure ButtonClick(Sender:TObject);
begin
with TfrmPersonel.Create(Self) do Show;
end;
Genelde bu işler için bu tür kullanımı tercih ederim. Fazla kod yazmadan.
Peki diyelim ki. Sen bu şehir seçme işini bir çok formun içinde kullanıyorsun. Sadece personel formunun içinde değil. Eee her defasında, bir alay kod yazacam falan da filan. Daha kolayı yok mu. Var tabi.
En iyi yöntem. Şehir listesi veren formu bir component yapabilirsin. Böylelikle bu tip bir işlemi bundan sonra yazacağın programlarında da kullanırsın.
İkinci yöntem ise, SehirListesi.pas içinde
implementation 'ın üstüne şöyle yaz.
sonrada
implementation 'ın altına şu kodları ekle.
Kod: Tümünü seç
Function SehirSecsene : String;
begin
with TfrmSehirListesi.Create(Self) do
begin
if ShowModal = mrOK Then
Result := FormdanGelenSecilenSehir
else
Result := 'İşlem iptal edildi.';
Free;
end;
end;
Evet, artık
SehirSecsene adlı bir fonksiyonumuz oldu. İstediğimiz formdan, bu fonksiyonu çağırabilirsiz. Tabi çağırmak istesiğimiz form'un USES kısımına
personel unitini eklememiz gerekiyor.
Son olarak sizlere şunu söylemek istiyorum. Eğer düm düz kod yazıyorum. Nesneye yönelik programlama nedir bilyorsanız. öğrenmekte istemiyorsanız, ha delphi kullanmışsınız ha basic. ha cobol farketmez. Delphi'yi Delphi yapan şeylerin başında nesneye yönelik yazılımdır. Componentleridir. Koscoca Microsoft bile Borland'ın icatlarıyla Microsoft oluyor. Delphi'nizi sevin sevindirin. Günü gelecek o sizi çok sevindirecek.
İşte bu kadar. umarım faydalı olur.
İyi çalışmalar.