Форум: "Компоненты";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизКак вызвать событие Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.053 c