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

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

Съедаются одиночные клики мышкой.


Vlad Oshin ©   (2008-08-04 14:04:00) 

На форме есть компанент, он съедает одиночный клик мышкой. Не реагирует никак, на двойной клик реагирует.
Полез в его реализацию - запутался.

Есть идея перехватить у него клик и послать двойной на этом месте:
procedure TfrmDepartment.WmLButtonDown (var Message: TWMMouse);
var
x,y:integer;
pt:tPoint;
begin

 inherited;
 if fl then exit else fl:=not(fl);
 x:= Message.XPos;
 y:= Message.YPos;
 if ((X>GrdDepartment.Left) and (X<GrdDepartment.Width))// and (y>GrdDepartment.Top) and (y<GrdDepartment.Height))
  then begin
     Pt.x := x;
     Pt.y := y;
     //Преобразуем Pt к координатам экрана
     Pt := ClientToScreen(Pt);
     //к аболютным координатам курсора мышки
     Pt.x := Round(Pt.x * (65535 / Screen.Width));
     Pt.y := Round(Pt.y * (65535 / Screen.Height));
     //Переместим курсор мыши
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
       //Имитируем нажатие левой кнопки мыши
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
     //Имитируем отпускание левой кнопки мыши
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
     Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
  end;


Это работает, если кликнуть по форме,
если же кликнуть на компаненте, то клик опять съедается и ничего не происходит.

Как быть? Как заменить клик на 2клик, если первый клик "съедается"?
(там первый клик что-то инициализирует, насколько понял, но очень долго, по модулям скакать, и не по одному..)


Leonid Troyanovsky   (2008-08-05 15:36:00) [1]


> Vlad Oshin ©   (05.08.08 09:28) [3]

> а в приложении все работает как надо, а из dll вот такая

> может попробовать динамически компанент создать? Может он
> чего подхватывает неверно?

Видимо, в ём есть ссылки на глобальные переменные Application,
Screen & etc.

Да, и передай начальнику, что классы в dll - bad design.

--
Regards, LVT.


Vlad Oshin   (2008-08-05 09:32:00) [2]

может попробовать динамически компанент создать? Может он чего подхватывает неверно?
cxGrid это от DevExpress.  
А DBGrid, StringGrid, из стандартных, реагируют как положено


Vlad Oshin   (2008-08-05 09:28:00) [3]

нет, все-таки съедаются..
продублировал второе нажатие

 if fl then exit else fl:=true; //fl - пока truе, повторного входа в процудуру не будет
 pt.X:=x;  pt.Y:=y;
 Pt := ClientToScreen(Pt);  //Преобразуем Pt к координатам экрана
 Pt.x := Round(Pt.x * (65535 / Screen.Width));  //Преобразуем Pt к аболютным координатам курсора мышки
 Pt.y := Round(Pt.y * (65535 / Screen.Height));
 //делаем еще одно лишнее нажатие (чтоб не срабатывало и на него эта же процедура и нужна fl)
 application.ProcessMessages;
 Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
 application.ProcessMessages;
 Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
 application.ProcessMessages;
 Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
 application.ProcessMessages;
 fl:=false; //разрешаем следующий вход


, но начальник забраковал, сказал искать причину
а в приложении все работает как надо, а из dll вот такая ерунда..


KilkennyCat   (2008-08-04 15:40:00) [4]

Как сказал Johnmen,
Да, пож-та, нет пр-ем :)


Vlad Oshin   (2008-08-04 14:34:00) [5]

все, спасибо
забыл флаг скинуть еще до этого :)


Наверх

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