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