![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
есть форма с одним label . На события onclick и ondblckick вешаются два обработчика события. Вот код:unit Unit1;
Код:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure Label1DblClick(Sender: TObject);
procedure Label1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Label1Click(Sender: TObject);
begin
ShowMessage('Одинарный клик');
end;
procedure TForm1.Label1DblClick(Sender: TObject);
begin
ShowMessage('Двойной клик');
end;
end.Программы не отделяет двойной и одинарный клик-почему? Как delphi определяет от какого из элементов формы приходит событие onclick если на форме несколько элементов одного типа (например button) если в процедурах объекта FORM это явно не прописано. Инициатором события выступает TOBJECT (SENDER:TOBJECT); Как Delphi определяет какое событие произошло click или dblclick. Это же также явно не прописано и вызывает событие тот же TOBJECT? Код:
procedure TForm1.Label1DblClick(Sender: TObject);
begin
ShowMessage('Двойной клик');
end;Последний раз редактировалось Admin, 14.02.2016 в 19:16. |
|
#2
|
||||
|
||||
|
Клик от дблклика отличается паузой между двумя кликами. Если пауза между кликами попадает в заранее заданный интервал, то система получает событие ДблКлик. Клик происходит не в пустоту, а по некоей области экрана. Системой проверяется какой контрол находится под курсором мыши в момент клика.
А вы неправильно понимаете ситуацию. При двойном клике срабатывают 2 события клика. И если вы проигнорируете первый клик, то вы получите событие ДаблКлика. Но вы то этому не даете произойти выдавая сообщение в паузе между кликами. Отмените выдачу сообщения на клик и у вас заработает двойной клик. Последний раз редактировалось Страдалецъ, 14.02.2016 в 23:36. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
alekso (15.02.2016)
| ||
|
#3
|
|||
|
|||
|
Цитата:
А каким образом определяется событие от элемента Управления, SENDER передает помимо имени объекта сформировавшего события еще и тип события (одинарный клик, двойной клик и.т.д) ? Если да то как программно получить тип события? Последний раз редактировалось alekso, 15.02.2016 в 12:06. |
|
#4
|
||||
|
||||
|
Это уже вопросы не по основам Дельфи, а к обработке сообщений Windows. Дельфи, как и все другие программы написанные в Windows и для Windows использует эту систему сообщений, а эта тема уж поверьте одним постом не закончится, а посему отправляю вас к Гуглю. Там на эту тему море готовой информации.
Последний раз редактировалось Страдалецъ, 15.02.2016 в 13:05. |
|
#5
|
||||
|
||||
|
а TLabel в Delphi вообще уникальный объект. Он вроде для пользователя и есть, но его вроде и нет для Windows
![]() |
|
#6
|
|||
|
|||
|
Наверное я не совсем корректно задал вопрос. Попробую разъяснить на примере EDITa.
есть два события клик на edit и изменение в edite: Код:
procedure TForm3.Edit1Change(Sender: TObject);
begin
ShowMessage('изменение в edit');
end;procedure TForm3.Edit1Click(Sender: TObject); если объект на FORM3 выполнил действие №1 то покажи SHOWMESSAGE1 //как определяется какое именно действие произошло и процедура узнает что нужно сделать именно действие ShowMessage('Click'); // В процедуре же явно не описано что нужно обрабатывать событие click или change begin ShowMessage('Click'); end; Каким образом delphi распознает что в случае клика делать одно действие, а в случае изменения другое. Код:
procedure TForm3.Edit1Change(Sender: TObject); если объект на FORM3 выполнил действие №2 то покажи SHOWMESSAGE2
begin
ShowMessage('изменение в edit');
end;
procedure TForm3.Edit1Click(Sender: TObject);
begin
ShowMessage('Click');
end;Последний раз редактировалось Admin, 16.02.2016 в 19:09. |
|
#7
|
||||
|
||||
|
Цитата:
Вкратце: -Программа на VCL работает в потоке, в котором кружится цикл приема сообщений от системы. -В глобальном смысле, контролы (формы, кнопки, поля ввода и т.д. и т.п.) - окна windows. Вернее даже не сами окна, а обертки над этими окнами. Когда контрол пораждает окно, к этому окну привязывается функция обработки приходящих сообшений Windows. -В параметры этой функции система передает ряд параметров, по одному из них обертка VCL получает ссылку на контрол-обертку окна и передает этому контролу параметры прилетевшего сообщения. -Контрол обертка обрабатывает эти сообщения (WM_ACTIVATE, WM_SHOW, WM_MOUSEDOWN и т.д. и т.п.) -Исходя из перечня обрабатываемых сообщений, контрол генерирует событие OnActivate, OnClick, OnDblClick и т.д. и т.п., передавая в параметр этих событий себя как Sender. Т.е. при сработке события ты можешь узнать, кто его вызвал. Что касается "А как получить какое именно событие произошло?". Если ты в событии OnClick пытаешься узнать, какое событие произошло, то наверное OnClick. Либо некорректен вопрос, либо ты не понимаешь чего тебе самому нужно. И да, TLabel - не оконный контрол. У него нет окна и сообщения получает не он, а его Parent. Но это уже дебри - не забивай голову. |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
alekso (15.02.2016)
| ||
|
#8
|
|||
|
|||
|
Цитата:
Вопрос скорей вот такой, где именно в коде (а не в инспекторе объектов) я могу увидеть что по событию onclick должна вызваться процедура Edit1Click (ну или другая в зависимости от того как я ее назову). |
|
#9
|
||||
|
||||
|
Цитата:
Код:
object fAuthorization: TfAuthorization
Left = 407
Top = 372
BorderStyle = bsDialog
.....................
KeyPreview = True
OldCreateOrder = False
Position = poMainFormCenter
OnKeyPress = FormKeyPress <<<---------------
..........................
object lePassword: TLabeledEdit
Left = 136
Top = 24
Width = 121
Height = 21
EditLabel.Width = 41
EditLabel.Height = 13
EditLabel.Caption = #1055#1072#1088#1086#1083#1100':'
MaxLength = 20
PasswordChar = '*'
TabOrder = 1
OnChange = leLoginChange <<<---------------
end
......
endНо и во время работы программы ты можешь самостоятельно назначить любому контролу процедуру обработки события. procedure TFomr1.MyClickEvent(Sender: TObject); begin /////// end; OkButton.OnClick := MyClickEvent; Последний раз редактировалось dr. F.I.N., 15.02.2016 в 16:11. |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
alekso (15.02.2016)
| ||
|
#10
|
||||
|
||||
|
Можно проверить на задержке, а не двойной ли клик поступил, или тут только одинарка подоспела
Код:
procedure TForm1.Label1Click(Sender: TObject); var Msg: TMsg; TargetTime: Cardinal; begin TargetTime:= GetTickCount + GetDoubleClickTime; while GetTickCount < TargetTime do if PeekMessage(Msg, Handle, WM_LBUTTONDBLCLK, 0, 0) then Exit; (Sender as TLabel).Caption:= 'Одинарный клик'; end; procedure TForm1.Label1DblClick(Sender: TObject); begin (Sender as TLabel).Caption:= 'Двойной клик'; end; А увидеть имя процедуры можно в *.dfm файле данной формы |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
alekso (15.02.2016)
| ||
|
#11
|
|||
|
|||
|
Цитата:
Спасибо огромное!!! |
|
#12
|
|||
|
|||
|
А вот ещё про клики
http://www.transl-gunsmoker.ru/2009/09/windows.html На его сайте есть ещё много интересного |