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

Вниз

Вопрос по ООП   Найти похожие ветки 

 
EG   (2006-10-10 21:45) [0]

Здравствуйте, не могли бы Вы мне ответить на такой вопрос:

есть что-то вроде

type
 TClass1 = class (Tobject)
   first: string;
   A: THHHHObject;
  end;

Некоторая функция в некотором месте программы возвращает А.
Вопрос: как, зная А, получить доступ к другим полям экземпляра класса TClass1?

Прим.: A.parent возвращяет не экземпляр класса TClass1, а другой объект.

Заранее благодарен за помощь.


 
Ketmar ©   (2006-10-10 21:48) [1]

бр-р-р. сам-то понял, что спросил?


 
Leonid Troyanovsky ©   (2006-10-10 21:50) [2]


> EG   (10.10.06 21:45)  

> Вопрос: как, зная А, получить доступ к другим полям экземпляра
> класса TClass1?


Никак.

--
Regards, LVT.


 
Kolan ©   (2006-10-10 21:52) [3]


> А, получить доступ к другим полям экземпляра класса TClass1?

Никак.
Экземпляр THHHHObject - А просто поле класса TClass1. Те жто композиция.
При такой структуре экземпляр THHHHObject ничего знать не может о TClass1. Его просто используют.


> Прим.: A.parent возвращяет не экземпляр класса TClass1,
> а другой объект.


Это я не понял..


 
EG   (2006-10-10 21:52) [4]

Если у объекта Y полем является объект X, можно ли, зная X, получить доступ ко всем остальням полям, методам, свойствам Y?


 
Джо ©   (2006-10-10 21:56) [5]

> [4] EG   (10.10.06 21:52)
> Если у объекта Y полем является объект X, можно ли, зная
> X, получить доступ ко всем остальням полям, методам, свойствам
> Y?

Для этого в объекте Х должно быть заведено поле или свойство, содержащее ссылку на объект Y.


 
EG   (2006-10-10 21:58) [6]

Этого я и боялся.
Дело в том, что я использую THHHHObject для визуализации экземпляра класса Tclass1, поскольку сам он типа абстрактный, невизуальный.

Как быть, если соприкосновение с миром программы экземпляра Tclass1 идет через его поле THHHHObject.

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


 
EG   (2006-10-10 22:01) [7]


> Для этого в объекте Х должно быть заведено поле или свойство,
>  содержащее ссылку на объект Y.


Как? класс переписывать? THHHHObject - не я писал, а разработчики дельфи


 
Джо ©   (2006-10-10 22:02) [8]

> [6] EG   (10.10.06 21:58)
> Этого я и боялся.
> Дело в том, что я использую THHHHObject для визуализации
> экземпляра класса Tclass1, поскольку сам он типа абстрактный,
> невизуальный.

>
> Как быть, если соприкосновение с миром программы экземпляра
> Tclass1 идет через его поле THHHHObject.
>
> К примеру: У THHHHObject возникает какое-либо событие, в
> случае которого должны измениться поля экземпляра Tclass1.
> Как-то обойти парадигму невозможности можно?

Можно еще проще? Без неверного употребления незнакомых терминов?


 
Kolan ©   (2006-10-10 22:03) [9]


> Дело в том, что я использую THHHHObject для визуализации
> экземпляра класса Tclass1, поскольку сам он типа абстрактный,
>  невизуальный.

Архитектура не верная. Если THHHHObject(дурацкое название) визуализирует экзепрляр Tclass1, то он делжен знать о Tclass1, а Tclass1 о нем знать не должен.

Те в THHHHObject должен быть метод(вариантоа много, это 1 из них) тапа такого:

THHHHObject.VisualiseClass1(A: Tclass1);


 
Leonid Troyanovsky ©   (2006-10-10 22:03) [10]


> EG   (10.10.06 21:58) [6]

> К примеру: У THHHHObject возникает какое-либо событие, в
> случае которого должны измениться поля экземпляра Tclass1.
>  Как-то обойти парадигму невозможности можно?


Пуркуа па?

В обработчике события изменяем поля Tclass1.
Вот, собс-но, и все.

