Türetilmiş Formlar İçin Assigned Kontrolü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

Selamlar.

Konuyla ilgili konuşulmuş birkaç topic buldum ancak çözüm olmadı. Türetilmiş formların class isimlerini bir procedure'ye parametre vererek tek bir merkezden oluşturmaya, daha önce oluşturulduysa tekrar oluşturmadan show etmeye uğraşıyorum. İlk işlemde problem yok ancak daha önce oluşturup oluşturulmadığını tespit edemiyorum. TComponentClass ya da ata formun class'ı ya da formun kendi class'ını kullanarak deniyorum ancak kullandığım yönteme göre ya hepsinde nil dönüyor ya da hiç birinde nil dönmüyor. Şöyle bir şey yaparsam;

Kod: Tümünü seç

if Assigned(TOlusturdugumForm(Ataform)) then
elbette ki sorunsuz olarak çalışıyor. Fakat bunu bir procedure'ye parametre olarak gönderdiğimde ve bu parametreyle kontrol etmeye çalıştığımda

Kod: Tümünü seç

procedure FalanFilan(CurrentForm: TComponentClass);
begin
  if Assigned(CurrentForm(Ataform)) then
end|
syntax hatası veriyor (Missing operator or semicolon). Yukarıdaki blokta TComponentClass yerine birkaç farklı class daha denedim. Nedir bu işin espirisi?
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen emin_as »

Neden buna gerek duyuyorsun, anlayamadım. Assigned component a deger atanıp, atanmadıgını veya daha açık ifadeyle parametre olarak geçilen bilginin nil olup, olmadıgnı kontrol eder.

Pointer, Tmethod ve TObject olarak 3 farklı assigned fonksiyonu vardır. Tüm görsel bileşenlerin atası TObject oldugundan assigned için özel bir tiple göndermene gerek yoktur.

Eger amacın gönderilen formun tipini ögrenmekse, bunun assigned degil is kullanmalısın.

Eğer formlar açılışta otomaik yaratılmamışlarsa, rasgele degerler içerirler. Bu nedenle form değişkenlerini nil e eşitlemeli veya onları kullanmadan önce create etmelisin.

Eğer amacın form yaratırken, formun ismini göndermek ise aşagıdaki gibi bir fonksiyon kullanabilrsin.

Kod: Tümünü seç

function FormYarat(s: string): TForm;
var
  AFormClass  : TFormClass;
begin
  AFormClass := TFormClass(FindClass(s)); 
  result:= AFormClass.Create(Application);
end;
Fakat bu fonksiyonun çalışması için s ile gönderdigin form sınıfı register edilmelidir.

Kod: Tümünü seç

RegisterClass(TForm1);
Form1:=FormYarat('TForm1');  // string olarak form1 i yolluyoruz
Form1.Show;
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen sabanakman »

Aslında if Assigned(TOlusturdugumForm(Ataform)) then kodu ile if Assigned(Ataform) then kodu arasında hiç fark yoktur. 1. kodlamada tip değiştirerek kodlama yapılmış o kadar. Sizin bu dönüşümü yapmanız şart değil direkt olarak if Assigned(Ataform) then şeklinde de kullanabilirsiniz.

D:Cevap yazmada geç davranmışım :D .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen Lost Soul »

Kod: Tümünü seç

Function FormOlustur(SinifAdi: TComponentClass): TForm;
var
  i: Integer;
Begin
  Result := nil;
  for i := 0 to Application.ComponentCount - 1 do
  Begin
    if Application.Components[i] is SinifAdi then
    Begin
      Result := (Application.Components[i] as TForm);
      Break;
    End;
  End;

  if Result = nil then Result:=Tform(SinifAdi.Create(Application));
End;
Oluştur
TForm(Form1):=FormOlustur(TForm1);
Sil
if Form1<>nil then FreeAndNil(Form1);
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

Öncelikle ilginiz için teşekkürler.

@emin_as;

Verdiğin örneği forumda arama yaparken @sabanakman'ın verdiği bir cevapta incelemiştim, bunun dışında benzer bir yapıyı farklı bir projede de kullandım fakat bu metodda iki nedenden ötürü işimi görmedi;

1. FindClass kullanarak kontrol uyguladığımda da aynı şekilde nil olarak gördüğü için aynı formu tekrar tekrar oluşturuyor.
2. RegisterClass kullandığımda her türetilmiş form için bu işlemi uygulamam gerekecek, bu durumda tek bir procedureye parametre olarak göndermenin espirisi de kalmıyor. Sadece bu procedure içinde oluşturma işleminden önce gelen parametreye göre register işlemi uygulayarak pratik bir çözüm uygulanabilir fakat bu durumda bir de unregister konusu gündeme gelecek.

@sabanakman;

