kendi programımdan başka bileşenlere müdehale etmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
canavar
Üye
Mesajlar: 15
Kayıt: 19 Eki 2006 04:18

kendi programımdan başka bileşenlere müdehale etmek

Mesaj gönderen canavar »

kendi programımdan başka bileşenlere müdehale etmek istiyorum. mesela bir formdaki edit bileşenini sıfırlatmak istiyorum nasıl yapabilirim.
bu konuyu araştırdım ama bulamadım. yardımcı olursanız sevinirim.
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Mesaj gönderen kahraman1285 »

mrb.

bileşen derken başka bir programdaki nesnelerden söz ediyorsun yoksa kendi programının içindeki nesnelere ulaşmaktan mı? biraz daha açık sorarsan yardımcı olan cıkacaktır.

kolay gelsin...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@canavar

- Bir formdaki Edit'e erişmek için bir ön adres bildirmen gerekir. Ön adres dediğimiz şey Edit'in hangi form üzerinde olduğundur.

- Mesela sen Form3'deki Edit1'in içeriğini boşaltmak istiyorsan herhangi bir yerde

Kod: Tümünü seç

Form3.Edit1.Text := '';
dediğinde isteğin gerçekleşir. Burada Edit1'in önüne Form3 diyerek bu Edit'in o formda aranacağını bildirmiş oluyoruz.

- Çalışmalarında başarılar...
Resim
Resim ....Resim
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

mrmarman yazdı:@canavar
- Mesela sen Form3'deki Edit1'in içeriğini boşaltmak istiyorsan herhangi bir yerde

Kod: Tümünü seç

Form3.Edit1.Text := '';
dediğinde isteğin gerçekleşir. Burada Edit1'in önüne Form3 diyerek bu Edit'in o formda aranacağını bildirmiş oluyoruz.
Ayrıca mesela Form1 den Form3 e müdahale etmek istiyorsan
kodlardaki implementation ın alt kısmına

Kod: Tümünü seç

implementation
uses Form3;
şeklinde kullanacağın formun unit ini dahil etmen gerekir.
Kolay gelsin.
canavar
Üye
Mesajlar: 15
Kayıt: 19 Eki 2006 04:18

Mesaj gönderen canavar »

değerli arkadaşlar ilginiz için teşekkür ederim.
fakat benim anlatmak istediğim kendi programımdan mesela hesapmakinasının editini sıfırlayacağım. yani anlayacağınız kendi programımdan başka programların nesnelerine müdehale etmek.
aslında bu iş için nesnenin handle numarasıyla yapıldığını biliyorum. ama yeterince bilgim yok.
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

arkadaşın ne demek istediğini anladım onun sorusuna ek olarak bende bir kaç soru sormak istiyorum.
- Benim kendi yaptığım bir program var içinde ip adresi, açık port ve radmin şifresini tutan.
Benin yaptırmak istediğim arkadaşınkinden biraz daha zor sanırım.
-ben kendi programında bağlan butonu koyup direk radminle istediğim yere bağlanmak istiyorum, yani kendi yaptığım program radmini açacak, editlere bilgileri girip bağlantıya geçecek.

herkese kolay gelsin
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Bu iki metodun da birer örneğini hazırladım vereyim. Öncelikle FindWindow ve FindWindowEx fonksiyonlarının çalışma prensibini anlatarak konuya başlarsam kavrar, ona göre sonsuz çeşitlikte çözümler üretebilirsiniz... :idea:

- API'ler Windows tarafından programcılara sunulmuş bir güzelliktir ki, özel durumlarda faydalanırız.
[b]API[/b] hk. yazdı:Application Programming Interface, kısaca API (Yazılım Programlama Arayüzü)
- FindWindow fonksiyonu bildiğin üzere bir API fonksiyonudur. PencereHandle := FindWindow(SınıfAdı, Başlık); şeklinde kullanılır ve size başlığını ve/veya sınıf adını bildiğiniz pencerenin -aynı anda birden fazla olabilir bunu da hesaba katarak- Z order denen oluşturulma sırasına göre ilk bulduğunun erişim windows nosunu verir. (Handle'i şu an başka türlü tanımlayamadım. Window'un, Windows tarafından atanmış "Erişim No"su dedim)

- "SciCalc" bildiğimiz Windows Hesap Makinesinin sınıfının adıdır. Başlığı her ne kadar "Hesap Makinesi" olsa da...

- Aşağıdaki örnek önce "SciCalc" sınıfında bir pencere açık olup olmadığını irdeler, varsa yani handle nosu 0'dan farklı ise bir sonraki işlem olan, bulunan pencerenin alt pencerelerni aramak üzer IF-Begin/End bloğuna girer.

- Burada başka bir fonksiyon kullanıyoruz, adı FindWindowEx. Aslında benzer işlem yapan bir fonksiyondur ama, asıl görevi, ilk önce ana pencerenin Handle Nosunu veririz. Verdiğimiz ANA pencerenin adresinin altında oluşturulmuş alt pencerelerden birisini bulmasını isteriz.

