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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
1-1085565806
Yustas
2004-05-26 14:03
2004.06.06
Многоязычность


3-1084721913
Алексей Петухов
2004-05-16 19:38
2004.06.06
Картинки в БД


3-1084840121
Lego82
2004-05-18 04:28
2004.06.06
Как перенести таблицу StringGrid в БД Paradox


14-1084289821
Soft
2004-05-11 19:37
2004.06.06
Искусственный интеллект: философские вопросы реализации?


1-1085380730
therion
2004-05-24 10:38
2004.06.06
как цвет отдельной ячейки в StringGrid