|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Вопрос по азам Delphi есть форма с одним 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 На его сайте есть ещё много интересного |