Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизEvents Найти похожие ветки
← →
$Hic0 (2004-05-24 18:22) [0]Прошу вас сильно не пинайте, потому что вопрос на самом деле наверное до нельязу тупой :( В той книжке которая у меня есть по Delphi ответа на него нету поэтому пишу сюда, рисерч проведенный в сети тоже не дал ответа. Если кто знает ссылку то дайте почитать, но очень прошу не пинать :) Заранее спасибо.
В общем необходимо в одном классе объявить событие и подписать на него другой класс.
Например в классе Class1 у меня есть поле Filed1. Необходимо чтобы при изменнии значения этого поля, Class2 реагировал :)
Ну чем не тупой вопрос? :) На Дельфях уже не кодил года 3, т.к. перешел на C#, в нем например все это решается следующим образом:
В классе Class1 пишем:
public delegate void Field1Changed(object sender, System.EventArgs e);
public event Field1Changed OnField1Changed;
В тот момент когда оно (поле) изменяется пишемOnFieldChanged(this, new System.EventArgs());
т.е. вызываем это событие.
А Class2 подписывем на него следующим образом:class1.OnField1Changed += new Class1.Field1Changed(Class1Field1ChangedHandler);
т.е. создаем обработчик, теперь в методе Class1Field1ChangedHandler можем делать все что угодно, и он будет вываться каждый раз когда переменная Field1 поменяет значение.
Собственна вопрос:) Как это реализовать в Delphi? Спасибо!
← →
jack128 © (2004-05-24 18:40) [1]TMyObject1 = class
private
FField1: Integer;
FOnChangeField1Events: array of TNotifyEvent;
procedure SetField1(const Value: Integer);
protected
procedure DoChangeProp1; virtual;
public
property Prop1: Integer read FField1 write SetField1;
property OnChangeProp1: TNotifyEvent read FOnChangeFiled1 write FOnChangeFiled1;
end;
TMyObject2 = class
procedure MyHandler(Sender: TObject);
end;
procedure TMyObject1.DoChangeProp1;
begin
if Assigned(FOnChangeField1) then
FOnChangeField1(Self);
end;
procedure TMyObject1.SetField1(const VAlue; Integer);
begin
FField1 := Value;
DoChangeProp1;
end;
var
Obj1: TMyObject1;
Obj2: TMyObject2;
begin
...
Obj1.OnChangeProp1 = Obj2.MyHandler;
...
end;
← →
WebErr © (2004-05-24 18:41) [2]
class Class2
procedure ShowMsg;
end;
class Class1
private
FField1: TField1;
procedure SetField1(Value: TField1);
public // или published
property Field1: TField1 read FField1 write SetField1;
end;
var
C1: Class1;
C2: Class2;
...
procedure Class1.SetField1(Value: TField1);
begin
FField1 := Value;
C2.ShowMsg;
end;
...
← →
Prohodil Mimo (2004-05-24 18:42) [3]Class1 = class(...)
private
FField1:String;
FClass:Class2;
procedure F1Change(Value:String);
published
Property Field1:String Read FField1 Write F1Change;
End;
Class2 = class(...)
private
FField1:String;
published
End;
Procedure Class1.F1Change(Value:String);
Begin
FField1:=Value;
FClass.FField1:=FField1;
{ili vizivat" nebhodimuju proceduru}
End;
Chto-to tipa togo.
← →
Polevi © (2004-05-24 18:45) [4]ручками
property Field1:integer read FField1 write SetField1
procedure SetField1(Value:integer);
begin
if FField1<>Value then
begin
FField1:=Value;
//бежим по списку callback ф-ий и вызываем их
end;
end;
← →
jack128 © (2004-05-24 18:48) [5]
> FOnChangeField1Events: array of TNotifyEvent;
читать как FOnChangeFiled1: TNotifyEvent
← →
$Hic0 (2004-05-24 18:55) [6]thx 2 all. Esp jack128.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c