--
Regards, LVT.


 
Kolan ©   (2006-10-10 22:04) [11]


> класс переписывать? THHHHObject

Вообщето есть наследование и др механизмы...


 
Zeqfreed ©   (2006-10-10 22:09) [12]

Каким интересно THHHHObject, написанным разработчиками Delphi, ты визуализируешь свой класс.


 
EG   (2006-10-10 22:12) [13]


> Каким интересно THHHHObject, написанным разработчиками Delphi,
>  ты визуализируешь свой класс.


Да любым. THHHHObject - для неконкретности взято.


 
Kolan ©   (2006-10-10 22:13) [14]


>
> Да любым. THHHHObject - для неконкретности взято.
>

Так что не помогли мы тебе что-ли...


 
EG   (2006-10-10 22:15) [15]


> В обработчике события изменяем поля Tclass1.

Переписать хотя бы частично класс THHHHObject не могу.


> Архитектура не верная. Если THHHHObject(дурацкое название)
> визуализирует экзепрляр Tclass1, то он делжен знать о Tclass1,
>  а Tclass1 о нем знать не должен.

Можно поподробнее как это сделать, если я не могу переписать THHHHObject?

Я новичок и с перекрытием методов, свойств и пр. мне не справиться...:(


 
Leonid Troyanovsky ©   (2006-10-10 22:17) [16]


> Kolan ©   (10.10.06 22:13) [14]

> > Да любым. THHHHObject - для неконкретности взято.

> Так что не помогли мы тебе что-ли...


Сомнения здесь неуместны.

--
Regards, LVT.


 
Джо ©   (2006-10-10 22:17) [17]

> [13] EG   (10.10.06 22:12)
>
> > Каким интересно THHHHObject, написанным разработчиками
> Delphi,
> >  ты визуализируешь свой класс.
>
>
> Да любым. THHHHObject - для неконкретности взято.

Похоже, в данном случае, конкретность не помешает.


 
Kolan ©   (2006-10-10 22:18) [18]


> Я новичок и с перекрытием методов, свойств и пр. мне не
> справиться...:(

Ну ....

Давай реальный(классы, что нужно...) пример может есть элементарное решение.


 
Zeqfreed ©   (2006-10-10 22:19) [19]

> [15] EG   (10.10.06 22:15)

Может все-таки приоткроешь завесу тайны и признаешься что за секретный THHHHObject используешь? Иначе, тебе надо произвести HHHH над HHHH и ещё HHHH с inheritance.


 
Ketmar ©   (2006-10-10 22:21) [20]

ага. и будет полный HHHH до самого HHHH. и да здравствует великий HHHH!
%-)


 
Kolan ©   (2006-10-10 22:28) [21]


> HHHH

Зто сокрашенное название класса TЗаборObject на котором и надо визуальзировать TClass1 :)


 
EG   (2006-10-10 22:30) [22]


> ага. и будет полный HHHH до самого HHHH. и да здравствует
> великий HHHH!
> %-)

С юморком. Это хорошо.

Окей! Выкладываю начисто, так как помочь мне уже некому кроме вас.
Дислокация: Delphi+GLScene.

Код:

type
   TegActor = class (TObject)
     IDname: string;
     Model: TActor;
     Weapons: array of TegWeapon;
     ActiveWeapon: integer;
     constructor Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id:string);
     destructor Free;
     procedure LoadWeapon(cadencer:TGLCadencer;modfn,texfn:string;sc:real);
     procedure ChangeWeapon(number:integer);
     procedure DoIt(action: string; Speed: integer);
     procedure Stand(sender:Tobject);
   end;

И:

constructor TegActor.Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id: string);
begin

 Model:=TActor(cadencer.Scene.Objects.AddNewChild(TActor));
 With Model do
   begin
     LoadFromFile(modfn);
     Scale.Scale(sc);
     Position.X:=x;
     Position.Y:=y;
     Position.Z:=z;
     Material.Texture.Image.LoadFromFile(texfn);
     Material.Texture.Enabled:=true;
     Animations.LoadFromFile(animfn);
     AnimationMode:=aamNone;
     OnEndFrameReached:=Stand;

   end;
 
 IDname:=id;
end;

Этим я хотел расширить класс TActor.
Далее:

procedure TVForm.SceneViewerMouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
 var
pickedObject : TGLBaseSceneObject;
begin
pickedObject:=SceneViewer.Buffer.GetPickedObject(x, y);

if pickedObject<>nil then
// if(pickedObject.ClassNameIs("TActor"))then
  VForm.Caption:= pickedObject.GetParentComponent.ClassName
  else  VForm.Caption:="";
if Shift<>[] then
     Camera1.MoveAroundTarget(mdy-y, mdx-x);
mdx:=x; mdy:=y;

end;

В pickedObject возвращается имя объекта под курсором. Надо показать на экране (или изменить) поле IDName у экземпляра TegActor.


 
EG   (2006-10-10 22:32) [23]

VForm.Caption:= pickedObject.GetParentComponent.ClassName - байда, не обращайте внимания. Но в этом месте и загвоздка.


 
Kolan ©   (2006-10-10 22:36) [24]

А нельзя ли сделать "Менеджер" который бы знал о TegActor, о pickedObject и TVForm. И управлял бы прорисовками по событию?

Или я не понял код...


 
EG   (2006-10-10 22:40) [25]

Возвращается TActor, а мне надо получить объект, чьим полем он является...


 
EG   (2006-10-10 22:44) [26]

ау, скажите хоть что-нить, а то у меня паника скоро начнется


 
Джо ©   (2006-10-10 22:50) [27]

Что-то, ИМХО, тут перемудрено, ну да ладно.

TMyActor = class (TActor)
private
 FEgActor: TegActor;
public
 property EgActor: TegActor read FEActor;
end;

...

constructor TegActor.Create(cadencer:TGLCadencer;modfn,texfn,animfn:string;sc,x,y,z:real;id:  string);
begin

Model:=TActor(cadencer.Scene.Objects.AddNewChild(TActor));
With Model do
  begin
    ...
    FEgActor := Self;
  end;

IDname:=id;
end;

Идея понятна?


 
Джо ©   (2006-10-10 22:52) [28]

Кстати, почему бы не сделать TegActor наследником TActor"а?


 
EG   (2006-10-10 22:54) [29]


> Джо ©   (10.10.06 22:50) [27]


Практически нет.
По-моему так перемудрим еще больше.


 
EG   (2006-10-10 22:58) [30]


> Джо ©   (10.10.06 22:52) [28]
>
> Кстати, почему бы не сделать TegActor наследником TActor"а?
>

Не раз приходило в голову но... КАК? Начинает ругаться, что я перекрываю методы, или чего-то в этом духе....

Мне по идее к TActor"у надо добавить-то пару полей и методов...но...:(

Я считал, что мой вариант проще...иерархия по полям прозрачна ....только сверху вниз, а вот вверх - жопа...


 
Джо ©   (2006-10-10 23:02) [31]

> [30] EG   (10.10.06 22:58)
> Не раз приходило в голову но... КАК?

Вооружившись учебником.


 
EG   (2006-10-10 23:05) [32]


> Джо ©   (10.10.06 23:02) [31]
>
> > [30] EG   (10.10.06 22:58)
> > Не раз приходило в голову но... КАК?
>
> Вооружившись учебником.

это перевернет не только архитектуру программы, но и моего мировоззрения. но и на том спасибо.


 
Amoeba ©   (2006-10-11 11:49) [33]


> это перевернет не только архитектуру программы, но и моего
> мировоззрения

Вот и хорошо. Твое мировоззрение следует поставить с головы на ноги.



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.045 c
1-1158509750
MixAnOL
2006-09-17 20:15
2006.10.29
OLEVariant


15-1159967209
ПЛОВ
2006-10-04 17:06
2006.10.29
HDD-шка шутит?


11-1136814929
Muxaspb
2006-01-09 16:55
2006.10.29
Листер плагин для Total Commander на KOL/MCK


1-1158261697
oxffff
2006-09-14 23:21
2006.10.29
ВDS 2006 тоже не поддерживает custom variant byRef


10-1124916616
Nick Denry
2005-08-25 00:50
2006.10.29
А как использовать события в COM?