- Aynı ihtimal burada da mevcuttur. Yani aynı isimde ve sınıfta birden fazla window olabilmektedir. Bunun için FindWindowEx'in ikinci parametresi olan, hangi handle nosundan başlanacağı konusu gündeme gelir.

- Özellikle bu kadar geniş anlatıyorum, "Windows Hesap Makinesi"nde böyle özel bir durum var. Görünüm Standart veya Bilimsel olabilmektedir.

- Standart olursa sorun yok ama Bilimsel olursa "C" buttonundan bir değil iki tanedir.

- Bir tanesi içeriği sıfırlamak için kullanılan C buttonu , diğeri ise HEX kod girişi için faydalanılan A, B, C, D, E, F buttonlarından birisidir.

- İşte burada şöyle bir method uyguluyoruz. iki kere C buttonu arıyoruz ama ilkinde 0 nolu handle nosundan başlatıp, yani baştan başlatıp aratıyoruz. Daha sonra bulunan değerden başlatıp tekrar aratıyoruz, onu da bir başka değişkene aktarıyoruz.

- "C" buttonunun en son sıradaki olduğunu bildimizi varsayıyorum, bunu ben deneme yanılma ile buldum. Siz de bulabilirsiniz.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  hHesapMak,
  hButton_C1,
  hButton_C2  : THandle;
begin
  // "C" Button'u bulup ona basmak...
  hHesapMak := FindWindow( 'SciCalc', 'Hesap Makinesi' );
  If hHesapMak <> 0 then begin
    hButton_C1 := FindWindowEx( hHesapMak, 0, 'Button', 'C');
    hButton_C2 := FindWindowEx( hHesapMak, hButton_C1, 'Button', 'C');
    // Burada Hesap Makinesi Görünümü önem kazanıyor...
    // Normal   ise "sadece" hButton_C1 değer alır, hButton_C2 0 olur.
    // Bilimsel ise "her ikisi" de değer alır
    // ama biz sadece birisi ile ilgileniyoruz...
    If hButton_C2 <> 0 then hButton_C1 := hButton_C2;

    If hButton_C1 <> 0 then begin
      SendMessage(hButton_C1, BM_CLICK, 0, 0);
    end;
  end;
end;
- Aşağıdaki ise diğer yöntem oluyor, postmessage ile tuş gönderme işlemi. Burada izlenen method ise, ilki ile bir aşamaya kadar benzer. Pencereyi buluyoruz ama bu sefer butto değil, rakam girişi yaptığımız Edit sınıfından nesneyi arıyoruz. Bulunca da ESCAPE tuşuna basınca nasıl "C" tuşunun görevini yapıyorsa ve bunu biliyorsak, aynısını kullanıcı yerine programımızın basmasını sağlıyoruz.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
Var
  hHesapMak,
  hEdit : THandle;
  Key   : Integer;
begin
  // Rakamları girdiğimiz Edit'i bulup orada ESC tuşu basmak...
  hEdit := 0;
  hHesapMak := FindWindow( 'SciCalc', 'Hesap Makinesi' );
  If hHesapMak <> 0 then begin
    hEdit := FindWindowEx( hHesapMak, hEdit, 'Edit', Nil );
    If hEdit <> 0 then begin
      Key   := VK_ESCAPE;
      PostMessage(hHesapMak, WM_KEYDOWN, Key, 0);
    end;
  end;
end;
- Umarım başlığa ulaşan konu ile ilgili herkes için faydalı olmuştur. Sonuçta uygulanan method, programınızın bir buttona veya tuşa bastığı yanılgısını Hesap Makinesine yaşatıyoruz. :lol: Sihir/İlüzyon burada :wink:

- Başarılar...
En son mrmarman tarafından 14 Şub 2007 09:15 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
canavar
Üye
Mesajlar: 15
Kayıt: 19 Eki 2006 04:18

Mesaj gönderen canavar »

mrmarman kardeş gayet güzel anlatmışsın. bu yazı bizim için bir ufuk olursa sanırım çok işler başarırız...teşekkürler.
trolojik
Üye
Mesajlar: 78
Kayıt: 01 Nis 2007 02:46

Mesaj gönderen trolojik »

@mrmarman Hesap makinesinin sınıf adını SciCalc olarak belirtmişsiniz..
Bu bilgiye nasıl ulaştınız ?

Diyelimki bir kaynaktan ulaştınız ; Herhangi bir programın sınıf adını nasıl öğrenebiliriz ?

Sanırım sınıf adını bilmiyorsak
PencereHandle:=FindWindow(nil,'Pencere adı'); şeklinde kullanmamız gerekiyor..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

1. Erişeceğin program kendi yaptığın ise erişeceğin pencerenin sınıfını da biliyorsundur başlığını da... Onu kullanırsın.

2. Üçüncü başka bir projenin formuna erişmek istersen, pencere adı ve sınıfını öğrenmek için delphi 7 ile gelen WinSight veya türevi bir yazılımdan da yardım alabilirsin veya kendin de benzeri bir program yaparak çalışmakta olan programların pencereli olanlarının listesini öğrenebilir ve ona göre davranabilirsin. bkz. viewtopic.php?t=19602#112380
Resim
Resim ....Resim
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mrmarman

