Uygulamada ki formlar uygulama içinden nasıl bulunur
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Uygulamada ki formlar uygulama içinden nasıl bulunur
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ı?
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
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;
Kod: Tümünü seç
the right is the right
- 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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
@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.
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
s.a.
kendi programınızdaki formlar mı yoksa dışardaki bir exenin içindeki formlar mı?
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
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.
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.
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
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.
bla bla projesi.dpr derken projenin yolu ve adı olduğunu bilmeyenler varsa eklemek isterim
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 );

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
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
@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.
@aslangeri kendi projem üstat.
Re: Uygulamada ki formlar uygulama içinden nasıl bulunur
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
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ı.
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
Başlığı görüp merak edenler olacaktır; Stringden nasıl create edeceğini göstereyim. Aslında aynı şeyler.
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.

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;

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( ... );
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;
Başarılar.