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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Головоломка ООП, очень нужен совет 
:(
    Опции темы
KrasAI
Дата 3.6.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.6.2010

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



Здравствуйте уважаемые. Нужен совет опытных программистов.
И так по порядку:
Есть (пишется) визуальный компонент, ну пусть зовут его TMyComponent наследник TCustomControl. Суть этого компонента заключается в хранении неких не визуальных объектов  (TMyObject). Каждому экземпляру TMyObject, когда он добавляется  в TMyComponent, в поле TMyObject.Owner (TMyObject->FOwner: TObject) записывается указатель владельца, т.е. на сам TMyComponent. Теперь собственно головоломка:
Как сгенерировать событие у TMyComponent при изменении самого TMyObject??? т.е.

Код

MyComponent:= TMyComponent.create(self);
MyObject:= TMyObject.create;
MyComponent.AddObject(MyObject);{MyObject.Owner:= MyComponent}
MyObject.Method;//вот сдеся грубо говоря должно произойти MyComponent.OnEventObject;


Какое решение выбрал я:
у объекта TMyObject описал метод SendМessage(id,w,l:LongInt); который вызывается в методе TMyObject.Method и отправляет сообщение
владельцу FOwner (MyComponent). Этот компонент получив сообщение, в соответствующей процедуре генерирует событие MyComponent.OnEvent;  

Ну примерно так:
Код


 //Реализация метода у объекта
 procedure TMyObject.Method;
 begin
   //всякие действия тута ...
    self.SendМessage(my_message,0,0);
 end
 
 //Реализация метода отправки сообщения у объекта
  procedure TMyObject.SendМessage(id,w,l:LongInt);
  var
    Message: TMessage;
  begin
   if assigned(self.FOwner) then
      begin   
       Message.Msg := ID;
       Message.WParam := w;
       Message.LParam := l;
       self.FOwner.Dispatch(Message);
      end;           
  end
 
 //Реализация метода обработки сообщения у компонента
   procedure TMyComponent.mymessage(var msg: tmymessage); {message my_message;}
     begin
       if assigned(self.FOnEventObject) then
         self.FonEventObject(self);        
     end;   



Вот так. Жду критики. Может есть решение пороще? Спасибо за внимание. 

p.s. предложение вызывать из TmyObject методы владельца TMyComponent, эт недело. TMyObject ничего о них не знает.



PM MAIL   Вверх
Rennigth
Дата 4.6.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 49
Всего: 76



1. Зачем создавать окно (TCustomControl) для хранения объектов?
2. Почему бы не сделать у TMyComponent событие которое будут вызывать TMyObjects?
Что-то вроде...
Код

MyComponent:= TMyComponent.create(self);
MyObject:= TMyObject.create;
MyComponent.OnEvent := MyComponent.DoEvent;
MyComponent.AddObject(MyObject);{MyObject.Owner:= MyComponent}

3. Посмотри на реализацию TList, TStringList и т.д. (например как у них работает Notify).


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
KrasAI
Дата 4.6.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.6.2010

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



Спасибо, что ответили.
Цитата
 1. Зачем создавать окно (TCustomControl) для хранения объектов? 

Ну, TMyComponet - необходимо чтобы был визуальным, в его функциональность входит поочередное отображение (графическое) хранящихся в нем объектов (TMyObject).
Цитата

2.Почему бы не сделать у TMyComponent событие которое будут вызывать TMyObjects?

я же писал выше : 
Цитата
 p.s. предложение вызывать из TmyObject методы владельца TMyComponent, эт недело. TMyObject ничего о них не знает.
. 
Дело в том, что нехочется делать таких связей. Получится "сетка" классов которые по отдельности бесполезны. Ну в тотже TStringList можно добавить любой объект 
Цитата
function TStringList.AddObject(const S: string; AObject: TObject): Integer;


Цитата
3.Посмотри на реализацию TList, TStringList и т.д. (например как у них работает Notify).
 
Ну здесь чуть другое, у класса TStringList есть метод Changing, он и возбуждает событие FOnChanging(Self), т.е. класс сам возбуждает описанное в нем же событие.

У меня ситуация иная, объект TMyObject не знает ничего о методах TMyComponent. Вот как проще всего передать информацию о изменении экземпляра TMyObject в TMyComponent (имея лишь ссылку TMyObject.Owner: TObject); Спасибо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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