Uygulamada ki formlar uygulama içinden nasıl bulunur

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen AraGorN »

bir proje yazıyorum ve projede kullandığım formları bir main formdaki uses kısmına ekliyorum ama bunun dışında main formun kodunun içinde de bu uygulamada kaç form var hangi formlar var bilgisini almak istiyorum sanırım biraz reverse engineering oluyor, bunun hakkında fikri olan var mı?
Lanista
Üye
Mesajlar: 18
Kayıt: 14 Tem 2008 11:31

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen Lanista »

Kod: Tümünü seç

var I: Integer;
     formsayisi: Integer;
begin
  formsayisi := 0;
  for I := 0 to Application.ComponentCount - 1 do
     begin
       if Application.Components[I] is TForm then Inc(Formsayisi);
     end;
  Showmessage(Inttostr(Formsayisi));
end;
uygulamadaki butun formları alabilirsiniz(Ana form dahil).

Kod: Tümünü seç

the right is the right
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: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen sabanakman »

veya

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer; f:TForm;
begin
  ListBox1.Items.Clear;
  for i:=0 to Screen.FormCount-1 do begin
    f:=Screen.Forms[i];
    ListBox1.Items.Add(f.Name+' -> '+f.Caption);
  end;
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen AraGorN »

@sabanakman teşekkürler üstat ama bu işimi görmüyor çünkü bu formlar daha yartılmadılar... yani ben henüz yaratmadığım formlar dahil uygulamadaki bütün formların listesini almak istiyorum. bunu yapan programlar varmış sanırım, bir exe yi alıp içindeki tüm formları ve hatta label a kadar herşeyini söyleyen. bunların mantığında birşey olması lazım sanırım. dediğim gibi daha formları create etmediğim için bulamıyorum bu yapı ile.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen aslangeri »

s.a.
kendi programınızdaki formlar mı yoksa dışardaki bir exenin içindeki formlar mı?
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen mrmarman »

Merhaba.

Kendi projen ise, basit bir ikinci proje oluştur. Asıl projenin DPR dosyasından basit string operasyonla parse ederek UNIT listesini al. Oradan da UNIT'leri teker teker open ederek class(TForm) sınıfından olan satırları tarattır. Sana projendeki tüm FORM'lar liste olarak çıkar. Bunları MEMO'da biriktirdiğini varsayalım Ana projeye bu listeyi koy işin görülmüş olur. Bunu çok sayıda formun olduğunu ve bir liste yapmak külfetinden kurtulmak için istediğini varsayarak yazdım.

Çok zor bir işlem değil. EXE içinden bunu yapmak için eğer yapıyorsan EXEPacker kullanmaman (şahsen sürekli kullandığım için söylüyorum) gerekir veya bu EXE'yi hafızaya açarken process üzerinden yürümen gerekir ki "attığın taş ürküttüğün kuşa değsin" misali kendi programındaki listeyi offline olarak tutmak en mantıklısı derim.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen mrmarman »

Yemek arası senin için parse metodu ile bir kod hazırladım. Kullan ve sonucu bildir.

Boş bir proje oluştur ve forma bir tane MEMO ve button ekle.

Butona şunu yaz.

Kod: Tümünü seç

  FormListesi(  'c:\bla bla projesi.dpr', Memo1 );
bla bla projesi.dpr derken projenin yolu ve adı olduğunu bilmeyenler varsa eklemek isterim :lol:

Kod: Tümünü seç

Procedure FormListesi( DPRDosya:TFileName; Memo:TMemo );
Var
  Icerik, Ara, S : String;
  Dummy, UnitList, FormList  : TStringList;
  Sayac,  GeriSay, BoslukSay : Integer;
