![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вызвать событие [D7]
rds © (2005-09-20 21:07:00)В своем компоненте Определяю событие, как
type TEvent=procedure(Sender:TObject)
....
private
fOnEvent: TEvent;
....
published
property OnEvent: TEvent read fOnEvent write fOnEvent
В процессе работы методов компонента возникает ситуация, когда должно возникнуть это событие. Каким образом это осуществляется. Т.е. я понимаю, что должен стоять соответствующий вызов, но может кто-то приведет краткий пример?
Reindeer Moss Eater (2005-09-22 15:32:00) [21]И думаешь что ты после этого молодец?
А где обработка сообщений этому окну?
Quattro (2005-09-22 15:28:00) [22]umbra ©
вообще тогда ничего не понимаю......я же в конструктора TMyButton сам создаю кнопку функцией CreateWindow!!....
umbra (2005-09-22 14:03:00) [23]
> Quattro ©
> ёлки зелёные..почему же не србатывает ShowMessage?
Потому, что у тебя на форме не ТMyButton - наследник TControl, а TButton - наследнк TWinControl. А ТMyButton на форме вообще не видно. Отсюда -
> TMyButton.DoShowMes
НИКОГДА не вызывается
Quattro (2005-09-22 14:01:00) [24]Reindeer Moss Eater ©
Логично=)..не поспоришь=)...хм есть предположение что нужен обработчик сообщения WMLBUTTONDOWN для формы....
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure WMLButtonClick(var Msg:TWMLButtonDown);message WM_LBUTTONDOWN;
{ Private declarations }
public
{ Public declarations }
end;
procedure TMyButton.WMLButtonClick(var Msg: TWMLButtonDown);
begin
DoMouseDown;
end;
Reindeer Moss Eater (2005-09-22 13:03:00) [25]я нажму на контрол и обработчик сообщени нажатия должен ,собственно,обработать сообщение....нет?
Канечно нет. Иначе бы ты не спрашивал почему не генерируется событие.
Quattro (2005-09-22 12:58:00) [26]icWasya ©
??..а какая разница??..
Quattro (2005-09-22 12:57:00) [27]Reindeer Moss Eater ©
Прошу меня извинить,если я задаю глупые вопросы.....но что значит как зовут дядю??...я нажму на контрол и обработчик сообщени нажатия должен ,собственно,обработать сообщение....нет?
icWasya (2005-09-22 12:46:00) [28]IMHO - что бы работали вот такие процедуры
procedure WMLButtonClick(var Msg:TWMLButtonDown);message WM_LBUTTONDOWN;
компонент должен быть наследником TWinControl
Reindeer Moss Eater (2005-09-22 12:42:00) [29]И как зовут того дядю, который вызовет твой WMLButtonClick?
Quattro (2005-09-22 12:25:00) [30]хм...обработки сообщения WMLBUTTONDOWN классом TMyButton не достаточно??
Reindeer Moss Eater (2005-09-22 09:13:00) [31]Что бы оно срабатывало, надо как минимум обрабатывать нужные сообщения посылаемые твоему окну.
Где твоя оконная процедура?
Quattro (2005-09-22 03:05:00) [32]ёлки зелёные..почему же не србатывает ShowMessage?
type
TMyButton = class(TControl)
private
FOnClick:TNotifyEvent;
procedure DoMouseDown;
procedure WMLButtonClick(var Msg:TWMLButtonDown);message WM_LBUTTONDOWN;
protected
public
procedure DoShowMes(Sender: TObject);
Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;
property OnClick:TNotifyEvent read FOnClick write FOnClick;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyButton }
constructor TMyButton.Create(AOwner: TComponent);
begin
inherited;
CreateWindow('BUTTON','QWERTY',WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON
,123,115,100,28,Form1.Handle,0,hInstance,nil);
end;
destructor TMyButton.Destroy;
begin
inherited;
end;
procedure TMyButton.DoMouseDown;
begin
if Assigned(FOnClick) then FOnClick(Self);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
But:TMyButton;
begin
But:=TMyButton.Create(nil);
But.Parent:=Self;
But.Show;
But.Top:=10;
But.Left:=10;
But.OnClick:=But.DoShowMes;
end;
procedure TMyButton.WMLButtonClick(var Msg: TWMLButtonDown);
begin
DoMouseDown;
end;
procedure TMyButton.DoShowMes;
begin
ShowMessage('qweqwe');
end;
Reindeer Moss Eater (2005-09-21 17:42:00) [33]Точнее объявлен не там где его ищет компилятор.
But.OnClick:=But.qwe;
Reindeer Moss Eater (2005-09-21 17:39:00) [34]Проблема в том, что идентификатор qwe не объявлен.
Quattro (2005-09-21 17:38:00) [35]
> Оператором присваивания.
> :=
>
> Слышал про такой?
угу...что такое когда то слышал=)......
TMyButton = class(TControl)
private
FOnClick:TNotifyEvent;
procedure DoMouseDown;
procedure WMLButtonClick(var Msg:TWMLButtonDown);message WM_LBUTTONDOWN;
protected
procedure qwe(Sender: TObject);
public
Constructor Create(AOwner:TComponent);override;
Destructor Destroy;override;
property OnClick:TNotifyEvent read FOnClick write FOnClick;
end;
затем пытаюсь назначить обработчик
procedure TForm1.FormCreate(Sender: TObject);
var
But:TMyButton;
begin
But:=TMyButton.Create(nil);
But.Parent:=Self;
But.Show;
But.Top:=10;
But.Left:=10;
But.OnClick:=qwe;
end;
да вот пишет что qwe-ндекларед идентифир ......не подскажите,в чём проблема?
Reindeer Moss Eater (2005-09-21 17:27:00) [36]Оператором присваивания.
:=
Слышал про такой?
Quattro (2005-09-21 17:04:00) [37]Прошу меня извинить за то что влезаю в разговор,но не могли бы вы подсказать как назначить обработчик данному событию Event:TNotifyEvent ???
Leonid Troyanovsky (2005-09-21 11:53:00) [38]
> Юрий Зотов © (20.09.05 22:37) [4]
> Обычно динамическим, т.к. методы диспетчеризации перекрываются
> нечасто, а в таком случае динамический метод дает тот же
> расход памяти, что и виртуальный, но работу ускоряет.
Virtual methods optimize for speed, while dynamic methods optimize for code size.
..
Dynamic methods are useful when a base class declares many overridable
methods which are inherited by many descendant classes in an application,
but only occasionally overridden.
Т.е., не ускоряет, а уменьшает размер (вкупе с наследниками).
--
Regards, LVT.
RDS (2005-09-20 23:37:00) [39]jack128 © (20.09.05 22:02) [3]
Конечно же TEvent = procedure (Sender: Tobject) of object; - моя вина, не правильно написал.
Юрий Зотов (2005-09-20 22:37:00) [40]> jack128 © (20.09.05 22:02) [3]
> этот метод делают виртуальным или динамическим
Обычно динамическим, т.к. методы диспетчеризации перекрываются нечасто, а в таком случае динамический метод дает тот же расход памяти, что и виртуальный, но работу ускоряет.