Mesaj gönderen ikutluay »

Üstad aşağı yukarı bütün threadlerine bakıyorumda böyle adeta makela yazar gibi özenle yaz<ıyorsun. üşenmeyip örnek hazılıryorsun.

bugün başka bir threadttede bahsettim.

Umarım senin gibi insanların sayısı artar. İşin açığıda bu ülkede duvardaki tuğlaların üstüste konulabilmesi için bu şart.

bizde elimizden geldiğince farklı konularda birşeyler yapmaya çalışıyoruz ama beğendiremiyoruz kimseye.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@lonely teşekkürler. Detaylı ve örnekli cevaplar yazmanın ödülü bu mesajın ve diğer benzeri teşekkür cevapları. :o

- Forum içerisinde benzer sorulara benzer cevaplar verilecekse daha önceki bir detaylı başlık referans olması daha rantable geliyor. Yani aynı cevabı farklı farklı kişilere onların anlayacağı şekilde onlarca kere tekrar edeceğimize tam ve eksiksiz bir örnek ile kavranabilir kılarak aynı başlığı referans gösterebiliyorum.

- Bu sayede konuyu öğrenmek isteyenler için öğretici ve kavrayıcı nitelikte yüzlerce makale oluyor (illaki de makale kısmında yazmanın anlamı yok, sorunun altında cevap bulması daha faydalıdır) hem de kendi adıma benden sonrakilere eksiksiz bir kaynak bırakmış oluyorum. Mesaj sayımın %80'i bu şekilde geniş açıklamalıdır. 8)

- Özetle kendi adıma bilgi paylaşımı demekle bu tarzı benimsiyorum. Bilgi paylaşımı için daha önce seçtiğim DelphiTürk sitesinde benzer şekilde yazdığım mesajların bir çoğunun silindiğini görünce bu foruma yöneldim. Yoksa kendi Delphi forumumu kuracaktım. Böylece bu forumun internet ortamında geçerli bir kod ve bilgi bankası olarak gelişmesi için katkıda bulunmaya gayret ediyorum.

- Umarım moderasyon kesimi ile diyaloğumuz iyi gider de geçmiş zamanda burada şahsıma karşı meydana gelen kimi olumsuzlukların benzerini tekrarı ile karşılaşmam ve daha fazla yardımım dokunmasını sağlayabilirim. :oops:
Resim
Resim ....Resim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bende bir itirafta bulunayım o zaman. Bundan yıllar evvel kısa pantolonumla :) programlama adına iki satır alt alta yazmakta zorluk çektiğim dönemlerde http://www.delphiturk.com forum sitesinde Muharrem Arman üstadımın sorulara verdiği cevaplar ve paylaşıma açtığı kodlar beni hayrete düşürdü ve büyük bir hayranlık uyandırdı. Bu gün burada sorulara cevap yazıyorsam en birinci dereceden sebebi orada gördüklerimden etkilenmemdir. Sağolsun kendisinin sayesinde aynı hastalığa yakalanmış bulunmaktayım ve bu durumdan şikayetçi olmadığım gibi tam tersine çok memnunum. Gerçi bu forum sitesiyle geç tanıştım ama olsun. Sonradan bu tarafa kaymak zorunda olmamın nedeni ise forum büyük titizlikle kalitesini koruyor olması. Böylelikle bizler için kalite yükseliyor. Bu gibi forumlardan istifade edenler ve etmemizi sağlayan arkadaşlara ne kadar teşekkür etsem azdır. Bu tarz övgü dolu sözler yazmak aslında tarzım değil fakat içimdekileri ifade edememek beni bayağı rahatsız ediyordu. Herkese iyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
trolojik
Üye
Mesajlar: 78
Kayıt: 01 Nis 2007 02:46

Mesaj gönderen trolojik »

Merhaba; Öncelikle hep bana hep bana demeyen arkadaşlarımız için teşekkür ediyorum..

Değişik bir problemle karşılaştım makale ve dökümanları aynı zamanda fonksyon çalışma prensiplerinide araştırdığım halde..

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
 hApp,hButton:Thandle;
begin
hApp:=Findwindow(nil,'Alexa Toolbar Setup');
if hApp<>0 then begin
 hbutton:=FindWindowEx(hApp,0,'Button','Cancel');
 if hbutton<>0 then begin
   showmessage('a');
   sendmessage(hbutton,bm_click,0,0);
 end;
end;
end;
Alexa toolbar'ı resmi sitesinden download ettikten sonra bu şekilde Cancel butonuna basabiliyorum..

Fakat ne yaptıysam Next butonuna click leyemedim..

Denediğim olasılıklar :

hbutton:=FindWindowEx(hApp,0,'Button','Next');
hbutton:=FindWindowEx(hApp,0,'Button','Next >');
hbutton:=FindWindowEx(hApp,0,'Button','Next ');
hbutton:=FindWindowEx(hApp,0,'Button','Next >');
Cevapla