Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2015, 02:23   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Последовательная обработка одинарного и двойного нажатия левой кнопки мышкис

Доброе время суток,
Вот покапался в чьих-то исходниках и нашел следующий код отработки по разному левой (одинарное и двойное) нажатии кнопки мышки:
Помогите правильно обращаться к обработчикам,
Мне нужно это сделать на определенном компоненте TLabel,
Вот код основывающейся на сообщениях системы:

Код:
TForm2 = class(TForm)
  ... // всякий код класса
  private
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
  end;

implementation

procedure TForm2.WMLButtonDown(var Message: TWMLButtonDown);
begin
  inherited;
  // обработка одного клика (нажатия левой кнопки мыши)
end;

procedure TForm2.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
  inherited;
  // обработка двойного клика (двойного нажатия левой кнопки мыши)
end;

procedure TWindButton.WMLButtonUp(var Message: TWMLButtonUp);
begin
  inherited;
  // общая обработка отпускания клика для одинарного и двойного
end;
и далее проверять какой компонент был активен, если код вставить в класс формы

и мне наверно нужно заменить WMLButtonUp, т.е. написать OnLabel1MouseUp, наподобее

Код:
procedure TForm2.Label1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  PostMessage(Form2.Handle, WM_LBUTTONDOWN, X, Y);
end;
что тут не так?

можно было с таймером, но с ним все там понятно, а вот в этом варианте?

Заранее спасибо

Последний раз редактировалось KBO; 18.11.2015 в 02:55.
KBO вне форума Ответить с цитированием
Старый 18.11.2015, 09:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему сообщениями? Неужели события не хватает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2015, 11:53   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

не знаю.
Ну попробуйте заполнить сразу у одного TLabel, сразу два события "OnClick" и "OnDblClick", и попробуйте сделать двойной щелчок.
Не знаю как у вас, а у меня постоянно выполняется "OnClick", при всех вариантах нажатия.

Последний раз редактировалось KBO; 18.11.2015 в 11:56.
KBO вне форума Ответить с цитированием
Старый 18.11.2015, 12:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой ой... А зачем делать и то и другое одновременно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2015, 12:25   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Поскольку Label1 не имеет Handle поместил Label1 на панель и PeekMessage для панели. Если вместо Label1 использовать оконный компонент, то подложка не нужна. Небольшая задержка для OnClick обеспечена, собственно она будет если и по таймеру делать
Код:
procedure TForm1.Label1Click(Sender: TObject);
var
  Msg: TMsg;
  Ticks: Cardinal;
begin
  Ticks:=GetTickCount+GetDoubleClickTime;
  while GetTickCount<Ticks do
    if PeekMessage(Msg,Panel1.Handle,WM_LBUTTONDBLCLK,WM_LBUTTONDBLCLK,PM_NOREMOVE) then Exit;
  Label2.Caption:='Click';
end;

procedure TForm1.Label1DblClick(Sender: TObject);
begin
  Label2.Caption:='DblClick';
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.11.2015, 12:41   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой ой... А зачем делать и то и другое одновременно?
Не ой...ой ,
а я работаю с БД, и там есть поля (для заполнения) в 1000 символов. А т.к. у меня на форме много DBMemo (размером с Edit), то в режиме редактирования DataSet, при одном щелчке, я DBMemo расширяю, при двух - привожу их к первоначальному размеру
KBO вне форума Ответить с цитированием
Старый 18.11.2015, 12:52   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
о в режиме редактирования DataSet, при одном щелчке, я DBMemo расширяю
Б-р-р. Мышкой при редактировании тех мемо-окон не работают? Кликают, еще как
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.11.2015, 13:01   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Б-р-р. Мышкой при редактировании тех мемо-окон не работают? Кликают, еще как
Ну так просто мыша (с двойным щелчком) не работает с TDBMemo (она работала также, как и с TLabel),
Ща попробую ваш вариант...

Цитата:
Сообщение от Аватар Посмотреть сообщение
Поскольку Label1 не имеет Handle поместил Label1 на панель...
Label1 можно на панель и не запихивать, у меня и так работает (Label1 апанель рядом стоит)

Последний раз редактировалось Stilet; 18.11.2015 в 13:09.
KBO вне форума Ответить с цитированием
Старый 18.11.2015, 13:11   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при одном щелчке, я DBMemo расширяю, при двух - привожу их к первоначальному размеру
Ужзкокой... Ну тогда опиши события так:
Код:
procedure TForm1.Memo1Click(Sender: TObject);
begin
  with TMemo(Sender) do begin
    OnDblClick:=Memo1DblClick;
    OnClick:=nil;
  end;
end;

procedure TForm1.Memo1DblClick(Sender: TObject);
begin
  with TMemo(Sender) do begin
    OnDblClick:=nil;
    OnClick:=Memo1Click;
  end;
end;
Будет тебе триггер своеобразный.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2015, 13:11   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Label1 можно на панель и не запихивать
Да ради бога, не запихивай. Используй для Label Handle другой подложки, формы например, если лейбл на ней. То же самое будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка числовых последовательностей и последовательная обработка символов Renat(kai) Помощь студентам 3 28.03.2012 23:22
Обработка нажатия динамической кнопки Mr_freeman PHP 10 28.11.2011 23:45
Обработка события нажатия кнопки masm Microsoft Office Access 6 22.08.2011 11:21
Обработка нажатия кнопки на форме myprog Microsoft Office Access 8 17.12.2010 22:37
Обработка сообщения отжатия левой кнопки мыши на компоненте TrackBar CyberJohn Общие вопросы Delphi 5 08.02.2009 12:34