Hocam amacım dönüşüm değil, bahsettiğin gibi sadece ata formu kontrol eden bir yapı da kurguladım, fakat sorguladığım sınıfa göre ya tamamen nil dönüyor ya da tam tersi ancak ata formun referansıyla kontrol edilirse problem olmuyor. Asi halde formun oluşturulup oluşturulmadığını tespit edecek bir işaret bulamıyorum. Sadece açılan formları bir menüye ekleyerek var mı diye kontrol ettirebiliyorum ancak bunun için de yine oluşturmak ve varsa free etmek gerekiyor. Ayrıca bu işlem de stabil çalışmıyor, aynı formu birkaç kez oluşturup kapattıktan sonra tekrar oluşturup eklediğim menü item'i aracılığıyla formu çağırdığımda, free ettiğimi sandığım en son form ve en son create ettiğim form karşımda duruyor : )

@Lost Soul;

Örneğindeki kodlar da yukarıda bahsettiğim yöntemin sonucunu döndürür zira sen de nil kontrolü uyguluyorsun. Nil kontrolünü çok farklı senaryolarla uyguladım bahsettiğim gibi tutarsız sonuçlar veriyor.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

İlginçtir formların tamamı run time create edilmesine rağmen nil değil hiç biri ve işleme başlamadan önce manual olarak nil atamama rağmen kontrolde nil dönmüyor : )
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen Lost Soul »

aLonE CoDeR yazdı:Öncelikle ilginiz için teşekkürler.


@Lost Soul;

Örneğindeki kodlar da yukarıda bahsettiğim yöntemin sonucunu döndürür zira sen de nil kontrolü uyguluyorsun. Nil kontrolünü çok farklı senaryolarla uyguladım bahsettiğim gibi tutarsız sonuçlar veriyor.

FreeAndNil o tutarszlık işine kökten çözüm getiriyor.
Bkz: viewtopic.php?f=2&t=26685
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

Hocam FreeAndNil dahil tüm alternatifleri denedim. Parametre gönderdiğim form nil değil ilk açılışta bile. Ve kullandığım tüm yöntemler aynı formu tekrar tekrar oluşturuyor..
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen Lost Soul »

Ben programlarımda formlarımı run-time da yukarıda verdiğim şekilde create edip siliyorum.

kullandığınız kodu yayınlar mısınız.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

Form türetiyor musun peki? Bir de formları modal mı açıyorsun? Kodun hangi bölümünü yayınlayayım, create ettiğim yordamı mı? Örneğin emin_as'ın verdiği kod bloğunu da monte ettim tekrar denedim belki gözümden kaçan bir şey var diye, sonuç aynı. Senin kodları da monte edip deneyeceğim bir de..
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen Lost Soul »

aLonE CoDeR yazdı:Form türetiyor musun peki? Bir de formları modal mı açıyorsun? Kodun hangi bölümünü yayınlayayım, create ettiğim yordamı mı? Örneğin emin_as'ın verdiği kod bloğunu da monte ettim tekrar denedim belki gözümden kaçan bir şey var diye, sonuç aynı. Senin kodları da monte edip deneyeceğim bir de..

Kod: Tümünü seç

      tform(BulIL):=FormOlustur(TBulIL);
      BulIL.ShowModal;
      if BulIL.ModalResult=mrok then
        Begin
          oil.EditValue:=BulIL.qsor.FieldByName('ILKODU').AsInteger;
          oil.PostEditValue;
        End;
      if BulIL<>nil then FreeAndNil(BulIL);
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen emin_as »

Daha önce yazdıgım formyarat s ile geçtigin form sınıfını yaratmak içindi, aşagıdaki örnek ise, formları dolaşıp, verilen sınıfta bir form yoksa yaratıyor, varsa onun adresini döndürüyor. Kodu deneyemedim, ama çalışıyor olması lazım. Hata kontrolları koymadım, sınıfın bulunmaması durumuna göre hata kontrolu eklemelisin.

Kod: Tümünü seç

function FormYarat(s: string): TForm;
var
  AFormClass  : TFormClass;
  i  : integer;
begin
  AFormClass := TFormClass(FindClass(s)); 
  for i:=0 to screen.Formcount-1 do
    if Screen.Forms[i] is AFormClass then 
  begin
      result:=Screen.Forms[i];
      exit;
  end;
  result:= AFormClass.Create(Application);
end;
Fakat formları anaformun create bölümünde register etmelisin.

Kod: Tümünü seç

  RegisterClass([TForm1,TForm2,TStokForm,TCariForm]);
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: Türetilmiş Formlar İçin Assigned Kontrolü

Mesaj gönderen aLonE CoDeR »

RegisterClass hariç çözüm oldu bu yöntem, teşekkürler.
Cevapla