OnClick olmadan nesneyi nasıl tespit ederim?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
uparlayan
Üye
Mesajlar: 34
Kayıt: 09 Oca 2009 05:48

OnClick olmadan nesneyi nasıl tespit ederim?

Mesaj gönderen uparlayan »

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?
Kullanıcı avatarı
muratmutlu
Üye
Mesajlar: 57
Kayıt: 02 Tem 2005 02:44
Konum: Antalya

Re: OnClick olmadan nesneyi nasıl tespit ederim?

Mesaj gönderen muratmutlu »

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;

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;
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.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: OnClick olmadan nesneyi nasıl tespit ederim?

Mesaj gönderen SimaWB »

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 :wink:

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
uparlayan
Üye
Mesajlar: 34
Kayıt: 09 Oca 2009 05:48

Re: OnClick olmadan nesneyi nasıl tespit ederim?

Mesaj gönderen uparlayan »

Şahanesiniz Arkadaşlar tam da bunu istiyordum, hepinize teşekkürler.
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: OnClick olmadan nesneyi nasıl tespit ederim?

Mesaj gönderen cengaver »

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;
Cevapla