Türetilmiş Formlarda Forma Nil atabilme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
athena
Üye
Mesajlar: 92
Kayıt: 20 Eyl 2003 06:32
Konum: Antalya
İletişim:

Türetilmiş Formlarda Forma Nil atabilme

Mesaj gönderen athena »

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
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
formun onclose sine

Kod: Tümünü seç

action:=cafree;
form1:=nil;
yazarsan olması lazım
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
athena
Üye
Mesajlar: 92
Kayıt: 20 Eyl 2003 06:32
Konum: Antalya
İletişim:

Mesaj gönderen athena »

Bu şekilde atamayız Değişken form1 değil
Form ismini kendi verir bizim değişken MyForm
Özellikle Türetilmiş form olduğunu belirtmiştim.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

aslangeri yazdı:s.a.
formun onclose sine

Kod: Tümünü seç

action:=cafree;
form1:=nil;
yazarsan olması lazım
kolay gelsin.
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.
Form un türetilmiş ise ve Ana formun onclose unda böyle bişey yazma imkanın yoksa inherited in hemem altına yazabilirsin.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

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 
kolay gelsin
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
athena
Üye
Mesajlar: 92
Kayıt: 20 Eyl 2003 06:32
Konum: Antalya
İletişim:

Mesaj gönderen athena »

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.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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

Kod: Tümünü seç

FreeAndNil(Self);
yazarak bir denem yapılabilir...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

MyForm'a nil falan atamana gerek yok arkadaşım. Sen o variable'ı geçici süre kullanıyorsun. Gördüğüm kadarıyla global tanımlamamışsın. Dolayısıyla formu yarattığın procedurun çıkışında MyForm diye bir değişken zaten olmayacak.

O yüzden Action:= caFree yeterli senin için.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Şu kod belki işini görür:

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.
İyi çalışmalar.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

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... :roll:

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..
Kullanıcı avatarı
athena
Üye
Mesajlar: 92
Kayıt: 20 Eyl 2003 06:32
Konum: Antalya
İletişim:

Mesaj gönderen athena »

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.
"Millete efendilik olmaz,hizmet olur,
kim Millete hizmet ederse,
o milletin efendisidir."
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Sizin başka bir sorununuz var. Kullandığınız bileşenlerde bir sorun olabilir. Form değişkenine nil koymanın hiçbir manası yok. Stack'ta tutulan değerin içeriğini 0 yapıyorsunuz o kadar. Belleği boşaltmak gibi bir işlevi yok.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Aslında formla ilgili işlemin yapıldığı kod bloğunu gönderirseniz belki daha sağlıklı yorum yapılabilir.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

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..
Cevapla