Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Mouse double click
#11
Siz "bunlar için bilgim yetersiz" yazınca tüm maddeleri kasteddiniz sanmıştım.

Neyse; Tuğrul Bey'in orada kastettiği şey aslında yukarıda yazdığı cevapta örneklendirdiği şeydir. Yukarıda MyWMLButtonDblClk ile yapılan... Sizin WMNCLBUTTONDBLCLK yerine MyWMLButtonDblClk'i denemelisiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#12
(28-07-2017, Saat: 10:28)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Siz "bunlar için bilgim yetersiz" yazınca tüm maddeleri kasteddiniz sanmıştım.

Neyse; Tuğrul Bey'in orada kastettiği şey aslında yukarıda yazdığı cevapta örneklendirdiği şeydir. Yukarıda MyWMLButtonDblClk ile yapılan... Sizin WMNCLBUTTONDBLCLK yerine MyWMLButtonDblClk'i denemelisiniz.

O şekilde de denedim fakat dediğim gibi , form üzerinde çift tıklama yaparsanız sonuç olumlu ama forma bir imaj nesnesi koyup (tüm formu kaplayan ) ozaman sonuç alamadım. Prosedürü imaj nesnesinin ondoubclick yordamında kullanmayıda beceremedim. Çünkü prosedür Tmesaj tipinde bir değişken istiyor , bende ne vermeliyim bilemedim.
Cevapla
#13
(28-07-2017, Saat: 15:28)Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-07-2017, Saat: 10:28)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Siz "bunlar için bilgim yetersiz" yazınca tüm maddeleri kasteddiniz sanmıştım.

Neyse; Tuğrul Bey'in orada kastettiği şey aslında yukarıda yazdığı cevapta örneklendirdiği şeydir. Yukarıda MyWMLButtonDblClk ile yapılan... Sizin WMNCLBUTTONDBLCLK yerine MyWMLButtonDblClk'i denemelisiniz.

O şekilde de denedim fakat dediğim gibi , form üzerinde çift tıklama yaparsanız sonuç olumlu ama forma bir imaj nesnesi koyup (tüm formu kaplayan ) ozaman sonuç alamadım. Prosedürü imaj nesnesinin ondoubclick yordamında kullanmayıda beceremedim. Çünkü prosedür Tmesaj tipinde bir değişken istiyor , bende ne vermeliyim bilemedim.

 Merhaba, işletim sisteminin olay güdümlü yapısında önceki mesajlarımda örneğini verdiğim MyWm... metodunu sizin çağırmanıza gerek yok. İlgili olay gerçekleştiğinde(fiziksel olarak mouse ile çift tıkladığınızda), işletim sistemi mouse'un tuş tıklaması neticesinde bir mesaj oluşturacak ve bu mesaj o andaki aktif pencerenin thread'inin mesaj kuyruğuna iletilecek. Uygulamanın ana thread'i sürekli mesaj kuyruğunu kontrol ettiği için, kısa bir zaman sonra sizin metodunuz otomatikman çağrılmış olacak. Dolayısı ile; ilgili procedure'ün nasıl çağrılacağı ile siz ilgilenmiyorsunuz. Siz, o procedere'ün içine ihtiyaç duyduğunuz kodu yazıyorsunuz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#14
(28-07-2017, Saat: 16:14)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-07-2017, Saat: 15:28)Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.O şekilde de denedim fakat dediğim gibi , form üzerinde çift tıklama yaparsanız sonuç olumlu ama forma bir imaj nesnesi koyup (tüm formu kaplayan ) ozaman sonuç alamadım. Prosedürü imaj nesnesinin ondoubclick yordamında kullanmayıda beceremedim. Çünkü prosedür Tmesaj tipinde bir değişken istiyor , bende ne vermeliyim bilemedim.

 Uygulamanın ana thread'i sürekli mesaj kuyruğunu kontrol ettiği için, kısa bir zaman sonra sizin metodunuz otomatikman çağrılmış olacak. Dolayısı ile; ilgili procedure'ün nasıl çağrılacağı ile siz ilgilenmiyorsunuz. Siz, o procedere'ün içine ihtiyaç duyduğunuz kodu yazıyorsunuz.
