Başka Uygulamada Bileşenin Sınıf Hiyerarşisini Alma.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Başka Uygulamada Bileşenin Sınıf Hiyerarşisini Alma.

Mesaj gönderen ofenX »

Merhaba,
Her hangi bir programın içinde bulunan bir bileşenin tobject e varana kadar sınıfları alınabilir mi?
Mesela

Kod: Tümünü seç

type 
tb1=class (tbutton)
end;

tb2=class(tb1)
end;

tb3=class(tb2)
end;

Delphi deki uygulamada bileşenin üzerine gelip.
tb3
tb2
tb1
tobject
şeklinde alabiliyorum. Ama exe ye çevrili bir programda bunu almayı yapamadım.
Bunu buradaki mesajlardan birine daha ayrıntılı bir cevap vermek için soruyorum.

Böyle bir şey almam mümkün mü? Yoksa exe leşen bir uygulamada en son olan tb3 olarak mı saklanıyor.
Herkese kolay gelsin.
En son ofenX tarafından 25 Mar 2006 11:35 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  ClassRef: TClass;
begin
  ListBox1.Clear;
  ClassRef := Sender.ClassType;
  while ClassRef <> nil do
  begin
    ListBox1.Items.Add(ClassRef.ClassName);
    ClassRef := ClassRef.ClassParent;
  end;
end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba Sadettin hocam,
Cevabınız için teşekkür ederim. Hocam her şeyi hazırladık sadece yemi misinaya takmayı beceremedim.

Ben timer kullandığım için sender i kullanamıyorum. İstediğim bileşen için
WindowFromPoint fonksiyonunu kullanıyorum. Ordan aldığım değerler de handle a çevrilmiş oluyor. Sender i kullanmadan ya da sender i kullanarak nasıl sizin verdiğiniz örneğe uyarlayabilirim? Veya handle larını biliyorum handle numarasından örneğe uyarlama yapılabilir mi?

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

FindControl fonksiyonu işini görür....
findVCLWindow da kodunu biraz kisaltir ;)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

sadettinpolat yazdı:FindControl fonksiyonu işini görür....
findVCLWindow da kodunu biraz kisaltir ;)
Malesef hocam bu şekilde bende olmadı. Daha önce bu tür bir şeyi twincontrol bileşeni tanımlayarak denemiştim olmamıştı. Sanırım bu findcontrol ü de kullanmıştım. Ya da kullanamamıştım. :oops:

Hocam bu delphi de çalışan programda kullandığım zaman işe yarıyor. Ama bu programım çalışırken başka exe li bir programdaki bileşeni almaya çalıştığımda Acces violation hatası alıyorum. Şöyle örnekleyeyim. Sizin verdiklerinize göre şuan çalıştırdığım delphi programının üzerinde bulunan bir bileşenin handle ını aşağıdaki gibi aldığımda bana düzgün cevap veriyor.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);


var
  ClassRef: TClass;
begin
  ListBox2.Clear;
 // ClassRef := findcontrol(1247350).ClassType;
    ClassRef := findcontrol(strtoint(edit1.text)).ClassType;
  while ClassRef <> nil do
  begin
    ListBox2.Items.Add(ClassRef.ClassName);
    ClassRef := ClassRef.ClassParent;
  end;

Ama başka exeli bir programı çalıştırıp üzerindeki bileşene gelip handle ını alıp burada kullanınca hata veriyor. Mesela o programdaki bileşen 1247350 idi

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);


var
  ClassRef: TClass;
begin
  ListBox2.Clear;
 ClassRef := findcontrol(1247350).ClassType;
//    ClassRef := findcontrol(strtoint(edit1.text)).ClassType;
  while ClassRef <> nil do
  begin
    ListBox2.Items.Add(ClassRef.ClassName);
    ClassRef := ClassRef.ClassParent;
  end;

Acaba nerede hata yapıyorum? :oops:
findvclwindow yazdığınızı yeni gördüm. Onu denemeye gerek duymadım sanırım handle yerine bulunduğu konumu parametre giriyor.

Tekrar teşekkür ederim hocam. İyi çalışmalar.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Compile edilmiş bir dosya üzerinde bu şekilde bir class sorgusu yapamazsın.Yapmak istediğin şey için decompile yöntemlerini kullanman gerekir.Tabii bu işlemi tekrar pack edilmiş dosyalar üzerinde yapmak daha da zorlaşacaktır.DeDe diye bildiğimiz programın yaptığı gibi diyebiliriz yani.

Kolay gele..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

başka exe li program ne oluyor ?

başka bir programdaki bileşenleri mi almaya çalışıyorsun ?
yani senin yapmadığın bir exe den mi bahsediyoruz burda ?
exe neyle yazilmis ? delphi, c, c++ ... ?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Re: Uygulamada Bileşenin Sınıf Hiyerarşisini alma.

Mesaj gönderen ofenX »

Merhaba Sadettin Hocam,
Her şey aşağıdaki linkte başladı. Burada Lks nin Gridinin ne olduğu hakkında tahminler yürütülüyordu.
viewtopic.php?t=6871
Eh çorbada biraz bizim tuzumuz olsun tahminlere yer vermeden kesin olarak şudur diyelim dedik. Sizin sayenizde öğrendiğim tamaracka.com da bile araştırdım. Bir şey bulamadım. Ya da ingilizcem yetmedi. Ancak şu an tosladığımı anladım. :oops:

O program delphide yazılmış.
ofenX yazdı: Delphi deki uygulamada bileşenin üzerine gelip.
tb3
tb2
tb1
tobject
şeklinde alabiliyorum. Ama exe ye çevrili bir programda bunu almayı yapamadım.
Bunu buradaki mesajlardan birine daha ayrıntılı bir cevap vermek için soruyorum.

Böyle bir şey almam mümkün mü? Yoksa exe leşen bir uygulamada en son olan tb3 olarak mı saklanıyor.
Herkese kolay gelsin.


@bLue aLonE hocam sizin cevabınız ile yukarıdaki sorumun cevabını almış oldum. Ve boşa kürek salladığımı anladım. :oops:

Tekrar cevaplarınız için teşekkür ederim.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

@Ofenx,

Bir programın hangi derleyici ile derlendiğini öğrenmek istiyorsan Language 2000'i deneyebilirsin. Exe'yi üstüne bırakman yeterli. Bayadır güncellenmiyor ama Delphiyse tanır heralde.

Eğer Delphiyse de dedemize sorarız.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

@t-hex hocam önceden delphi olduğunu söylemiştim. Sayenizde delphi ile derlendiğinden emin olduk.

Teşekkürler.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Cevapla