Bir formu birden fazla defa olusturup kullanmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Bir formu birden fazla defa olusturup kullanmak

Mesaj gönderen Burhan_ast »

Arkadaslar merhaba,

Rapor ciktilarilarini almasi icin kullanicinin kriterleri belirledigi bir MDICHILD rapor ekranim var ve bu formu ayni ozelliklere sahip olan bolumlerin ortak kullanmasini istiyorum, fakat problemim su bu formu 1 den fazla defa olusturup kullanamaiyorum

Bu sekilde renk modulu icin bu formu olusturuyorum ve goruntuluyorum
procedure TFrm_Ana_form.Act_Renk_baglanti_raporlariExecute(Sender: TObject);
begin
Try
Screen.Cursor := CrSqlWait;
if Frm_ser_rapor=nil then
begin
Frm_ser_rapor := TFrm_ser_rapor.Create (Self);
Frm_ser_rapor.Sta_State.State:=SM_Kartlar;

Frm_ser_rapor.Rapor_tipi__sabit_filtre:=Rapor_tipi__sabit_filtre_renk;

Frm_ser_rapor.Master__rapor_tablosu := 'Renk';
Frm_ser_rapor.Master__Select := Renk__select;
Frm_ser_rapor.Master__tablo_adi := Renk__tablo_adi;
Frm_ser_rapor.Master__Tablo_as := Renk__tablo_as;
Frm_ser_rapor.Master__sabit_filtre := Renk__sabit_filtre;
Frm_ser_rapor.Master__kullanim := Renk__kullanim;
// Frm_ser_rapor.Master_indeks :='';
// Frm_ser_rapor.Master_indeks_siralama_sekli :='';
// Frm_ser_rapor.Master__filtre :='';


Frm_ser_rapor.Detay__rapor_tablosu := 'Stok_kartlari';
Frm_ser_rapor.Detay__Select := Stok__select;
Frm_ser_rapor.Detay__tablo_adi := Stok__tablo_adi;
Frm_ser_rapor.Detay__Tablo_as := Stok__tablo_as;
Frm_ser_rapor.Detay__sabit_filtre := stok__sabit_filtre_renk_rapor;
Frm_ser_rapor.Detay__kullanim := Stok__kullanim;
// Frm_ser_rapor.Detay_indeks :='';
// Frm_ser_rapor.Detay_indeks_siralama_sekli :='';
// Frm_ser_rapor.Detay__filtre :='';

Frm_ser_rapor.Register_indeks_adi:='Frm_stk_renk_rapor';
SetMDIChildCaption(Frm_ser_rapor,'Renk raporlari');
end;
Finally
Screen.Cursor := CrDefault;
Frm_ser_rapor.Show;
End;
end;


Benim yapmak istedigim form MDICHILD oldugu icin uretici bolumu icinde butona basildiginda bur formu bir daha olusturmak orada parametrik olan bolumleri degistirecegim ve ekranda renk icin acilan pencere kapatilmadan bu rapor formundan yararlanilip yeni bir form seklinde gostermek istiyorum, ayrica

procedure TFrm_Ser_Rapor.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Frm_ana_form.Register_Kayitno_Yaz(TBL_Rapor_tipi,TBL_Rapor,Nil, Nil,Nil, Register_indeks_adi);
Frm_ana_form.Register_indeks_yaz(Rapor_tipi_indeks, Rapor_tipi_indeks_siralama_sekli, Rapor_tipi_filtre, Rapor_indeks, Rapor_indeks_siralama_sekli, Rapor_filtre, Master_indeks, Master_indeks_siralama_sekli, Master_filtre, Detay_indeks, Detay_indeks_siralama_sekli, Detay_filtre, '','','',Register_indeks_adi,4);
Action := caFree;
Frm_ser_rapor:=nil;
end;

Seklinde con olarak formun close sirasinda islem yapiyorum eger formu ornegin Frm1_Ser_rapor, Frm2_ser_rapor, Frm3_ser_rapor seklinde olusturursam Frm_ser_rapor:=nil; seklinde nasil bosaltabilirim, yani formun ismini kullanmadan Nil nasil yapabilirim

