Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слежение за модификацией объекта 
:(
    Опции темы
December
Дата 29.4.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Greetings All!

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

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


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Демо
Дата 29.4.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Один из вариантов:
Код

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;

 


--------------------
    
PM MAIL ICQ Skype   Вверх
December
Дата 29.4.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



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


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Yanis
Дата 30.4.2006, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0670 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.