Türetilmiş Formlarda Forma Nil atabilme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Türetilmiş Formlarda Forma Nil atabilme
Arkadaşlar Selamlar,
Türetilmiş ikincil formların onclose olayında Formun Action := caFree;
ettikden sonra kendisinede Nil atabilmek istiyorum. Türetilen form show olarak açıldığı için çıkışında değişkene nil atamıyorum.
Örnek: ana form kısmı
procedure a;
var
Myform: Tform;
begin
//Tform2 Türetilen Form tipi
Application.Createform(TForm2, Myform);
MyForm.Show;
//Showmodal olursa Myform := Nil; diyorsun problem olmuyor
//Show açıldığı için ana formda Nil atamıyorum
end;
Yardımcı olabilecek kişilere şimdiden teşekürler.
Saygılarımla
Türetilmiş ikincil formların onclose olayında Formun Action := caFree;
ettikden sonra kendisinede Nil atabilmek istiyorum. Türetilen form show olarak açıldığı için çıkışında değişkene nil atamıyorum.
Örnek: ana form kısmı
procedure a;
var
Myform: Tform;
begin
//Tform2 Türetilen Form tipi
Application.Createform(TForm2, Myform);
MyForm.Show;
//Showmodal olursa Myform := Nil; diyorsun problem olmuyor
//Show açıldığı için ana formda Nil atamıyorum
end;
Yardımcı olabilecek kişilere şimdiden teşekürler.
Saygılarımla
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
kim Millete hizmet ederse,
o milletin efendisidir."
s.a.
formun onclose sine
yazarsan olması lazım
kolay gelsin.
formun onclose sine
Kod: Tümünü seç
action:=cafree;
form1:=nil;
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Burdaki form1 de değişken değil zaten formun ismi. Kapatmak istediğin form hangisi ise (form1, form2 vs) aslangeri nin dediğini uygulayabilirsin.aslangeri yazdı:s.a.
formun onclose sine
yazarsan olması lazımKod: Tümünü seç
action:=cafree; form1:=nil;
kolay gelsin.
Form un türetilmiş ise ve Ana formun onclose unda böyle bişey yazma imkanın yoksa inherited in hemem altına yazabilirsin.
Kod: Tümünü seç
if not assigned(form1) then
begin
.....................
...................////formu oluştur
kapatırken
onclose olayın
action:=cafree;
form1:=nil;
kullan daha sağlıklı olur
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.
***********************************
Arkadaşlar anlatmak istediğimi anlatamadım sanırım. Türetilmiş formlarda Form ismi sistem tarafından verilir. Yani formun isminin ne olacağını bilemeyiz. Her yeni kopya için sistem Form1_1, Form1_2 gibi
kendisi isim veriyor dolayısı ile formun adını bilemeyiz. Sadece değişkenini biliyoruz "Myform: Tform;" şeklinde tanımlanan ben myform değişkenine nil atmam gerekiyor. Show attığım için Nil atamıyorum. Formla bir işim yok. Formda sadece Action:= cafree; atıyoruz. Türetilmiş formlarda forma gonderme yapmak için Self kullanılır deniliyor fakat Self:=nil; de desem yemiyor;
Marco Cantu Delphi 5 kitabı olan arkadaşlar "Türetilmiş formlar la çalışma" şeklinde anlatmış fakat bu sorun için başka teknikler kullanmalısınız deyip kesip atmış. Detay vermemiş. işte bu detay için küçük bir ipucu arıyorum.
Saygılar.
kendisi isim veriyor dolayısı ile formun adını bilemeyiz. Sadece değişkenini biliyoruz "Myform: Tform;" şeklinde tanımlanan ben myform değişkenine nil atmam gerekiyor. Show attığım için Nil atamıyorum. Formla bir işim yok. Formda sadece Action:= cafree; atıyoruz. Türetilmiş formlarda forma gonderme yapmak için Self kullanılır deniliyor fakat Self:=nil; de desem yemiyor;
Marco Cantu Delphi 5 kitabı olan arkadaşlar "Türetilmiş formlar la çalışma" şeklinde anlatmış fakat bu sorun için başka teknikler kullanmalısınız deyip kesip atmış. Detay vermemiş. işte bu detay için küçük bir ipucu arıyorum.
Saygılar.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
kim Millete hizmet ederse,
o milletin efendisidir."
Arkadaşların söyledikleri kodları ata formda değil türettiğiniz forma yazacaksınız... Yani bunun anlamı bu kodu bir defa yazarak kurtulmak degil kullandığınız her forma yazmak anlamına geliyor...
Şahsen ben hep böyle kullanıyorum.... Bir ara gozume FreeAndNil isimli bir prosedur carpmisti... Ata forumun on close olayina yazarak bir denem yapılabilir...
Şahsen ben hep böyle kullanıyorum.... Bir ara gozume FreeAndNil isimli bir prosedur carpmisti... Ata forumun on close olayina
Kod: Tümünü seç
FreeAndNil(Self);
* http://www.fahrettin.org Manzara Fotoğraflarım... 
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...

