Merhaba Arkadaşlar,
Tükenmişlik sendromu yaşıyorum sanırım, o nedenle bazı arkadaşlara basit bir çözüm gibi gelebilir, şimdiden "özür" dilerim...
Diyelim ki herhangi bir formum var... Bu formda belli bir kullanıcı için seçtiğim bir labeli, seçtiğim bir editbox'u ve seçtiğim bir butonu görmesini istemiyorum. Bunun için formu "yetkilendirme" modunda çalıştırıyorum. Formdaki nesnelere tıkladığımda hangi nesneye tıkladığımı da yakalamış oluyorum. Bu işi tıklanan nesnenin onclick olayındaki Sender parametresiyle alabiliyorum, o bakımdan buraya kadar normal...
Sorun şu;
OnClick olayı tanımlanmamış bir nesnem olduğunda (bir TLabel veya bir TBevel gibi mesela) ben bu nesneyi nasıl elde edebilirim?
--------------
Not: Dikkat! Formdaki bütün componentleri bir for döngüsüyle taramak da istemiyorum... (En son ona kalmasa keşke...)
Bunu nasıl yapabilirim?
OnClick olmadan nesneyi nasıl tespit ederim?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- muratmutlu
- Üye
- Mesajlar: 57
- Kayıt: 02 Tem 2005 02:44
- Konum: Antalya
Re: OnClick olmadan nesneyi nasıl tespit ederim?
Merhaba,
Bu iş için 2 tane uygun yöntem var diye düşünüyorum.
1- Sizinde dediğiniz gibi tüm nesneleri döngü ile dönerek yetkilendirebilirsiniz formun onCreate event ında.
2- Bunun için bir master form yapar ve projenizde kullandığınız tüm yetkilendirme işlemini o formda yaparsınız. Daha sonra tüm formlarınızı ondan inherited ederseniz yetkilendirme işlemlerinizi tüm formlar için tekrardan yazmak zorunda kalmazsınız. Sadece eşleştirme yaparak kullanabilirsiniz ancak buda daha projeye başlamadıysanız ya da başlarındaysanız uygulanabilir bir yöntem. Bitmiş bir proje için zor olacaktır.
Sizin istediğini yönteme gelirsek şöyle bir kod yazılabilir:
İlk önce forma bir tane ApplicationEvents nesnesi koyun ve OnIdle event ına aşağıdaki kodu yazın;
Ancak sizi şu konuda uyarmak isterim. OnIdle sürekli çalışacak bir kodddur, o nedenle de çok fazla kod çalışmaması gerekir. Burada yapacağınız işlemler çok kısa ve hataya açık olmamalıdır yoksa program çalışırken durduk yere anlamsız hatalar alabilirsiniz.
Kolay gelsin.
Bu iş için 2 tane uygun yöntem var diye düşünüyorum.
1- Sizinde dediğiniz gibi tüm nesneleri döngü ile dönerek yetkilendirebilirsiniz formun onCreate event ında.
2- Bunun için bir master form yapar ve projenizde kullandığınız tüm yetkilendirme işlemini o formda yaparsınız. Daha sonra tüm formlarınızı ondan inherited ederseniz yetkilendirme işlemlerinizi tüm formlar için tekrardan yazmak zorunda kalmazsınız. Sadece eşleştirme yaparak kullanabilirsiniz ancak buda daha projeye başlamadıysanız ya da başlarındaysanız uygulanabilir bir yöntem. Bitmiş bir proje için zor olacaktır.
Sizin istediğini yönteme gelirsek şöyle bir kod yazılabilir:
İlk önce forma bir tane ApplicationEvents nesnesi koyun ve OnIdle event ına aşağıdaki kodu yazın;
Kod: Tümünü seç
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var
Kontrol: TWinControl;
begin
Kontrol := FindVCLWindow(Mouse.CursorPos) ;
if Kontrol <> nil then Caption := Kontrol.Name;
end;
Kolay gelsin.
Re: OnClick olmadan nesneyi nasıl tespit ederim?
Formun herhangi bir yerinde mouse'a tıklandığını yakalmak için WM_LBUTTONDOWN mesajını kontrol edebilirsiniz. Bunun en kolay yolu; form üzerine bir adet ApplicationEvents bileşeni koyun ve OnMessage olayında WM_LBUTTONDOWN'ı kontrol edin. Mouse'a hangi bileşen üzerinden basıldığını anlamak için de FindDragTarget'ı kullanabilirsiniz. Bu fonksiyon sizden bir TPoint isteyecektir ki zaten OnMessage'ın Msg parametresi içinde bu hazır : Msg.pt
Uzun lafın kısası :
Uzun lafın kısası :
Kod: Tümünü seç
procedure TFormMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
Target: TControl;
begin
if (Msg.Message = WM_LBUTTONDOWN) then
begin
Target := FindDragTarget(Msg.pt, True);
if Assigned(Target) then
Caption := Target.Name;
end;
Handled := False;
end;
There's no place like 127.0.0.1
Re: OnClick olmadan nesneyi nasıl tespit ederim?
Şahanesiniz Arkadaşlar tam da bunu istiyordum, hepinize teşekkürler.
Re: OnClick olmadan nesneyi nasıl tespit ederim?
Eğer DevExpress'in bileşenlerini kullanıyorsan yukarıdaki örnekler işini görmeyebilir, aşağıdaki gibi bir kod lazım sana;
Kod: Tümünü seç
procedure TAna.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
Pos: TPoint;
Obje: TObject;
Klas: String;
procedure Memola(aText: String); begin Memo1.Lines.Add(Trim(aText)); end;
begin
if (Msg.Message = WM_LBUTTONDOWN) then begin
GetCursorPos(Pos);
Obje := FindDragTarget(Pos, True);
if (Obje <> nil) then begin
Klas := Obje.ClassName;
if Klas = 'TcxCustomInnerTextEdit' then Memola(TcxCustomInnerTextEdit(Obje).Owner.Name) else
if Klas = 'TcxCustomComboBoxInnerEdit' then Memola(TcxCustomComboBoxInnerEdit(Obje).Owner.Name) else
if Klas = 'TcxCustomDropDownInnerEdit' then Memola(TcxCustomDropDownInnerEdit(Obje).Owner.Name) else
if Klas = 'TcxCustom InnerMemo' then Memola(TcxCustomInnerMemo(Obje).Owner.Name) else
begin Memola(Obje.ClassName) end;
end;
end;
end;