Текущий архив: 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…
Список: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