Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Слежение за модификацией объекта


Автор: December 29.4.2006, 11:26
Greetings All!

Есть какой-то объект, наследник от TObject. Простой, но с кучей свойств. Эти свойства могут хаотично изменяться в куче мест.
Есть задача - отследить, когда объект изменился (то есть хотя бы одно свойство) и отреагировать. Хочется сделать это наиболее элегантно, с минимальными затратами в кодописании и минимальными усилиями по поддержке системы отслеживания в будущем, когда будут добавляться новые свойства. Программа минимум - прикрутить фнкцию IsModified, идеальный вариант - встроить какой-нить event ObjectModified.

У кого какие есть предложения на эту тему? Может, кто-нить знает какой-нить интерфейс, от которого удобно унаследоваться для выполнения этой задачи? 

Автор: Демо 29.4.2006, 17:59
Один из вариантов:
Код

type
  TMyClassField=(mcfName,mcfAddress);
  TMyClassEvent=procedure(Sender: TObject; ClassField: TMyClassField);

  TMyClass=class
  private
    FName: String;
    FAddress: String;
    FModifyEvent: TMyClassEvent;
    procedure ModifyEvent(ClassField: TMyClassField);
    procedure SetAddress(const Value: String);
    procedure SetName(const Value: String);
  public
    property Name: String read FName write SetName;
    property Address: String read FAddress write SetAddress;
    property Event: TMyClassEvent read FModifyEvent write FModifyEvent;
  end;


Код

implementation
procedure TMyClass.ModifyEvent(ClassField: TMyClassField);
begin
  if Assigned(FModifyEvent) then FModifyEvent(Self,ClassField);
end;

procedure TMyClass.SetAddress(const Value: String);
begin
  if FAddress=Value then Exit;
  FAddress := Value;
  ModifyEvent(mcfAddress);
end;

procedure TMyClass.SetName(const Value: String);
begin
  if FName=Value then Exit;
  FName := Value;
  ModifyEvent(mcfName);
  FName := Value;
end;

 

Автор: December 29.4.2006, 20:43
Демо, это очень трудоёмкий вариант. У меня в каждом классе около 50 свойств, классов - 3 штуки. Каждый вот так перелопачивать - это долго smile 

Автор: Yanis 30.4.2006, 09:30
И всё таки навреное это самый простой способ да к тому же более гибкий. Так что смотри код Yanis'а и код Демо.
http://forum.vingrad.ru/index.php?showtopic=91976 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)