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

Вниз

Доступ класса к главному класса и к его свойствам   Найти похожие ветки 

 
zorik ©   (2008-03-19 09:34) [0]

Допустим есть такая структура:

type
 TChild2 = class
 private
   ...
 end;

 TChild1 = class
 private
   FChild2: TChild2;
   ...
 end;

 TMainClass = class
 private
   FChild1: TChild1;
   FProp1: ...  
   FProp2: ...  
   FProp3: ...  
 end;


Как TChild2 узнать свойства TMainClass?


 
Ega23 ©   (2008-03-19 09:47) [1]

Никак.


 
Ega23 ©   (2008-03-19 09:48) [2]

Хотя смотря что ты имел ввиду...


 
Семеныч   (2008-03-19 09:50) [3]

type
 TChild1 = class;
 TMainClass = class;

 TChild2 = class
 private
   FOwner: TChild1
   ...
 end;

 TChild1 = class
 private
   FChild2: TChild2;
   FOwner: TMainClass;
   ...
 end;

 TMainClass = class
 private
   FChild1: TChild1;
   FProp1: ...  
   FProp2: ...  
   FProp3: ...  
 end;

Каждое поле FOwner внутреннего класса автоматически инициализируется ссылкой на владельца (экземпляра внешнего класса) при создании экземпляра внутреннего класса (причем делает это сам владелец).

Остальное просто: FOwner.FOwner дает из TChild2 ссылку на TMainClass.


 
Ega23 ©   (2008-03-19 09:57) [4]


> Семеныч   (19.03.08 09:50) [3]


Owner в public вынести надо. А то вдруг это не в одном юните?


 
Семеныч   (2008-03-19 10:05) [5]

> Ega23 ©   (19.03.08 09:57) [4]

Само собой. "Поимку ручного льва в пустыне Сахара оставляем читателю в качестве самостоятельного упражнения" (© "Физики шутят").
:о)

Только вынести надо свойство, а не поле. И это свойство должно быть read-only.


 
zorik ©   (2008-03-19 11:37) [6]

я делал что-то такое, как в [3] но не знаю правильно ли это:

TMain = class;

TChild = class
private
  FOwner: TMain
  ...
end;

TMain = class
private
  FChild: TChild;
  ...
end;

constructor TMain.Create;
 inherited Create;
 FChild2 := TChild2.Create;
 FChild2.Owner := Self;
end;

destructor TMain.Destroy;
 FChild.Owner := nil;
 FChild.Free;
 inherited Destroy;
end;


 
zorik ©   (2008-03-19 11:41) [7]

*опечатка:  FChild.Owner = FChild.FOwner


 
trubin ©   (2008-03-19 11:44) [8]


> FChild.Owner := nil;


Это лишнее


> FChild.Owner = FChild.FOwner


см. [4],[5]


 
trubin ©   (2008-03-19 11:46) [9]


>
> > FChild.Owner := nil;
>
>
> Это лишнее


Был не прав


 
trubin ©   (2008-03-19 11:47) [10]


> Был не прав

Блин, нет прав :)))))


 
zorik ©   (2008-03-19 11:51) [11]

Я как раз все оптимизирую и структурирую -- распечатал модуль на бумаге. Дожился )))))))))))))


 
zorik ©   (2008-03-19 12:51) [12]

И еще вопрос. Не хочу создавать новую ветку. Вопрос по списках объектов. Правильно ли я делаю:


 PItem = ^TMyItem;  // --- указатель на елемент

 TMyItem = class  // --- елемент списка
 private
   ...
 public
   ...
 end;

 TMyList = class
 private
   FItems: TList;  // --- список елементов
   procedure Clear;
   function GetCount: Integer;
   function GetItem(Index: Integer): TmyItem;
   procedure SetItem(Index: Integer; Value: TMyItem);
   function AddItem: Integer;
 public
   constructor Create;
   destructor Destroy; override;
   property Items[Index: Integer]: TMyItem read GetItem write SetItem;
   property Count: Integer read GetCount;
 end;

constructor TMyList.Create;
begin
 inherited Create;
 FItems := TList.Create;
end;

destructor TMyList.Destroy;
begin
 Clear;
 FItems.Free;
 inherited Destroy;
end;

procedure TMyList.Clear;
var
 i: Integer;
begin
 for i := Count - 1 downto 0 do
   FreeMem (FItems[i]);
 FItems.Clear;
end;

function TMyList.GetCount: Integer;
begin
 Result := FItems.Count;
end;

function TMyList.GetItem(Index: Integer): TMyItem;
begin
 Result := PItem(FItems[Index])^;
end;

procedure TMyList.SetItem(Index: Integer; Value: TMyItem);
begin
 PItem(FItems[Index])^ := Value;
end;

function TMyList.AddItem: Integer;
var
 AItem: TMyItem;
 NewItem: PItem;
begin
 AItem := TMyItem.Create;
 GetMem (NewItem, SizeOf(TMyItem));
 NewItem^ := AItem;
 Result := FItems.Add(NewItem);
end;


Не нравятся мне здесь указатели, FreeMem в процедуре TMyList.Clear и функция TMyList.AddItem


 
trubin ©   (2008-03-19 13:01) [13]

Для хранения объектов есть TObjectList - наследник TList


> PItem = ^TMyItem;  // --- указатель на елемент
>
>  TMyItem = class  // --- елемент списка
>  private
>    ...
>  public
>    ...
>  end;


Зачем тебе хранить указатели на объект? Переменная объектного типа сама в сущности указатель.

Посмотри исходники TObjectList все станет понятнее.


 
zorik ©   (2008-03-19 14:32) [14]

function TMyList.AddItem: Integer;
var
AItem: TMyItem;
begin
AItem := TMyItem.Create;
Result := FItems.Add(AItem);
end;


что-то такое?


 
Kolan ©   (2008-03-19 14:43) [15]

> Вопрос по списках объектов.

Человеческий способ создать список объектов нужного типа такой:

Объект:
TPaymentScheduleItem = class&#133

Список:
TPaymentSchedule = class(TObjectList)
 private
   function GetItem(Index: Integer): TPaymentScheduleItem;
   procedure SetItem(Index: Integer; const Value: TPaymentScheduleItem);
 public
   function Add(APaymentScheduleItem: TPaymentScheduleItem): Integer;
   property Items[Index: Integer]: TPaymentScheduleItem
     read GetItem write SetItem; default;
 end;


То есть надо закрыть метод Add и свойство Items в TObjectList.

ЗЫ
 Ессно можно и све по закрывать, приме — это необходимый минимум.


 
zorik ©   (2008-03-20 09:14) [16]


> Kolan ©   (19.03.08 14:43) [15]

Спасибо за подсказку



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

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

Наверх




Память: 0.51 MB
Время: 0.022 c
15-1203860095
Ega23
2008-02-24 16:34
2008.04.13
Любителям сайтов типа "Одноклассники"


15-1203874860
Dmitry S
2008-02-24 20:41
2008.04.13
Через 13 часов вылет в столицу...


15-1204398665
TIF
2008-03-01 22:11
2008.04.13
Canvas у... TWebBrowser


2-1206002793
programmist87
2008-03-20 11:46
2008.04.13
ООП


15-1204064466
GanibalLector
2008-02-27 01:21
2008.04.13
Модем Siemens MC35i