Hocam ben bu kısmı tam anlayamadım. Huh
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. doküman bahsettikleriniz ile ilgili sanırım.
Alıntı:The system does not automatically create a message queue for each thread. Instead, the system creates a message queue only for threads that perform operations which require a message queue. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.
Her bir thread için bir mesaj kuyruğu oluşturulmuyor.Eğer thread içersinde bir veya daha fazla pencere(CreateWindow) oluşturursam o zaman bir kuyruk(Queue) oluşturuluyor.Ve bu kuyruktaki mesajlarıda GetMessage API'si ile bir döngüde okuyup, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. ile de ilgili Windows prosedürlerine yönlendirme(yani fonksiyonun çağırılması) sağlanıyor.

Doğru mu anladım ?
WWW
Cevapla
#15
Cevabınız için teşekkürler, ben Form üzerinde çalışıp imaje nesnesinde çalışmayınca acaba sadece forma gelen mesajları yakalıyor imaje nesnesinin click yordamına tanımlarsam belki ona gelen mesajlarıda okur fikriyle orada denemek istedim. İlk defa böyle bir prosedürle çalışınca haliyle çabalayıp kaldım Smile)
Cevapla
#16
Main thread oluşturulurken mesajları işleyebilecek bir procedure belirtilerek sistem kaydı yapılır.
Zaten process döngüsel olarak sürekli mesaj kontrolü yapar.Kontrolün aşamaları ise mesajları al, işlenebilir duruma getir, sevk et (getmessage, translatemessage, dispatchmessage).
Mesajları işleyecek kısım ise windowproc olarak belirttiğimiz procedure olacaktır.  
Olayların işletilmesine basit olarak örnek verecek olursak :
program Message;

uses
 Windows, Messages;


var
 WindowClass: TWndClassA;
 Inst, MainWindowHandle: HWND;
 Msg: TMsg;

{$R *.res}


function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 if uMsg = WM_RBUTTONDOWN then ExitProcess(0);  // Sağ tıklandı ise çık
 if uMsg = WM_DESTROY then Halt;
end;


begin
 //Process'i sisteme kayıt edelim mesaj işleyecez bize handle ver diyelim
 Inst := hInstance;
 with WindowClass do begin
   style              := CS_HREDRAW or CS_VREDRAW ;
   lpfnWndProc        := @WindowProc;
   hInstance          := Inst;
   hbrBackground      := CreateSolidBrush($9fffff);
   lpszClassname      := 'DelphiCan';
   hCursor            := LoadCursor(0, IDC_ARROW);
 end;
 RegisterClassA(WindowClass);

 //Ana pencere
 MainWindowHandle := CreateWindow( 'DelphiCan', 'DelphiCan Message',
                           WS_VISIBLE,
                           (GetSystemMetrics(SM_CXFULLSCREEN) - 300 )div 2 ,
                           (GetSystemMetrics(SM_CYFULLSCREEN) - 200 ) div 2,
                            280, 200, 0, 0, Inst, nil);


 //Gelen giden ne var diye bakalım
 while(GetMessage(Msg, MainWindowHandle, 0, 0)) do begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
end.

Delphide mainthread application nesnesi olacağı için ilk mesaj işleme burada yapılacaktır.
Daha sonra ilgili nesnenin mesaj işleme fonksiyonu devreye girecektir.
Eğerki processteki bütün mesajları yakalamak istiyor isek temeldeki fonksiyonu ele almamız gerekir.
Bunada bir örnek verecek olursak :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
  procedure WndProc(var Message: TMessage); override; // Formun mesaj fonksiyonunu ezelim
  procedure ApplicationMessage (var Msg: TMsg;
     var Handled: Boolean); // Mainthread için yeni bir procedure tanımlaması yapalım
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
 if Msg.message = WM_LBUTTONDBLCLK then
 ShowMessage('Main thread');

end;

procedure TForm1.WndProc(var Message: TMessage);
begin
 inherited;
 if Message.Msg = WM_LBUTTONDBLCLK then
 ShowMessage('Form');

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnMessage := ApplicationMessage; // Mainthread onmessage ataması
end;

