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

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

проблемка переделки 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
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;


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);


Наверх

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