Burhan Cakmak
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

kodunun tamamını okumadım ama belki
Frm_ser_rapor:=nil;
yerine
(Sender as TFrm_ser_rapor):=nil; dene istersen. belki sorunun çözülür.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

İsim Mehmet idi değil mi?

Öncelikli olarak Source kod gönderiyorsan forumdaki mesaj yazılan alanın üzerinde Code yazan bir buton göreceksin, oraya basarak kod bloağunu açabilirsin,

Kod: Tümünü seç

örenğin ben bu satırı code butonuna basarak başlattım
ve sonrada tekrar basarak kod bloğunu bitirdim :)

Eğer bu şekilde gönderirsen kod bölümleri daha okunaklı bir hal alacaktır.

Daha sonra yanıtına geldiğimizde ise, herhangi bir formu şu şekilde düşün. Bu benim bir prototipi ve bu prototipte isim kullanmamalıyım. Yani sabit isim olmamalı bunu bir Type olarak kullanmalıyım.

Yani TFrm_ser_rapor(Sender).Show gibi kullan.

Daha sonra çağırdığın yerlerden de o formunu bir Tip olarak kullanacağın için bir sorun çıkmaz. Bir nevi nesne tanımlamış oluyorsun. Yani senin tanımladığın yeni bir Form Nesnesi oluyor.

Umarım anlatabilmişimdir.
Bir de bir tavsiyede daha bulanacağım, Kodlarını yazarken blok girinti ve çıkıntılarına dikkat et aksi takdirde ileride çok sorun yaşarsın. (Özellikle debug ve kontrollerde)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

@Kuri_TLJ dediklerine ilaveten
herhangi bir class ın Create procedure ü o class için bir memory bloku ayrır ve bununbaşlangıç adresini oluşturur. Yani bir adres oluşturur ki bu class a ulaşmak istediğinizde Kulağından :) tutup getirebilsin. İşte bu kulağa bir ism veriyorsunuz. Ahmet mehmet gibi.
Yazdığınız kodda, class ın close unda nil atamasını Ahmet için yapıyosuz, ama aynı class mehmet içinde çalışacak ama close eventinde ahmet yazıyor. Hata burdan kaynaklanıyor.

Bi tarihte bende çok tırmalamıştım ve ben çözümü TList :) te bulmuştum. Ahmet mehmet yerine MyList[x] gibi kullanmayı öneririm. Daha önceleride benzer konular için hep yamıştım, forumda TList arattırırsan bulabirisin sanırım

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 !!!
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Malesef olmadi

Mesaj gönderen Burhan_ast »

Merhabalar,

Kuri_Tlj oncelikle oncelikle bilgilendiri mesajinizdan dolayi tesekkur ederim, bunu bir manali tesekkur gibi anlamayiniz cunku nitekim dediginiz kod meselesinin nasil yapildigini bende merak ediyordum ama yukaridaki butonlar inanin hic ilgimi cekmedi ve bu nedenle hic denemedimde ama baska bir soruma cevap ararken baska bir sey ogrendim bundan dolayi size minnettarim,

Simdi gonderdigim kodu yeniden gonderiyorum

Kod: Tümünü seç

procedure TFrm_Ana_form.Act_Renk_baglanti_raporlariExecute(Sender: TObject);
begin
      Try
        Screen.Cursor := CrSqlWait;
        If TFrm_ser_rapor=nil then
        begin
                Frm_ser_rapor := TFrm_ser_rapor.Create (Self);
                Frm_ser_rapor.Sta_State.State:=SM_Kartlar;

                Frm_ser_rapor.Rapor_tipi__sabit_filtre:=Rapor_tipi__sabit_filtre_renk;

                Frm_ser_rapor.Master__rapor_tablosu     := 'Renk';
                Frm_ser_rapor.Master__Select            := Renk__select;
                Frm_ser_rapor.Master__tablo_adi         := Renk__tablo_adi;
                Frm_ser_rapor.Master__Tablo_as          := Renk__tablo_as;
                Frm_ser_rapor.Master__sabit_filtre      := Renk__sabit_filtre;
                Frm_ser_rapor.Master__kullanim          := Renk__kullanim;
