Главная страница
    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.009 c
2-1205852672
Dima
2008-03-18 18:04
2008.04.13
Как включить и выключить микрофон?


2-1205598283
DJ_UZer
2008-03-15 19:24
2008.04.13
Прозрачность формы


2-1205927037
asdf2
2008-03-19 14:43
2008.04.13
Как сделать MultiSelect в TCheckListBox?


15-1204034204
Семеныч
2008-02-26 16:56
2008.04.13
Вопрос по Java


2-1206006900
Aleksandr
2008-03-20 12:55
2008.04.13
ID folder





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский