![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||