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

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

Как присвоить событию свою процедуру [D6, WinME, Win2k]


SB.John ©   (2002-04-27 11:04:00) 

Нужно в Run-Time присвоить событию свой код.
Типа: Button1.OnClick = Form1.FormShow;
такой код проходит нормально. Не работает если код не метод формы а простая процедура. Т.е нижеприведенное не работает:

Procedure MyProc(Sender:TObject);
begin
{ some code }
end;

...
Button1.OnClick:= MyProc; // не работает
// Incompatible types: "method pointer and regular procedure"
Button1.OnClick:= TNotifyEvent(MyProc); // не работает
// invalid typecast


Сделать MyProc методом формы я не могу, тк пишу DLL и никакой формы у меня нет. На самом деле компонент не Button1, а TNMSMTP.
Присвоить надо события OnSuccess и OnFailure.


Бурундук   (2002-04-27 12:37:00) [1]

Идеологически правильнее ИМХО сделать MyProc методом класса.

TMyClass = class
class procedure MyProc(Sender: TObject);
end;

button2.OnCLick = TMyClass.MyProc; // безо всяких экземпляров

Если уж пользоваться хакерскими методами (не советую),
то так

procedure NonMethod(Self: TObject; Sender: TObject);
begin
...
end;

q: TNotifyEvent;
TMethod(q).Data := nil; // Self
TMethod(q).Code := @NonMethod;

button2.OnCLick = q;


SB.John   (2002-04-27 12:23:00) [2]

Chilly Willy ©
Твой метод работает, спасибо. А теперь теоретический вопрос. Ясно что твой метод компактнее и проще. А идеологическиправильнее?


SB.John   (2002-04-27 12:18:00) [3]

Chilly Willy ©

Спасибо сейчас попробую. А то я нашел обходной путь, но мне он очень не нравится:

type tmyclass = class
procedure MyProc(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Var myclass:tmyclass;

procedure tmyclass.MyProc(Sender:TObject)
begin
end;

...
button2.OnCLick = myclass.MyProc;


Все работает и даже не пришлось создавть экземпляр моего фиктивного класа, но что-то очень уж коряво.


Chilly Willy   (2002-04-27 11:57:00) [4]

В исправлении своей вины, решение я нашел:


procedure MyProc(sender:TObject);
begin
showmessage("Проверка");
end;

procedure TForm1.Button1Click(Sender: TObject);
var q:TNotifyEvent;
begin
@q:=@MyProc;
button2.OnClick:=q;
end;


Chilly Willy   (2002-04-27 11:50:00) [5]

Ой, извиняюсь...стормозил 8) не заметил твоего упоминания про длл отсутсвие формы 8)


Chilly Willy   (2002-04-27 11:47:00) [6]

Ты объяви MyProc методом формы(или другого класса, как говорит Виктор).
Вот тебе пример(проверял, работает)


unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.MyProc(sender:TObject);
begin
showmessage("Hello world!");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
button2.OnClick:=MyProc;
end;

end.


Виктор Щербаков   (2002-04-27 11:11:00) [7]

Не обязательно делать методом формы.
Можно сделать методом другого класса.


Наверх

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