![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объект в объекте [D7]
Sam Stone © (2004-12-14 20:01:00)Доброго времени суток
Можно ли писать так?
TGameField=class(TComponent)
...
TestField:TGameField;
...
end;
Сейчас у меня генерится AV в конструкторе при создании TestField
constructor TGameField.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);//Исключение здесь
...
end;
Оно правильно на меня ругается?
Ничего "извращенного" нету. В конструкторе я просто инициализирую некоторые переменные.
Sam Stone (2004-12-14 21:12:00) [1]TestField я не в конструкторе создаю. Ошибка уже всплыла.
Не TestField.Create(nil);, как у меня (ну очень-очень стыдно ;(((), а TestField := TGameField.Create(Self);
Просто в самом начале засомневался в возможности реализации класса в самом себе, вот и ломанулся на форум.
Arnold (2004-12-14 21:09:00) [2]Хотя извеняюсь у тебя же создается объект этого же клаасса.
Тогда да нельзя в констуркторе этого писать.
У тебя все должно подвиснуть из за рекурсии
Sam Stone (2004-12-14 21:02:00) [3]2DiamondShark
Кидай в меня тухлыми помидорами.
Да и все остальные тоже. Клинит меня периодически на такие тупости. Так и тянет написать объект.create() :(((
Прошу прощения за ложную тревогу
DiamondShark (2004-12-14 20:58:00) [4]
> Arnold © (14.12.04 20:55) [10]
> DiamondShark
> а что если и в констуркторе??
Да ничего.
Просто тогда встаёт вопрос: а как и где прерывается цепочка вложенности? ;-)
Arnold (2004-12-14 20:55:00) [5]DiamondShark
а что если и в констуркторе??
Он же как раз и существует чтоб создавать и инициализировать переменные класса
конечно они должны следжовать за словом inherited Create(AOwner)
DiamondShark (2004-12-14 20:52:00) [6]
> Если только вот где косяк:
> TestField.Create(nil);//внутри самого GameField
Во-первых,
TestField := TGameField.Create(Self);
Во-вторых, надеюсь, эта строчка не в конструкторе?
Arnold (2004-12-14 20:52:00) [7]у тебя TestField то не существует как ты можешь вызывать у него конструктор.
пиши также как и для GameFiled и все будет ок.
а насчет этого
TField = array [1..10,1..10] of TFieldElement;
то делай вот так
Field:TField;
for I:=1 to 10 do
for J:=1 to 10 do
Filed[I,J]:=TFiledElement.Create(self);
и сё
Sam Stone (2004-12-14 20:40:00) [8]2jack128
GameField:=TGameField.Create(Application);
Если только вот где косяк:
TestField.Create(nil);//внутри самого GameField
Но сейчас притащил Application (И напрямую, и через параметры процедуры) - все равно ругается
Sam Stone (2004-12-14 20:34:00) [9]Пишу TGameField
Но при дебаге дошел до конструктора TComponent.
2Arnold
Создание проглотил, но далее начинает жутко ругаться при создании массива.
TFieldElement = class(TComponent)
private
FType: TPointState;
FDirection: TDirection;
public
Constructor Create(AOwner: TCOmponent);
end;
TField = array [1..10,1..10] of TFieldElement;
Теперь каждому элементу New придется делать?
jack128 (2004-12-14 20:30:00) [10]Sam Stone © (14.12.04 20:23) [3]
Покажи как создаешь объект? Случайно не так:
var
Obj: TGameField;
begin
Obj.Create(nil);
end;
?? ;-)
Arnold (2004-12-14 20:28:00) [11]так ты какой класс пишешь?
TComponent или TGameFiled?
наверна надо так написать
сonstructor TGameFiled.Create(AOwner: TComponent);
Sam Stone (2004-12-14 20:23:00) [12]Из перекрываемых мной только Create и Destroy. Остальное не трогаю.
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];//ЗДЕСЯ АВ - никаких предположений
if AOwner <> nil then AOwner.InsertComponent(Self);
end;
Arnold (2004-12-14 20:22:00) [13]type
PGameField=^TGameFiled;
TGameField=class(TComponent)
...
TestField:PGameField;
...
end;
jack128 (2004-12-14 20:06:00) [14]Какие нить виртуальные методы Component'a перекрываешь? И вообще ставишь в опция проэкта Use debug dcu's и иcследуешь, где имено у тя AV.