![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемка переделки VCL в KOL
vastani © (2008-10-15 13:41:00)Здравия всем! При попытке быренько переделать 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 ни к чему не привели. Есть ли таковые вообще? Основые моменты, шаги, порядок ,на что обратить внимание и т.д...
vastani (2008-10-16 13:56:00) [1]Всё поборол! Огромное спасибо mdw ©за наводку:
- Объявление TSQLDriver и PSQLDriver должно быть в одном блоке "type".
и
- //type - этого быть не должно!
Итак строка перенесена по совету, но поскольку объявление было сделано с завершающим конструктором типа New.... так:
typeНичего не получалось... видимо именно ввиду наличия между ними function New...... !???
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;
вынос ее "вниз" + советы 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;
MTsv DN (2008-10-16 13:39:00) [2]Ну, не знаю. Вот такая структура:
type
PSQLDriver = ^TSQLDriver;
PSQLStatement = ^TSQLStatement;
TSQLStatement = object(TObj)
private
FSQLDriver: PSQLDriver;
end;
TSQLDriver = object(TObj)
private
FSQLStatement: PSQLStatement;
end;
Компилится "на ура"...
vastani (2008-10-16 13:19:00) [3]неуспел обрадоваться, как пролучил в перенесенной выше строке:
Undeclared identifier: 'TSQLDriver'
замкнутый круг какой то, как уже не кручу - никак...
Неужели это принципиальные ограничения KOL?
Склонен думать, что это я мало знаю... Мужики! Может есть решение?
mdw (2008-10-15 18:36:00) [4]
> Попытка найти хоть какую нить статейку по переделкам (портированию)
> VCL в KOL ни к чему не привели. Есть ли таковые вообще?
> Основые моменты, шаги, порядок ,на что обратить внимание
> и т.д...
Напишите, выложим.;)
mdw (2008-10-15 18:35:00) [5]Неренесите "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);