kendi programımdan başka bileşenlere müdehale etmek
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
kendi programımdan başka bileşenlere müdehale etmek
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.
bu konuyu araştırdım ama bulamadım. yardımcı olursanız sevinirim.
-
- Üye
- Mesajlar: 360
- Kayıt: 10 Nis 2006 09:07
@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 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...
- 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 := '';
- Çalışmalarında başarılar...
-
- Üye
- Mesajlar: 66
- Kayıt: 27 Nis 2006 09:29
Ayrıca mesela Form1 den Form3 e müdahale etmek istiyorsanmrmarman yazdı:@canavar
- Mesela sen Form3'deki Edit1'in içeriğini boşaltmak istiyorsan herhangi bir yerdedediğinde isteğin gerçekleşir. Burada Edit1'in önüne Form3 diyerek bu Edit'in o formda aranacağını bildirmiş oluyoruz.Kod: Tümünü seç
Form3.Edit1.Text := '';
kodlardaki implementation ın alt kısmına
Kod: Tümünü seç
implementation
uses Form3;
Kolay gelsin.
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.
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.
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
- 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
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...
- API'ler Windows tarafından programcılara sunulmuş bir güzelliktir ki, özel durumlarda faydalanırız.
- "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.
- 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.
- 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. Sihir/İlüzyon burada
- Başarılar...
- 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...
- API'ler Windows tarafından programcılara sunulmuş bir güzelliktir ki, özel durumlarda faydalanırı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)[b]API[/b] hk. yazdı:Application Programming Interface, kısaca API (Yazılım Programlama Arayüzü)
- "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;
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;
- Başarılar...
En son mrmarman tarafından 14 Şub 2007 09:15 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
@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..
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..
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
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
Mrmarman
Ü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.
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
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
@lonely teşekkürler. Detaylı ve örnekli cevaplar yazmanın ödülü bu mesajın ve diğer benzeri teşekkür cevapları.
- 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.
- Ö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.
- 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.
- Ö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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
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..
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 >');
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;
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 >');