![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ класса к главному класса и к его свойствам
zorik © (2008-03-19 09:34:00)Допустим есть такая структура:
type
TChild2 = class
private
...
end;
TChild1 = class
private
FChild2: TChild2;
...
end;
TMainClass = class
private
FChild1: TChild1;
FProp1: ...
FProp2: ...
FProp3: ...
end;
Как TChild2узнать свойства TMainClass?
zorik (2008-03-20 09:14:00) [1]
> Kolan © (19.03.08 14:43) [15]
Спасибо за подсказку
Kolan (2008-03-19 14:43:00) [2]> Вопрос по списках объектов.
Человеческий способ создать список объектов нужного типа такой:
Объект:
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-19 14:32:00) [3]
function TMyList.AddItem: Integer;
var
AItem: TMyItem;
begin
AItem := TMyItem.Create;
Result := FItems.Add(AItem);
end;
что-то такое?
trubin (2008-03-19 13:01:00) [4]Для хранения объектов есть TObjectList - наследник TList
> PItem = ^TMyItem; // --- указатель на елемент
>
> TMyItem = class // --- елемент списка
> private
> ...
> public
> ...
> end;
Зачем тебе хранить указатели на объект? Переменная объектного типа сама в сущности указатель.
Посмотри исходники TObjectList все станет понятнее.
zorik (2008-03-19 12:51:00) [5]И еще вопрос. Не хочу создавать новую ветку. Вопрос по списках объектов. Правильно ли я делаю:
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
zorik (2008-03-19 11:51:00) [6]Я как раз все оптимизирую и структурирую -- распечатал модуль на бумаге. Дожился )))))))))))))
trubin (2008-03-19 11:47:00) [7]
> Был не прав
Блин, нет прав :)))))
trubin (2008-03-19 11:46:00) [8]
>
> > FChild.Owner := nil;
>
>
> Это лишнее
Был не прав
trubin (2008-03-19 11:44:00) [9]
> FChild.Owner := nil;
Это лишнее
> FChild.Owner = FChild.FOwner
см. [4],[5]
zorik (2008-03-19 11:41:00) [10]*опечатка: FChild.Owner = FChild.FOwner
zorik (2008-03-19 11:37:00) [11]я делал что-то такое, как в [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;
Семеныч (2008-03-19 10:05:00) [12]> Ega23 © (19.03.08 09:57) [4]
Само собой. "Поимку ручного льва в пустыне Сахара оставляем читателю в качестве самостоятельного упражнения" (© "Физики шутят").
:о)
Только вынести надо свойство, а не поле. И это свойство должно быть read-only.
Ega23 (2008-03-19 09:57:00) [13]
> Семеныч (19.03.08 09:50) [3]
Owner в public вынести надо. А то вдруг это не в одном юните?
Семеныч (2008-03-19 09:50:00) [14]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:48:00) [15]Хотя смотря что ты имел ввиду...
Ega23 (2008-03-19 09:47:00) [16]Никак.