Конференция "KOL" » проблемка переделки VCL в KOL
 
  • 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;

 
Конференция "KOL" » проблемка переделки VCL в KOL
Есть новые Нет новых   [134432   +18][b:0][p:0.001]