Главная страница
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.043 c
2-1142248982
Id
2006-03-13 14:23
2006.03.26
Пользователь SYSDBA


2-1141937403
redlord
2006-03-09 23:50
2006.03.26
Аттрибуты файла


11-1123319382
azsd
2005-08-06 13:09
2006.03.26
Options of KolToolbar have fix style when mirror form create


6-1134491378
Sysanin
2005-12-13 19:29
2006.03.26
Перехват пакетов


2-1141751190
Эля
2006-03-07 20:06
2006.03.26
минимизация многооконного приложения