Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.13;
Скачать: CL | DM;

Вниз

Как присвоить событию свою процедуру   Найти похожие ветки 

 
SB.John ©   (2002-04-27 11:04) [0]

Нужно в 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 11:11) [1]

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


 
Chilly Willy ©   (2002-04-27 11:47) [2]

Ты объяви 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.


 
Chilly Willy ©   (2002-04-27 11:50) [3]

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


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

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


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

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


 
SB.John ©   (2002-04-27 12:18) [5]

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;


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


 
SB.John ©   (2002-04-27 12:23) [6]

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



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

Идеологически правильнее ИМХО сделать 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;




Страницы: 1 вся ветка

Текущий архив: 2002.05.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
3-39663
Элизабет
2002-04-17 16:46
2002.05.13
Дата1-дата2 в select


1-39772
Anton+
2002-04-28 21:03
2002.05.13
Сбросить таймер.


1-39701
ymin
2002-04-29 16:04
2002.05.13
Showmessage(‘Давление должно быть <’ +inttostr(int2*0.8));


14-39855
XOY
2002-04-02 23:37
2002.05.13
А нафига нужна регистрация?


3-39645
DPashin
2002-04-17 08:17
2002.05.13
Не могу скопировать Blob-поле