Form olusturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
oyle
Üye
Mesajlar: 137
Kayıt: 17 Eki 2006 05:53

Form olusturma

Mesaj gönderen oyle »

Merhabalar,
Benim yapmak istedigim bir form dan kayit sayisi kadar yeni formlar üretmek.

Kod: Tümünü seç

For k:=0 To Application.ComponentCount-1 Do
       if Application.Components[k].Name='_'+IntToStr(fid) Then
           FormVar := True;

     if FormVar=False Then
      Begin
        Frmgelenmesaj :=TFrmgelenmesaj.Create(nil);
        Frmgelenmesaj.Name := '_'+inttostr(fid);
        Frmgelenmesaj.Tag := fid;
        Frmgelenmesaj.Caption :='_'+inttostr(fid);
        Frmgelenmesaj.Lbltur := '1';
        Frmgelenmesaj.show;
      End;
Yukarıdaki kodla formları olusturuyorum. Fakat mesala 5 form olusturuldugu zaman bunlardan ilk formu kapattigimda tüm formlar kapaniyor.(5 i birden) . son olusturulandan geriye dogru kapatirsam sorun yok.
Ben istiyorumki hangi form kapatilirsa sadece o form kapansin.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
formu create ederken nil yerine self dene.
birde procedurenin içinde Frmgelenmesaj ı değil
tfrmgelenmesaj tipinde tanımldığın başka bir değişkeni create etmeyi dene.
Frmgelenmesaj ın eventlarında yazmış olduğun kodlardanda kaynaklanabilir.

Kod: Tümünü seç

procedure formlarıoluştur;
var
a:TFrmgelenmesaj;
begin
.....
if FormVar=False Then
      Begin
        a:=TFrmgelenmesaj.Create(nil);
        a.Name := '_'+inttostr(fid);
        a.Tag := fid;
        a.Caption :='_'+inttostr(fid);
        a.Lbltur := '1';
        a.show;
      End;
.....
end;
bide böyle dene.
hepsi için aynı global değişkeni kullandığın için oluyor olabilir.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
oyle
Üye
Mesajlar: 137
Kayıt: 17 Eki 2006 05:53

Mesaj gönderen oyle »

Öncelikle ilgine teşekkur ederim. Ama ne yazikki olmadi. nil yerine self kullandim kabul etmedi. deklare edilmemis dedi.
Diger turlude form kapaniyorken "acess violation at adress..." hatasini veriyor.
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

Merhaba.

1) Self parametresinle create edilirse, ilk form kapatildiginda tum formlar kapatilir.
2) Nil parametresinle create ederseniz, applicationin main formuysa eger kapattiginiz form, o da application'ı dolayisiyla tum formlari kapatir.
3) Application.ComponentCount-1 do komutunuz sadece main form ile acilmis formlari gosterecek buyuk ihtimalle.
Yani
Main -> Ogrencilerform ->ogrenciekle
-> Ogretmenlerform -> ogretmenekle

bu yoldaki formlrda sadece OgrencilerForm ve OgretmenlerForm gozukecek yani ogrenciekle ve ogretmenekle Application.componentcountda gozukmeyecek (denemedim ama yanlis hatirlamioyrsam böyleydi)
4) Eger nil olarak veya create(application) parametresinle create ederseniz, application kapanana kadar o formlar kapanmaz. Ne gibi bir dezavantaji olur, forma ic bir degisken tanimlamazsaniz. Self.owner ile hangi formdan turetildigini bilemezsiniz, veya nil olur.

Bunlara dikkat ederek yaptiklarinizi tekrar gozden gecirirseniz duzgun calisir ancak tabi baska etkileyen kodlariniz varsa orasini bilemem.

Kolay gelsin
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...
... Fakat mesala 5 form olusturuldugu zaman bunlardan ilk formu kapattigimda tüm formlar kapaniyor. (5 i birden) . son olusturulandan geriye dogru kapatirsam sorun yok.
Ben istiyorumki hangi form kapatilirsa sadece o form kapansin.
- AnaForm isimli bir formun var diyelim... Bu ana formdan oluşturacağın her form birbirinden bağımsızdır. Yani ilk oluşturduğun ile son oluşturduğun bağımsız birer formdur. Eğer sen her oluşturduğun form içerisinden bir fonksiyon ile o kendinden türetiyorsan karşılaştığın sorunsala neden oluyorsun demektir.

- Form oluşturma eylemini her defasından AnaForm yapıyorsa bu sorunsalla karşılaşmazsın.

Örnek : iki button bulunur. Birincisi ile form oluşturursun, ikincisi ile verdiğin numaralı formu yok edersin. İkinci buton yerine ilgili butonun köşesindeki form kapatma [X] başlık butonuna da basabilirsin.

Kod: Tümünü seç

Var
  xFormNumarasi : Integer=0;

procedure TForm1.YeniFormOlustur;
Var
  xxx    : TForm;
begin
  Inc(xFormNumarasi);
  xxx := TForm.Create(Self);
  With xxx do
  begin
    Name      := Format('Form_%.3d', [xFormNumarasi]);
    Caption   := Name;
    Width     := 200;
    Height    := 100;
    Visible   := True;
    Left      := xFormNumarasi*100;
    Tag       := xFormNumarasi;
  end;
end;

Procedure TForm1.FormuYoket(FormNo:Integer);
Var
  Sayac : Integer;
begin
  Sayac := 0;
  Repeat
    If (Components[Sayac] is TForm)
    then If TForm(Components[Sayac]).Tag = FormNo
         then TForm(Components[Sayac]).Free;
    Inc(Sayac);
  Until (Sayac >= ComponentCount);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  YeniFormOlustur();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   FormuYoket(StrToInt(Trim(InputBox('FormYoket','FormNumarası',''))));
end;

- Dediğim gibi her yeni formu create etme işlevini AnaForm üstlenmesini sağlamalısın. Bu sayede ana form yani programın sonlanana kadar herhangi bir türetilmiş formu kapatma özgürlüğüne sahip olursun...
Resim
Resim ....Resim
oyle
Üye
Mesajlar: 137
Kayıt: 17 Eki 2006 05:53

Mesaj gönderen oyle »

Herkeze teşekkürler.
Cevapla