//                Frm_ser_rapor.Master_indeks                 :='';
//                Frm_ser_rapor.Master_indeks_siralama_sekli  :='';
//                Frm_ser_rapor.Master__filtre                :='';


                Frm_ser_rapor.Detay__rapor_tablosu     := 'Stok_kartlari';
                Frm_ser_rapor.Detay__Select            := Stok__select;
                Frm_ser_rapor.Detay__tablo_adi         := Stok__tablo_adi;
                Frm_ser_rapor.Detay__Tablo_as          := Stok__tablo_as;
                Frm_ser_rapor.Detay__sabit_filtre      := stok__sabit_filtre_renk_rapor;
                Frm_ser_rapor.Detay__kullanim          := Stok__kullanim;
//                Frm_ser_rapor.Detay_indeks                 :='';
//                Frm_ser_rapor.Detay_indeks_siralama_sekli  :='';
//                Frm_ser_rapor.Detay__filtre                :='';

                Frm_ser_rapor.Register_indeks_adi:='Frm_stk_renk_rapor';
                SetMDIChildCaption(Frm_ser_rapor,'Renk raporlari');
        end;
      Finally
                Screen.Cursor := CrDefault;
                Frm_ser_rapor.Show;
      End;
end;
Evet kodun sekli bu malesef dediginiz gibi bir turlu cozemedim olayi, kod uzerinde duzenleme yapabilirseniz minnettar olacagim,

Ayrica Freeman35 beyefendinin dedigi gibi close eventta da bir problem vardi bunuda kod olarak duzenleyebilirseniz memnun olurum...

Kod: Tümünü seç

procedure TFrm_Ser_Rapor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   Frm_ana_form.Register_Kayitno_Yaz(TBL_Rapor_tipi,TBL_Rapor,Nil, Nil,Nil, Register_indeks_adi);
   Frm_ana_form.Register_indeks_yaz(Rapor_tipi_indeks, Rapor_tipi_indeks_siralama_sekli, Rapor_tipi_filtre, Rapor_indeks, Rapor_indeks_siralama_sekli, Rapor_filtre, Master_indeks, Master_indeks_siralama_sekli, Master_filtre, Detay_indeks, Detay_indeks_siralama_sekli, Detay_filtre, '','','',Register_indeks_adi,4);
   Action := caFree;
   Frm_ser_rapor:=nil;
end;
Saygilar...

Burhan Cakmak
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

walla yukarıda anlatmaya çalıştım ama sanırım kısa code yazma alışkanlığımdan dolayı sanırım anlaşılmadı. ha birde benim prensibim balık tutmayı öğretmek o yüzden çok ince detaylı yazmam.
Öncelikle TList i bir inceleyin nasıl kullanıldığını vs. gibi.
Bir başka yöntem ama bu kısıtlayıcı bir yöntem.
Formun public yada private inde bir değişken tanımlayın. mesala

Kod: Tümünü seç

...
HangiForm : Byte;
....
bunu create ettiğiniz bölümde hangi form olduğunu belirtmek için değer atayın

Kod: Tümünü seç

....
 IlkForm := MyForm.Create(Nil);
HangiForm :=1 ;
.....
.....
.....


...
DigerForm := MyForm.Create(Nil);
HangiForm :=1 ;
.....


//Formun Close unda ise

   case Self.HangiForm of
          1 : IlkForm := nil;
          2 : DigerForm := nil;
   end;
yukarıdaki mantık işinizi çözer. Bir dipnot. class içinde class'a verdiğiniz adı kullanmayın onun yerine Self.HangiForm gibi kullanın
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 !!!
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Tsk,

Mesaj gönderen Burhan_ast »

Sayin Freeman35 ve diger arkadaslar,

Problemi hallettim tsk

Burhan Cakmak
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

defalarca söyledim, problemi halletmene sevindim, eh birde nasıl hallettiğini yazarsan muhtemeken aynı sorunla karşılaşan yada karşılaşacak kişiler de sevinecektir :)
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 !!!
Cevapla