Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизСобытийные процедуры. Найти похожие ветки
← →
Zeon (2004-01-16 21:44) [0]Кто нибуть, покажите синтаксис создания собыитйных процедур для своего класса. Допустим у меня есть ской созданный класс, в нём есть какие-то методы. Я хочу создать для него событийные процедуры, что бы при вызове этого метода, автомаитчески выполнялась событийная процедура для него.
ЗЫ: Да, мне стыдно задавать подобный вопрос, просто раньше как-то обходился без них, вот и не знаю :)
← →
Dred2k (2004-01-16 22:26) [1]Примерно так:
type
TMyCallback = procedure(ASender : TObject) of object;
TMyClass = class(TObject)
private
FCallback : TMyCallback;
// ...
public
constructor Create(ACallback : TMyCallback);
destructor Destroy; override;
procedure SomeCall;
published
property Callback : TMyCallback read FCallback write FCallback;
end;
constructor TMyClass.Create(ACallback : TMyCallback)
begin
inherited Create;
FCallback := ACallback;
end;
destructor TMyClass.Destroy;
begin
// ...
inherited Destroy;
end;
procedure TMyClass.SomeCall;
begin
// ...
if(Assigned(FCallback)) then
FCallback(Self);
// ...
end;
← →
Dred2k (2004-01-16 22:32) [2]Используем так:
type
TForm1 = class(TForm)
// ...
procedure Callback(ASender : TObject);
// ...
end;
var Form1 : TForm1;
procedure TForm1.Callback(ASender : TObject);
begin
ShowMessage(ASender.ClassName);
end;
.......
var tmpMyClass : TMyClass;
begin
tmpMyClass := TMyClass.Create(Form1.Callback);
Application.CreateForm(TForm1, Form1);
try
Form1.Show;
// ...
tmpMyClass.SomeCall;
// ...
Form1.Close;
finally
// Form1.Free;
tmpMyClass.Free;
end;
end;
← →
Zeon (2004-01-18 00:56) [3]Большое спасибо за подсказку.
Но я хотел бы немнего уточнить на более простом примере.
Допустим, у меня есть класс:
TMyClass = Class
Constructor Create;
Destructor Destroy;
end;
Как мне добавить в него событие, допустим, OnCreate ?
← →
Palladin (2004-01-18 01:55) [4]именно OnCreate не получится
var
_counter:integer=1;
type
TMyClassEvent1=procedure (Sender:TObject) of object;
TMyClassEvent2=procedure (Sender:TObject;c:integer) of object;
TMyClass=class
private
m_nID:integer;
m_eventEvent1:TMyClassEvent1;
m_eventEvent2:TMyClassEvent2;
public
constructor Create;
procedure DoEvent1;
procedure DoEvent2;
property OnEvent1:TMyClassEvent1 read m_eventEvent1 write m_eventEvent1;
property OnEvent2:TMyClassEvent2 read m_eventEvent2 write m_eventEvent2;
end;
constructor TMyClass.Create;
begin
m_nID:=_Counter;
_Counter:=_Counter+1;
@m_eventEvent1:=nil;
@m_eventEvent2:=nil;
end;
procedure TMyClass.DoEvent1;
begin
if @m_eventEvent1<>nil then m_eventEvent1(self);
end;
procedure TMyClass.DoEvent2;
begin
if @m_eventEvent2<>nil then m_eventEvent2(self,m_nID);
end;
------------
TForm1=class(TForm)...
Object1,
Object2:TMyClass;
procedure ObjectOfMyClass1OnEvent1(Sender:TObject);
procedure ObjectOfMyClass2OnEvent2(Sender:TObject;c:integer);
end;
...
Object1:=TMyClass.Create;
Object1.OnEvent1:=ObjectOfMyClass1OnEvent1;
Object2:=TMyClass.Create;
Object2.OnEvent2:=ObjectOfMyClass2OnEvent2;
Object1.DoEvent1;
Object1.DoEvent2;
Object2.DoEvent1;
Object2.DoEvent2;
Object1.Free;
Object2.Free;
....
← →
KSergey (2004-01-18 06:48) [5]А зачем вот эти строки:
Palladin © (18.01.04 01:55) [4]
constructor TMyClass.Create;
begin
m_nID:=_Counter;
_Counter:=_Counter+1;
@m_eventEvent1:=nil;
@m_eventEvent2:=nil;
end;
Ведь дельфи и без того обнуляет память, выделяемую под экземпляр. Или на всякий случай?
← →
KSergey (2004-01-18 06:49) [6]В дополнение к KSergey © (18.01.04 06:48) [5]
Или причина этому TMyClass= class, т.е. тут не так, как для Object?
← →
Думкин (2004-01-18 07:10) [7]> [6] KSergey © (18.01.04 06:49)
TMyClass=class == TMyClass=class(TObject)
← →
KSergey (2004-01-18 10:08) [8]> Думкин © (18.01.04 07:10) [7]
Призн аюсь, все время путаю чего там по умолчанию от TObject: когда class, или когда object.
Спасибо за напоминание ;)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c