Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
6-39807
Di_wind
2002-02-22 23:26
2002.05.13
Arp


7-39861
Akim2
2002-02-13 10:29
2002.05.13
Сервис


14-39842
Sergo
2002-04-04 10:45
2002.05.13
Как сделать?


6-39806
UnderSun
2002-02-21 18:22
2002.05.13
Подскажите как программно соединится с Инетом по VPN


1-39795
Executor
2002-04-20 14:14
2002.05.13
StringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский