Главная страница
    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.49 MB
Время: 0.006 c
4-1186600664
cerber
2007-08-08 23:17
2008.04.13
запуск документа ворд из ресурса.


6-1183643255
aDLER
2007-07-05 17:47
2008.04.13
Перехват траффика приложения


15-1203951929
Tirael
2008-02-25 18:05
2008.04.13
как получить document?


2-1205862569
Tovarisch
2008-03-18 20:49
2008.04.13
Не пишет первое слово


15-1202164568
Германн
2008-02-05 01:36
2008.04.13
Web-камера Genius Look 317





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский