Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сообщение WM_LBUTTONDOWN [Delphi]


Дмитрий Галин ©   (2004-08-12 18:22:00) 

Почему всётаки глючит обработка сообщения WM_LBUTTONDOWN? Срабатывает нестабильно, через раз?


Дмитрий Галин   (2004-08-16 09:45:00) [1]

Спасибо большое! Это действительно исправило ситуацию.
Вопрос исчерпан. Тему объявляю закрытой.


Vladimir Kladov   (2004-08-13 18:27:00) [2]

Когда срабатывает OnMoseDblClk, OnMouseDown уже не срабатывает. Так что поставьте в OnMouseDblClk тот же обработчик, что на OnMouseDown, и будет 0.


nester   (2004-08-12 20:30:00) [3]

Попробуйте ловить сообщения по старинке, не средсвами КОЛы, а объявляю функцию сообщений(правда не знаю сработает ли в КОЛе), затем смотрите координаты курсора, если он над Вашей кнопкой - то показывайте менюшку.
Хотя это наверно лучше у Кладова спросить куда деваются часть сообщений если их много?


Дмитрий Галин   (2004-08-12 19:37:00) [4]

Nester, спасибо за вариант решения, хотя проблема всё-таки осталась.
Я хочу сделать кнопку такую как в XP-ном Internet Explorere с выпадающим меню и мне надо обрабатывать сообщения WM_LBUTTONDOWN и WM_LBUTTONUP для отрисовки изображения и вызова Popup-меню. А так как первое сообщение обрабатывается глючно от этого всё портится. Что делать?


Дмитрий Галин   (2004-08-12 19:24:00) [5]

И как с этим бороться?


nester   (2004-08-12 19:04:00) [6]

Действительно, причем не важно что это кнопка, вот у формы ловлю, причем заметил закономерность, если не очень быстро тыкать, то работает нормально. Похоже очередь сообщений съедается, новое сообщение убивает предыдущее если предыдущее еще не обработалось.

function TFormMain.KOLForm1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
result:= false;
if MSG.message=WM_LBUTTONDOWN then
begin
Inc(cnt);
Button1.Caption:= Int2Str(cnt);
end
else if MSG.message=WM_LBUTTONUP then
begin
 Dec(cnt);
 Button1.Caption:= Int2Str(cnt);
end;
end;


Дмитрий Галин   (2004-08-12 18:48:00) [7]

Аналогичная ситуация происходит при создании нового компонента, когда необходимо выполнить некоторые действия в процедуре WndProcComp. Например:

function WndProcComp(AControl: PControl; var AMessage: TMsg; var AResult: Integer): Boolean;
begin
 Result:=false;
 case AMessage.Message of
   WM_LBUTTONDOWN: begin
     AControl.Color:=clRed;
   end;
   WM_LBUTTONUP: begin
     AControl.Color:=clBlue;
   end;
 end;
end;


Дмитрий Галин   (2004-08-12 18:38:00) [8]

Извиняй, вот привожу кусок кода программы на KOL.

unit Main;
...

var
 Count: integer;

implementaton

procedure TMainForm.KOLFormFormCreate(Sender: PObj);
begin
 Count:=0;
end;

procedure TMainForm.Button1MouseDown(Sender: PControl; var Mouse: TMouseEventData);
begin
 Inc(Count);
 Button1.Caption:=Int2Str(Count);
end;

procedure TMainForm.Button1MouseUp(Sender: PControl; var Mouse: TMouseEventData);
begin
 Dec(Count);
 Button1.Caption:=Int2Str(Count);
end;

При это значение переменной Сount постепенно уменьшается, т.е. событие по сообщению WM_LBUTTONDOWN не всегда срабатывает.
По идее значение Count должно в итоге быть равно 0.


nester   (2004-08-12 18:27:00) [9]

Вам же отвечали, в 17-ой строке ошибка:)))))
Фраза типа "в 17-ой строке ошибка" - значит что тут не все видящие, и отсюда Ваш код не видно, мало ли что вы там придумали и написали и спрашиваете почему не работает, никаких деталий не даете. Вопрос типа "я написал программу, а она не работает, почему?". Форум сонный, программисты ленивые и большинсво попросту игнорирует такие вопросы.
Нужно добавить в FAQ как правильно задавать вопрос:))))
И что такое ошибка в 17-ой строке :))))


Наверх

Титульная страница Поиск, карта сайта Написать письмо