Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.10.2015, 15:47
Тимофей Петрович Тимофей Петрович вне форума
Прохожий
 
Регистрация: 23.06.2008
Сообщения: 6
Репутация: 10
По умолчанию код нажатия кнопки мыши в таймере

живу в линупсе, просто надо отловить нажатие кнопки мыши по таймеру.

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Button: TMouseButton;
begin
  if Button=mbright then ..;
  if Button=mbleft then ..;
end; 

ругается на Button который does not seem to be initialized (кажется, не инициализирован) но оба if отрабатывают каждый раз при проходе по таймеру.

в примерах по интернету всё происходит в событиях нажатия на кнопку, при этом если кнопку не отжимать - процедура какбы залипает?
как замутить повтор прохода по процедуре я совсем не понял.
Ответить с цитированием
  #2  
Старый 29.10.2015, 17:25
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

У формы есть событие MouseDown, вызывается при нажатии на кнопку мыши. Обрабатывай его, таймер не нужен.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 29.10.2015, 17:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Непонятно, зачем нужно следить за мышыной давильней вне родных обработчиков, да и не знаю как там из линукса, а вот под виндами такое лучше с помощью ловушки делать, ну или если таймером, то тогда вот так
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if GetAsyncKeyState(VK_LBUTTON) <> 0 then ..;
 if GetAsyncKeyState(VK_RBUTTON) <> 0 then ..;
end;
Ответить с цитированием
  #4  
Старый 30.10.2015, 09:53
Тимофей Петрович Тимофей Петрович вне форума
Прохожий
 
Регистрация: 23.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

в виндах куча вариантов, тут линупс.
в обработчике *MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); сделал цикл:

Код:
  while Button in [mbleft,mbright] do
    begin
      if Button=mbright then ButtonXY:=1;
      if Button=mbleft  then ButtonXY:=2;
      Timer4.Enabled:=true;
      Application.ProcessMessages;
    end;
  ButtonXY:=0;
  Timer4.Enabled:=false;

пока не нажму клавишу всё норма, как только нажал - цикл залипает и из цикла не выходит, пока не нажму другую клавишу. таймер при этом работает нормально. трабл в условия цикла, непойму почему Button in [mbleft,mbright] не снимается при отжатии кнопки.

просто при нажатии кнопки по процедуре MouseDown происходит один проход.

Последний раз редактировалось Тимофей Петрович, 30.10.2015 в 10:13.
Ответить с цитированием
  #5  
Старый 30.10.2015, 10:28
Тимофей Петрович Тимофей Петрович вне форума
Прохожий
 
Регистрация: 23.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

цикл отстой

MouseDown стартует таймер и устанавливает параметры
MouseUp останавливает таймер
таймер просто работает

Последний раз редактировалось Тимофей Петрович, 30.10.2015 в 10:45.
Ответить с цитированием
  #6  
Старый 30.10.2015, 11:15
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Не нужен таймер и цикл, событие будет вызываться каждый раз при нажатии кнопки мыши.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 08.11.2015, 11:35
Тимофей Петрович Тимофей Петрович вне форума
Прохожий
 
Регистрация: 23.06.2008
Сообщения: 6
Репутация: 10
По умолчанию

ага, один раз нажал и ждешь следующего раза?
Ответить с цитированием
  #8  
Старый 08.11.2015, 15:05
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Тимофей Петрович
...один раз нажал и ждешь...
Тогда смените логику управления таймером
Код:
...
var btn: TMouseButton;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 case btn of
  mbright: ButtonXY:=1;
  mbleft:  ButtonXY:=2;
 end;
 Application.ProcessMessages;
 ButtonXY:=0;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 btn:= Button;
 Timer1.Enabled:= true;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Timer1.Enabled:= false;
end;
...

Последний раз редактировалось Alegun, 08.11.2015 в 18:32.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025