Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объект в объекте [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо