Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Как вызвать событие   Найти похожие ветки 

 
umbra ©   (2005-09-23 10:44) [40]

Ты создал окно. Оно получает от винды ВСЕ сообщения от мыши или клавиатуры. Если ты клацнешь мышой где угодно на экране, твое окно получит сообщение WM_LBUTTONDOWN, в котором указано где имеено на экране клацнули мышой. И тебе надо, как минимум, филтровать эти сообщения и обрабатывать только клики  на твоем окне. Дальше. Тебе надо твое окно рисовать! Ты ведь наследуешь от TControl, а отрисовка окон реализована только в TCustomControl (наследнике TWinControl). Посему в твоей оконной процедуре должны обрабатываться сообщения об отрисовке окна и рисовать его. Иначе его никто не увидит. И т.д. Писать окно снуля - нелегкий труд. Чтобы его избежать и создана VCL.

В общем, наследуй не от TControl, а от TButton, или, в общем, от ближайшего класса, в котором есть похожая функциональность.

Насколько я помню, первоначально вопрос был о том, как присвоить обработчик событию. Ниже - рабочий пример. При запуске проги у Button2 нет обработчика OnClick. После нажатия на Button1 обработчик присваивается, после повторного опять убирается.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure Clicker(sender: TObject);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Clicker(sender: TObject);
begin
 Randomize;
 Color := TColor(Random($FFFFFF));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not Assigned(Button2.OnClick) then
   Button2.OnClick := Clicker
 else
   Button2.OnClick := nil;
end;

end.



 
Quattro ©   (2005-09-24 00:12) [41]

извиняюсь,если надоел глупыми вопросами....в данном примере как мне вызвать обработчик сообщениея??
TMyButton = class(TControl)
 private
   procedure WndProc(var Message:TMessage);override;
   procedure WMLButtonClick(var Msg:TWMLButtonDown);message WM_LBUTTONDOWN;
 public
 end;

procedure TMyButton.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_LBUTTONDOWN then
   But.WMLButtonClick()//Что здесь нужно передать в качестве параметра,имеющего тим TWMouse?;
 inherited WndProc(Message);

end;


 
umbra ©   (2005-09-26 13:33) [42]

В метод-обработчик сообщения не надо ничего передавать. Его не надо даже вызывать самому! Этот метод вызывается автоматически каждый раз, когда контрол получает соответствующее сообщение от винды. Как параметр ей АВТОМАТИЧЕСКИ передается полученное сообщение. Приложение должно на основании информации в сообщении что-то решить. Кроме того, при клике надо обрабатывать 2 сообщения - нажатие левой кнопки мыши и отпускание. И только если для контрола произошли оба - тогда вызывать обработчик события. Честно говоря, я не специалист в этом, и то, что я написал - только мое понимание. Примеры лучше всего смотреть в модуле Controls - объявление и реализацию класса TControl и его наследников. Там есть и TWMLButtonDown.


 
Quattro ©   (2005-09-27 18:06) [43]

ок..спасибо за объяснения и за терпение..=)...



Страницы: 1 2 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.065 c
1-1140293831
Конопелька
2006-02-18 23:17
2006.03.26
Обработка форм из динамичсеких библиотек!?


2-1142189230
Dublicator
2006-03-12 21:47
2006.03.26
Поиск в стеке


5-1127814102
Schooler
2005-09-27 13:41
2006.03.26
TOwnedCollection и стандартный редактор.


2-1141730473
dera
2006-03-07 14:21
2006.03.26
Как узнать координаты точки рисунка, что лежит в Image?


2-1141997654
MC_GMC
2006-03-10 16:34
2006.03.26
Размещение файла в оперативке