Gridin TitleClick ve TitleDblClick eventleri organizasyonu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Gridin TitleClick ve TitleDblClick eventleri organizasyonu

Mesaj gönderen aLonE CoDeR »

Selamlar.

CustomGrid'ten türetilmiş bir gride TitleClick eventi yazılmış ancak tetiklendiği yer MouseDown yordamı.İhtiyaç oldu TitleDblClick eventi yazmak gerekti fakat MouseDown yordamı her tıklamada tetiklendiği için hem TitleClick hem de TitleDblClick tetikleniyor.MouseDown yordamındaki kodları kapatıp windows mesajlarını yakalamak suretiyle (WM_LBUTTONDOWN) kendi TitleClick eventimizi yazmamıza rağmen çift tıkladığımızda her ikisi de tetikleniyor.Gözden kaçan birşey var muhtemelen.Fikri olan?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Normal VCL'in onDblClick olayında bile önce onMouseDown ve onClick olayları çalışıyor. Bu durum abes değildir sanırım gücüne gitse de mantığını değiştirmen gerekiyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Z.D.
Üye
Mesajlar: 104
Kayıt: 01 Nis 2006 01:48
Konum: İstanbul

Mesaj gönderen Z.D. »

Subclass yaptiginiz yerden mesajı yakalayip tekrar gonderiyorsan bu normal.

yani diyelimki;

Kod: Tümünü seç

Unit Unit1;

Interface

Uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids;

Type
   TForm1 = Class(TForm)
      DBGrid1: TDBGrid;
      Procedure FormCreate(Sender: TObject);
      Procedure DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);

   Private
    { Private declarations }
      OldGridProc: TWndMethod;
      Procedure GridWindowProc(Var Message: TMessage);
   Public
    { Public declarations }
   End;

Var
   Form1: TForm1;


Implementation


{$R *.dfm}


Procedure TForm1.GridWindowProc(Var Message: TMessage);
Begin
   If Message.Msg = WM_LBUTTONDOWN Then
   Begin
//      OldGridProc(Message);
      ShowMessage('Sub Class Grid Mouse Down');
      {==========================================================
    >>  WM_LBUTTONDOWN yakaladık eğer bu begin-end'de OldGridProc(Message) yaparsak
    >>  mesaj(WM_LBUTTONDOWN) bilesen icin yazilmis normal eventlerinede gider.
      ===========================================================}
   End Else
      OldGridProc(Message);
End;


Procedure TForm1.FormCreate(Sender: TObject);
Begin
   OldGridProc := DBGrid1.WindowProc;
   DBGrid1.WindowProc := GridWindowProc;
End;


Procedure TForm1.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
Begin
   ShowMessage('Grid Mouse Down');
End;

End.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

İlginiz için teşekkürler.

@sabanakman;

Ben de o mantığı araştırıyorum.

@Z.D.

Yöntemi bileşenin kodlarına monte ettim ancak GridWindowProc proceduresini birkaç kez işlettikten sonra sınıf yok hatası veriyor ve proje terminate oluyor.
Kullanıcı avatarı
Z.D.
Üye
Mesajlar: 104
Kayıt: 01 Nis 2006 01:48
Konum: İstanbul

Mesaj gönderen Z.D. »

aLonE CoDeR yazdı: Yöntemi bileşenin kodlarına monte ettim ancak GridWindowProc proceduresini birkaç kez işlettikten sonra sınıf yok hatası veriyor ve proje terminate oluyor.
Hocam kodlari gormeden bisey soylemek zor. Nerede exceptiona dusuyor bulabilirsen o unite yogunlasabiliriz. bunun icin ucretli ama, benim kullandigim EurekaLog

http://www.eurekalog.com/downloads.php

eklentisi var. Bunun disinda aklima gelen, kodlarinda inherited, x...free gibi kod bloglarini kontrol etmende yarar var.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Aynı procedurenin ikinci kez çalıştırılmasında exceptiona düşüyor CreateWnd yi inherit ederken oluyor tahminimce.Başka bi çözüm ürettim titledblclick olayını iptal ettim şimdilik vakit yetersizliği nedeniyle.

İlgin için teşekkürler.
Cevapla