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


Автор: KrasAI 3.6.2010, 22:33
Здравствуйте уважаемые. Нужен совет опытных программистов.
И так по порядку:
Есть (пишется) визуальный компонент, ну пусть зовут его 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 ничего о них не знает.



Автор: Rennigth 4.6.2010, 10:01
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).

Автор: KrasAI 4.6.2010, 10:34
Спасибо, что ответили.
Цитата
 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); Спасибо.

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