Taskbar üzerinde acilan form ve showmodal sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Taskbar üzerinde acilan form ve showmodal sorunu

Mesaj gönderen Glen »

Selam..
Arkadaşlar direk kodlarla anlatmaya calisicam cünkü farkli bir yoldan aciklayamam sanirim...

Ana, Personel, Sehirler
diye 3 tane form düşünün.

Ana form üzerinden bir butona tiklayinca

Kod: Tümünü seç

Personel := TPersonel.Create(nil);
Personel.Show;
İle personel formu yaratiliyor.. Kişi isterse ayni anda 1'den fazla tane Personel formu yaratabiliyor.. Personel formunun üzerinde il seçimine tiklanildiginda

Sehirler formu ShowModal; olarak aciliyor.. Ve de sorun $u, Oradan şehiri seçtiğimde

Kod: Tümünü seç

Personel.Sehir.Text := Table1SEHIR.Text;
Gibi bir komut calistiriyorum.. Sorun şu, sadece 1 tane personel formunun sehir.text 'ine geliyor seçilen şehir.Halbuki ben hangi formdan yaratildiysa o forma gitmesini istiyorum direk... Yani Gönderen form'a göre bir komut calistirmasini. .Nasil yapabilirim?

2. Sorum, Bu yaratilan Personel formu taskbar üzerine yerleşiyor yani her aclan form programda bağımsızmış gibi taskbar üzeirne yerleşiyor, ve ShowModal ile Sehirler formunu yarattigimda, sadece Ana form gözüküyor ve diger formlar gözükmüyor. (Taskbarda gözüküyor fakat içeriği gözükmüyor sadeca ana form gözüküor)

Biraz uzun oldu sanirim, umarim anlatabilmişimdir.. Teşekkür ederim şimdiden, herkese kolay gelsin.[/code]
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

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

Kod: Tümünü seç

Action := caFree;
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.

Kod: Tümünü seç

Function SehirSecsene : String;
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.
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Murat bey gercekten cok tesekkür ederim vaktinizi bu kadar harcayip üşenmeden yazdığınız için.. Dediklerinizi deniyip sonucu buraya tekrar yazacağım. Tekrar tekrar teşekkür ederim ilgilendiginiz için..

Kolay gelsin.
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Selam..

Verdiginiz kodlari denedim daha dogrusu paralel şeyler yazdim ancak kafama takilan nokta var her iki sorunumla da ilgili..

Bir şey acıklamayı unuttugumdan dolayi sanirim karisiklik oldu. Hani her yeni personel formu taskbarda ayri ayri gözüküyor ya programdan bagimsiz.. Sanirim problem ondan kaynaklaniyor yani ondan sonra bir showmodal yapinca personelin gizlenmesi sorunu. Kullandigim kodlar şunlar

Kod: Tümünü seç

[b]type[/b]
  Tpersonel= class(TForm)
  protected procedure CreateParams(var Params: TCreateParams); override;

.
.
.
procedure Tpersonel.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := GetDesktopWindow 
end;
Bu kodlar sayesinde her acilan personel formu taskbarda yeni bir program acilmis gibi davraniyor.. Ve ben Personel formunda herhangi bir formu ShowModal olarak acarsam personel frmu gizleniyor.. Kullanidim kodlar ise sunlar..

Kod: Tümünü seç

            sehir:= Tsehir.create(self);
            sehir.visible := false;
            sehir.position := PoScreenCenter;
            sehir.showmodal;

2. Sorum, sehir secme olayinda, kisi hem secebilir, hem de secmekten vazgecebilir ve eski deger hala durur.. Yani kisacasi sormak istedigm $u, showmodal dan sonra bildiginiz gibi o forma erişemiyorum neden derseniz on close olayinda

Kod: Tümünü seç

Action := caFree; 
sehir := nil; 
gibi kodlar var yani, sehiri secmek istedigim yerden yaparsam dedginzi gibi, erişemedigimden dolayi hata oluşacak sanirim..?

Teşekkürler
Cevapla