begin
  Memo.Clear;
  if NOT FileExists( DPRDosya ) then begin
    MessageDlg('DPR Dosya mevcut değil.'#13'Lütfen önce bir tane seçiniz.', mtError, [mbOk], 0);
    Exit;
  end;

  Dummy := TStringList.Create;
  Dummy.LoadFromFile( DPRDosya );
  Icerik := Dummy.Text;

  UnitList := TStringList.Create;
  Ara := ' in ''';
  While pos(Ara, Icerik) > 0 do begin
    Delete(Icerik, 1, Pos(Ara, Icerik) + Length(Ara)-1);
    UnitList.Add( ExtractFilePath( DPRDosya ) + Copy(Icerik, 1, Pos('''', Icerik)-1) );
  end;
  // Dilersen Unit Listesini Kaydedebilirsin.
  // UnitList.SaveToFile( ChangeFileExt(Application.Exename, '_Units.TXT') );
  FormList := TStringList.Create;
  for Sayac := 0 to UnitList.Count - 1 do begin
    Dummy.LoadFromFile( UnitList[Sayac] );
    Icerik := Dummy.Text;
    Ara := 'CLASS(TFORM)';
    while Pos(Ara, UpperCase(Icerik)) > 0 do begin
      s := Trim( Copy(Icerik, 1, Pos(Ara, UpperCase(Icerik))-1 ) );
      // Şimdi elimizde '  TFormMerkez =' ve öncesi var...
      // geriye doğru 1. boşluk eşittirden bir öncesi
      //              2. boşluk Form başlığının başı..
      GeriSay := Length( S );
      BoslukSay := 0;
      while BoslukSay < 2 do begin
        Dec(GeriSay);
        if S[GeriSay] = ' ' then Inc(BoslukSay);
      end;
      FormList.Add( Copy(S, GeriSay, Length(S)-GeriSay) );
      System.Delete( Icerik, 1, Pos(Ara, UpperCase(Icerik))+Length(Ara)-1);
    end;
  end;
  // Dilersen Form Listesini de Kaydedebilirsin.
  // FormList.SaveToFile( ChangeFileExt(Application.Exename, '_Forms.TXT') );
  Memo.Lines.Add( StringOfChar( '-', 50 ) );
  Memo.Lines.Add( 'Unit Listesi' );
  Memo.Lines.Add( StringOfChar( '-', 50 ) );
  Memo.Lines.AddStrings( UnitList );
  Memo.Lines.Add( '' );
  Memo.Lines.Add( StringOfChar( '-', 50 ) );
  Memo.Lines.Add( 'Form Listesi' );
  Memo.Lines.Add( StringOfChar( '-', 50 ) );
  Memo.Lines.AddStrings( FormList );
  FormList.Free;
  UnitList.Free;
  Dummy.Free;
end;
Dosya ekleri
Delphi Form List.rar
Proje kaynak kodu ve EXE'si
(187.52 KiB) 131 kere indirildi
Resim
Resim ....Resim
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen AraGorN »

@mrmarman dostum çok teşekkür ederim, zahmet etmişsin gerçekten, yalnız benim o form listesine nesne olarak ihtiyacım var string olarak değil, amacım application içindeki bütün formların classlarını RegisterClass() fonksiyonuna vererek açılışta register etmek, bu yüzden formların classlarına nesne olarak ihtiyacım var.

@aslangeri kendi projem üstat.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Uygulamada ki formlar uygulama içinden nasıl bulunur

Mesaj gönderen mrmarman »

Hocam kaynak kod için zahmet olmadı da bu başlıktan yanlışlıkla "EXE'den form isimlerini ve/veya classlarını alırken object olarak geleceği" yanlış kanaatine varmasınlar sakın :lol:

Ayrıca string liste oluşturup buradan formları oluşturmak zor değil ki ... Aşağıda bir örnek veriyorum.

Normalde bir formu dinamik olarak nasıl create ediyorsun ?
Şöyle olmalı.

Kod: Tümünü seç

  if NOT Assigned( Form2 ) 
    then Application.CreateForm(TForm2, Form2);
  Form2.Showmodal;
Zaten Register etme işini biliyorsun. Sana bir üst başlıkta verdiğim fonksiyonda Form Listesi gelirken sınıf adları şeklinde geliyor zaten ya, işte onları register edecek şekilde bir procedure altına copy/paste yapacaksın o kadar. RegisterClass() fonksiyonuna verirken bu isimleri tırnak içine almazsan nesne olur zaten :wink:

Kod: Tümünü seç

 RegisterClass( TFormHizliAra    );
 RegisterClass( TFormOgrenci     );
 RegisterClass( TFormPersonel    );
 RegisterClass( TFormAylikPlan   );
 RegisterClass( TFormDonemSecimi );
 RegisterClass( TFormPlanDokum   );
 RegisterClass( TFormCDRW        );
 RegisterClass( TFormFaturaDurum );
 RegisterClass( ... );
 RegisterClass( ... );
 RegisterClass( ... );
 RegisterClass( ... );
Başlığı görüp merak edenler olacaktır; Stringden nasıl create edeceğini göstereyim. Aslında aynı şeyler.

Kod: Tümünü seç

Var
  Sinif : TFormClass;
  Comp  : TComponent;
begin
  // RegisterClass() işlemini Projenin ana formunun OnCreate olayında
  // veya bir procedure altında, ismini bulduğun tüm formlar için yapacaksın.
  RegisterClass( TForm2 );
  // Bundan sonra string'den bu daha önce register edilmiş sinifa ulaşmak kalıyor.
  Sinif := TFormClass(FindClass( 'TForm2' ));
  Comp  := TForm( FindComponent(Sinif.ClassName) );
  if NOT Assigned( TForm(Comp) )
    then Application.CreateForm( Sinif, Comp );
  TForm(Comp).ShowModal;
end;
Yani kısaca yapman gereken şey, dilersen formun create olayında dilersen lazım olduğunda zaten sınıfının adını bildiğin tüm formları RegisterClass() fonksiyonu ile register etmek.

Başarılar.
Resim
Resim ....Resim
Cevapla