-
vastani (15.10.08 13:41) [0]Здравия всем! При попытке быренько переделать VCL компонентик по принципам KOL с использованием object(TObj) вместо class наткнулся на проблему.
Имею VCL компонент вида:
type
TSQLDriver = class;
TSQLStatement = class
private
FSQLDriver: TSQLDriver;
................
................
TSQLDriver = class
private
FActive: Boolean;
FStatements: TList;
procedure AddStatement(Stmt: TSQLStatement);
................
................
Посматривая в КOL листинги, стараюсь выдержать философию так:
type
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
................
................
type
PSQLDriver = ^TSQLDriver;
TSQLDriver = object(TObj)
private
FActive: Boolean;
FStatements: PList;
procedure AddStatement(Stmt: PSQLStatement);
................
................
НО! Но, при попытке компилить получаю ругательство, на строки с необьявленными PSQLDriver(TSQLDriver). Преставил TSQLDriver "выше" TSQLStatement, теперь необъявленым оказывается TSQLStatement... Смотрю VCL, понимаю, что самая первая строка
TSQLDriver = class;
решает ТАМ эту проблему, НО в KOL class применять не принято!? Ведь так? Как быть, подскажите.
И еще. Попытка найти хоть какую нить статейку по переделкам (портированию) VCL в KOL ни к чему не привели. Есть ли таковые вообще? Основые моменты, шаги, порядок ,на что обратить внимание и т.д... -
mdw © (15.10.08 18:35) [1]Неренесите "PSQLDriver = ^TSQLDriver;" вперед. Объявление TSQLDriver и PSQLDriver должно быть в одном блоке "type". Примерно так:
type
PSQLDriver = ^TSQLDriver;
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
................
................
//type - этого быть не должно!
TSQLDriver = object(TObj)
private
FActive: Boolean;
FStatements: PList;
procedure AddStatement(Stmt: PSQLStatement); -
mdw © (15.10.08 18:36) [2]
> Попытка найти хоть какую нить статейку по переделкам (портированию)
> VCL в KOL ни к чему не привели. Есть ли таковые вообще?
> Основые моменты, шаги, порядок ,на что обратить внимание
> и т.д...
Напишите, выложим.;) -
vastani (16.10.08 13:19) [3]неуспел обрадоваться, как пролучил в перенесенной выше строке:
Undeclared identifier: 'TSQLDriver'
замкнутый круг какой то, как уже не кручу - никак...
Неужели это принципиальные ограничения KOL?
Склонен думать, что это я мало знаю... Мужики! Может есть решение? -
MTsv DN (16.10.08 13:39) [4]Ну, не знаю. Вот такая структура:type
PSQLDriver = ^TSQLDriver;
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
end;
TSQLDriver = object(TObj)
private
FSQLStatement: PSQLStatement;
end;
Компилится "на ура"... -
vastani (16.10.08 13:56) [5]Всё поборол! Огромное спасибо mdw © за наводку:
- Объявление TSQLDriver и PSQLDriver должно быть в одном блоке "type".
и
- //type - этого быть не должно!
Итак строка перенесена по совету, но поскольку объявление было сделано с завершающим конструктором типа New.... так:type
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
................
................
end;
function NewSQLStatement( AOwner: PObj ): PSQLStatement;
type
PSQLDriver = ^TSQLDriver;
TSQLDriver = object(TObj)
private
FActive: Boolean;
FStatements: PList;
procedure AddStatement(Stmt: PSQLStatement);
................
................
end;
function NewSQLDriver: PSQLDriver;
Ничего не получалось... видимо именно ввиду наличия между ними function New...... !???
вынос ее "вниз" + советы mdw © вылечили дело.
Теперь то компилится следующее:type
PSQLDriver = ^TSQLDriver;
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
................
................
end;
TSQLDriver = object(TObj)
private
FActive: Boolean;
FStatements: PList;
procedure AddStatement(Stmt: PSQLStatement);
................
................
end;
function NewSQLDriver: PSQLDriver;
function NewSQLStatement( AOwner: PObj ): PSQLStatement;