* http://delphiturkiye.gunduz.info Seminerler...

* http://www.hakmar.com.tr Kalite bir haktır...

Şu kod belki işini görür:
İyi çalışmalar.
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Assigned(MyForms[0]) then
begin
ShowMessage('Assigned');
Exit;
end;
MyForms[0] := TForm2.Create(Application);
MyForms[0].Show;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Form2: TForm2;
MyForms: array[0..100 - 1] of TForm;
implementation
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
MyForms[0] := nil;
end;
end.
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
Peki ben birşey sorayım bu noktada;
Madem bu işlemi türettiğin formda yapıyorsun o zaman neden form türetiyorsun?Türetmenin bir esprisi kalmıyor böyle bir yöntem kullandığın zaman...
Ek olarak @coderlord'un dediği ayrıca bir nil atamana gerek yok, spesifik bir deklarasyon var işlem bitiminde zaten sistem tarafından yok ediliyor.
Kolay gele..
Madem bu işlemi türettiğin formda yapıyorsun o zaman neden form türetiyorsun?Türetmenin bir esprisi kalmıyor böyle bir yöntem kullandığın zaman...

Ek olarak @coderlord'un dediği ayrıca bir nil atamana gerek yok, spesifik bir deklarasyon var işlem bitiminde zaten sistem tarafından yok ediliyor.
Kolay gele..
Neden formu türetiyorsunuz demişler. Örnek cari hesap özeti ekranınız var buna hesap kodunu yollayıp show ettiğinizde kodunu gonderdiğiniz hesabın hesap ozetini gosteriyor. Bu form sadece cari hesap kartından değil proje içindeki cari hesap kartı kullanan bütün modüllerde var her hangi bir modül içinde cari hesap kodunu yollayıp göster dendiğinde gösterir.
Aynı bir işletim sisteminde nasıl aynı exe 2 kere çalışıp ikisinde farklı şeye bakıyorsan bizdede oyle. Bu amaçla formları bu şekilde kullanıyoruz.
Bir modülde bir işlemde çalışırken onu arka plana atıp menüden başka seçeneğe gidip işlemlerinizi yapıp geri geliyorsunuz. işte bu gittiğiniz esnadada bir hesap özetine bakabilirsiniz. Hatta arkaya attığınız ekranda bir hesap özetinde olabilir.
Codelord un dediği gibi Tform tipinde değişken içine herşeyi hazırlanmış paket bir formu create edip tanımladığım değişkeni kullanıyorum.
Değişkene nil atmazsak şöyle bir test yaptık. Aynı formu aç-kapat aç-kapat yaptık 30-40 defadan sonra exe kapanıyor yada access vialation memory vs hatası veriyor.
Ama aynı işlemi showmodal açıp hemen altta değişkene nil atarsak hiç bir problem olmuyor.
Bilmem tam olarak analatabildimmi.
Cevap verenlere teşekürler
Saygılar.
Aynı bir işletim sisteminde nasıl aynı exe 2 kere çalışıp ikisinde farklı şeye bakıyorsan bizdede oyle. Bu amaçla formları bu şekilde kullanıyoruz.
Bir modülde bir işlemde çalışırken onu arka plana atıp menüden başka seçeneğe gidip işlemlerinizi yapıp geri geliyorsunuz. işte bu gittiğiniz esnadada bir hesap özetine bakabilirsiniz. Hatta arkaya attığınız ekranda bir hesap özetinde olabilir.
Codelord un dediği gibi Tform tipinde değişken içine herşeyi hazırlanmış paket bir formu create edip tanımladığım değişkeni kullanıyorum.
Değişkene nil atmazsak şöyle bir test yaptık. Aynı formu aç-kapat aç-kapat yaptık 30-40 defadan sonra exe kapanıyor yada access vialation memory vs hatası veriyor.
Ama aynı işlemi showmodal açıp hemen altta değişkene nil atarsak hiç bir problem olmuyor.
Bilmem tam olarak analatabildimmi.
Cevap verenlere teşekürler
Saygılar.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
kim Millete hizmet ederse,
o milletin efendisidir."
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
ShowModal yapmak da çözüm değil bu durumda.Hesap özetini açtık, güncel karta ulaşmak istedik (aynı şey başımda, sallamıyorum..) tekrar üstüne kart showmodal oldu, akabinden tekrar hesap özetini showmodal ettik, kısır döngü..Access violation vermesinin nedeni free ettiğin bir formun tekrar free edilmeye çalışılmasından kaynaklanıyor..Form türetmenin esprisi kalmıyor dememin nedeni, yazdığın kodun anchestor forma yazılması gereken kod olması..Eğer aynı ekran üzerinden tekrar bir cari kart çağırma ve yine cari kart üzerinden yine bir hesap özeti getirme gibi karmaşık bir hiyerarşi yoksa ShowModal kullanmaman için bir neden yok..Ancak burada birkaç düzenleme daha yapman gerekiyor ki o da modal bitiminde anchestor formu FreeAndNil ile yok etmek..
Kolay gele..
Kolay gele..