end.
Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...





Cevapla
#17
QuAdR, bu harika ve eğitici paylamışın için çok teşekkür ediyorum. Çok güzel örneklemişsin emeğine sağlık
Cevapla
#18
(28-07-2017, Saat: 16:54)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-07-2017, Saat: 16:14)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. Uygulamanın ana thread'i sürekli mesaj kuyruğunu kontrol ettiği için, kısa bir zaman sonra sizin metodunuz otomatikman çağrılmış olacak. Dolayısı ile; ilgili procedure'ün nasıl çağrılacağı ile siz ilgilenmiyorsunuz. Siz, o procedere'ün içine ihtiyaç duyduğunuz kodu yazıyorsunuz.
Hocam ben bu kısmı tam anlayamadım. Huh
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. doküman bahsettikleriniz ile ilgili sanırım.
Alıntı:The system does not automatically create a message queue for each thread. Instead, the system creates a message queue only for threads that perform operations which require a message queue. If the thread creates one or more windows, a message loop must be provided; this message loop retrieves messages from the thread's message queue and dispatches them to the appropriate window procedures.
Her bir thread için bir mesaj kuyruğu oluşturulmuyor.Eğer thread içersinde bir veya daha fazla pencere(CreateWindow) oluşturursam o zaman bir kuyruk(Queue) oluşturuluyor.Ve bu kuyruktaki mesajlarıda GetMessage API'si ile bir döngüde okuyup, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. ile de ilgili Windows prosedürlerine yönlendirme(yani fonksiyonun çağırılması) sağlanıyor.

Doğru mu anladım ?

Evet güzel kardeşim doğru anlamışsın. Bir thread bir ya da birden fazla pencereye sahip ise, mecburen Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. / Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. / Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. API'leri vasıtası ile mesaj kuyruğunu tüketmelidir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#19
(31-07-2017, Saat: 10:09)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(28-07-2017, Saat: 16:54)ismailkocacan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Hocam ben bu kısmı tam anlayamadım. Huh
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. doküman bahsettikleriniz ile ilgili sanırım.
Her bir thread için bir mesaj kuyruğu oluşturulmuyor.Eğer thread içersinde bir veya daha fazla pencere(CreateWindow) oluşturursam o zaman bir kuyruk(Queue) oluşturuluyor.Ve bu kuyruktaki mesajlarıda GetMessage API'si ile bir döngüde okuyup, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. ile de ilgili Windows prosedürlerine yönlendirme(yani fonksiyonun çağırılması) sağlanıyor.

Doğru mu anladım ?

Evet güzel kardeşim doğru anlamışsın. Bir thread bir ya da birden fazla pencereye sahip ise, mecburen Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. / Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. / Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. API'leri vasıtası ile mesaj kuyruğunu tüketmelidir.

Doğrulama için teşekkür ederim hocam.
Dokümanın tamamını ve örnek C kodunu detaylı inceleme fırsatı bulamadım.
Daha ilk paragrafı okuduğumda, asıl ilk merak ettiğim Dispatch işini nasıl yaptığı idi.QuAdR hocamın verdiği örnekle birlikte tekrar inceledim.
QuAdR hocama da zaman ayırıp izah ettiği için teşekkür ederim.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  timage üzerinde mouse ile çizim duraumsa 0 62 02-09-2019, Saat: 16:16
Son Yorum: duraumsa
  parent formda mouse sol klik çalışmıyor erdogan 5 377 18-06-2019, Saat: 14:30
Son Yorum: erdogan
  Mouse click quiet1day 1 261 13-05-2019, Saat: 15:13
Son Yorum: Tuğrul HELVACI
  DBGrid Click Sorunu Emrah Karagöz 5 735 02-01-2019, Saat: 17:48
Son Yorum: Emrah Karagöz
  Dbgrid mouse whell aşağı yukarı gezinme cinarbil 6 812 02-10-2018, Saat: 13:37
Son Yorum: cinarbil



Konuyu Okuyanlar: 1 Ziyaretçi