Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как вызвать событие [D7]


Страницы:   1 2 3

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]

> этот метод делают виртуальным или динамическим

Обычно динамическим, т.к. методы диспетчеризации перекрываются нечасто, а в таком случае динамический метод дает тот же расход памяти, что и виртуальный, но работу ускоряет.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо