Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перекрестные ссылки в компонентах


atruhin ©   (2006-10-11 14:34:00) 

Такая проблемма: есть классы TA, TB
нужно сделать
TA = class
 property MyProp : TB
....

TB = class
 function GetA : TA;

Можно ли это осуществить не помещая классы в один модуль. Классы достаточно большие и мешать их в "кучу" не хочу.


evvcom   (2006-10-12 14:24:00) [1]

> [11] atruhin ©   (12.10.06 13:46)
> > Компоненты - это наследники класса TComponent.
> Я о них и говорю.

По твоему

> [0] atruhin ©   (11.10.06 14:34)
> TA = class
> property MyProp : TB
> ....
>
> TB = class
> function GetA : TA;

Это компоненты?

> Да не сильно большие, вмести немного меньше 3 тыс

И чего тогда их делить? Если они так много должны знать друг о друге?

> Примерно, по логике, как TDatabase, TTable - TTable имеет
> публикуемое свойство TDatabase, а TDatabase должен возвращать
> настроенный TTable в рантайме.

TDatabase, TTable в одном модуле DBTables.


atruhin   (2006-10-12 13:46:00) [2]

> [10] evvcom ©   (12.10.06 11:56)
> Компоненты - это наследники класса TComponent.

Я о них и говорю. У них соответствующие публикуемые свойства, т.е.
> [1] Сергей М. ©   (11.10.06 14:48)
> декларации обоих классов при этом должны фигурировать в
> интерфейсных секциях

я ответил ДА.

> А "большие" - это сколько тысяч строчек?

Да не сильно большие, вмести немного меньше 3 тыс, просто они разные. Там система хранения данных. Примерно, по логике, как TDatabase, TTable - TTable имеет публикуемое свойство TDatabase, а TDatabase должен возвращать настроенный TTable в рантайме.


evvcom   (2006-10-12 11:56:00) [3]

> [9] Loginov Dmitry ©   (12.10.06 07:53)

0,1 :)

> [6] atruhin ©   (11.10.06 18:24)

Ты так и не понял почему Сергей в [5]
> ПлакалЪ ..

Компоненты - это наследники класса TComponent.


Loginov Dmitry   (2006-10-12 07:53:00) [4]

atruhin ©   (11.10.06 14:34)
Классы достаточно большие и мешать их в "кучу" не хочу


А "большие" - это сколько тысяч строчек?


atruhin   (2006-10-11 18:38:00) [5]

> Если один из них можно поместить в implrmrntation

Ну да дак я и объясняю, что нельзя и почему.
> или их можно поместить в один модуль

Об этом я писал в вопросе, классы довольно большие, не охота смешивать.
Вообще вполне устраивает вариант [3] icWasya ©   (11.10.06 15:24)
Так что вопрос можно считать закрытым.


guav   (2006-10-11 18:32:00) [6]

> [6] atruhin ©   (11.10.06 18:24)

вопрос был должны ли они быть в интерфейсных секциях разных модулей. Если один из них можно поместить в implrmrntation или их можно поместить в один модуль - то решается.


atruhin   (2006-10-11 18:24:00) [7]

Ну не так написал. Я имел ввиду, что 1 компонент имеет свойство published ссылающееся на второй, а второй public функцию предоставлющую первый компонент.


Сергей М.   (2006-10-11 16:32:00) [8]


> atruhin ©   (11.10.06 15:13) [2]


ПлакалЪ ..


zorik   (2006-10-11 15:28:00) [9]

type
 TB = class;

 TA = class
   FB: TB;
   property B: TB read FB write FB;
   constructor Create(AOwner: TB); reintroduce; virtual;

 TB class
   FB: TA;
   property A: TA read FA write FA
   constructor Create(AOwner: TA); reintroduce; virtual;

constructor TA.Create;
begin
 inherited Create(AOwner);
 FB := AOwner;
end;

constructor TB.Create;
begin
 inherited Create(AOwner);
 FA := AOwner;
end;

   
Что-то, наподобе этого. Правда в две стороны перекрестные я не делал. У меня внутренний клас, ссылался на того что его создал


icWasya   (2006-10-11 15:24:00) [10]

Прямо нельзя, но если очень хочется...


Unit A;
interface
type
 TCustomA=class(TComponent)
  ....
 protected
  function GetB:TComponent;
 ...
end.



Unit B;
interface
type
 TCustomB=class(TComponent)
  ....
 protected
  function GetA:TComponent;
 ...
end.



UnitAB
interface

type
 TA=class;
 TB=class;
 TA=class(TCustomA)
 public
  function GetB:TB;
 end;
 TB=class(TCustomA)
 public
  function GetA:TA;
end;

implementation
function TA.GetB:TB;
begin
 Result:=TB(inherited GetB);
end;
function TB.GetA:TA;
begin
 Result:=TA(inherited GetA);
end;
 
end.


atruhin   (2006-10-11 15:13:00) [11]

Да это компоненты.


Сергей М.   (2006-10-11 14:48:00) [12]

декларации обоих классов при этом должны фигурировать в интерфейсных секциях соотв.модулей ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо