Конференция "KOL" » MCK v3.1415926 vs Turbo Delphi [Delphi, Windows]
 
  • UserName © (28.03.11 23:40) [0]
    Доброго времени суток.

    При использовании KOL/MCK в Turbo Delphi возникло несколько проблем, часть решилась после некоторой правки mirror.pas (если что-то из написанного ниже дикость и криворукость просьба поправить, если действительно есть проблема, то просьба внести исправления в новую версию MCK):

    1. Шрифт формы и компонентов:
    При использовании шрифта Tahoma формы и компонентов процедура TKOLFont.Create не пишет в %UnitName%_1.inc
    *.Font.FontName := 'Tahoma'


    в результате используется шрифт 'System'.
    Вылечилось заменой fFontName := 'Tahoma' на fFontName := 'System' в конструкторе TKOLFont.Create.

    2. При использовании некоторых компонентов (например KOLmdvComboboxEx) происходит постоянная перезапись кода (вызов процедуры TKOLForm.GeneratePAS)
    Вылечилось путём добавления в процедуру TKOLProject.Change - TimerTick( fTimer ).

    procedure TKOLProject.Change;
    ...
             Rpt( 'Autobuild timer off/on', WHITE );
             //Rpt_Stack;
             fTimer.Enabled := False;
             TimerTick( fTimer ); //перезапись кода прекратилась
             fTimer.Enabled := True;
    ...



    3. Функция ReadTextFromIDE_0( Reader: IOTAEditReader )
    Проблема в том, что при использовании данной функции постоянно увеличивается текст модуля на одну строку, вылечилось заменой

         GetMem( Result, MS.Size + 1 );
         Move( MS.Memory^, Result^, MS.Size );
         Result[ MS.Size ] := #0;


    на

         GetMem( Result, MS.Size - 1 );
         Move( MS.Memory^, Result^, MS.Size - 1);
         Result[ MS.Size - 2] := #0;



    4. Чтение и запись непосредственно в редакторе кода:

    проблема: процедура LoadSource читает исключительно из файла, функция UpdateSource вообще ничего не делает, хотя запись и чтение в них предусмотрены.

    в модуле ExptIntf  ToolServices определён как  TIToolServices = nil
    в результате чтение и запись в редакторе отваливается т.к. конструкция  
    if ToolServices <> nil then

    всегда false

    решение:
    в обоих процедурах правим конструкцию

      if ToolServices <> nil then
       try
       //Rpt( 'trying to load from IDE Editor: ' + Path );

       ...

       {$IFNDEF VER90}
       {$IFNDEF VER100}

       ...


    следующим образом

      try
      if ToolServices <> nil then
       begin
       //Rpt( 'trying to load from IDE Editor: ' + Path );

       ...
       end;
       {$IFNDEF VER90}
       {$IFNDEF VER100}

       ...



    Т.к. в редакторе могут отсутствовать модули в которые необходимо внести изменения дополняем функцию UpdateSource в самом конце следующим кодом:

     if not Result then
     begin
       SL.SaveToFile(Path); //если нет текста в IDE запишем в файл
       Result := True;
     end;



    5. Сделав правку по п.4 теперь в функции TKOLForm.GeneratePAS
    вместо
    SaveStrings( Source, Path + '.pas', Updated );


    можно использовать для исправления кода в редакторе
    Updated := UpdateSource( Source, Path + '.pas');



    а в функции TKOLProject.GenerateDPR
    SaveStrings( SL, Path + '.dpr', Updated );


    можно использовать для исправления кода в редакторе
    Updated := UpdateSource( SL, Path + '.dpr');



    6. Не работает функция LongStringSeparate.
    Решение:

         if LineWidth + i > 63 then
         begin
           Result := Result + #13#10;
           LineWidth := i;
         end;


    необходимо заменить на:

         LineWidth := LineWidth + i;
         if LineWidth > 80 then
         begin
           Result := Result + #13#10;
           LineWidth := i;
         end;



    7. В функции TKOLProject.GenerateDPR при генерации нового проекта отсутствует {$DEFINE KOL_MCK}, как результат кучка мата от компилятора.
    Решение: необходимо добавить (выделено жирным)

     ...
     // some changes:
     SL.Add( Signature ); // insert signature
     SL.Add( '{$DEFINE KOL_MCK}' ); //insert {$DEFINE KOL_MCK} для *.dpr
     S := '';
     ...
       if RemoveSpaces( S ) = RemoveSpaces( Signature ) then continue; // skip signature if present
       if RemoveSpaces( S ) = RemoveSpaces( '{$DEFINE KOL_MCK}' ) then continue;  //skip '{$DEFINE KOL_MCK}' if present
       if LowerCase( Trim( S ) ) = LowerCase( 'program ' + ProjectName + ';' ) then
     ...



    8. При добавлении собственных модулей в поле uses после конструкции {$IFEND (place your units here->)} (например opengl.pas) и последующей правки формы с добавлением новых компонентов вредный компилятор начинает совать mck модули после пользовательских компонентов.
    Решение:
    в функцию TKOLForm.GeneratePAS были внесены следующие изменения (выделено жирным):

    var
    ...
       L1, L2: Integer; //дополнительные переменные
       S3: String;
    ...
           L1 := 1;
           S1 := '';
           S3 := '';
           while L1 < (Length(S)+1) do
           begin
             S1 := S1 + S[L1];
             if S[L1+1] = ' ' then S1 := S1 + ' ';
             While S[L1+1] = ' ' do L1 := L1+1;
             L1 := L1+1;
           end;
           S3 := 'uses' + #13#10
                 + LongStringSeparate('  Windows, Messages, KOL' +
                    AdditionalUnits + ' {$IF Defined(KOL_MCK)}');
           L1 := Pos('{$IF Defined(KOL_MCK)}', S1) + 22;
           L2 := Pos('(*User unit place here ->*)', S1);
           if L2 >0 then L1 := L2 + 27;
           L2 := Pos('(*<- User unit place here*)', S1);
           if L2 = 0 then L2 := Pos('{$ELSE}', S1);
           S3 := S3  + #13#10
                 + LongStringSeparate('  (*User unit place here ->*)'
                    + Copy(S1, L1, L2 - L1)
                    + '(*<- User unit place here*)') + #13#10
                 + '  {$ELSE}, mirror, Classes, Controls, mckCtrls,' + #13#10
                 + '  mckObjs, Graphics {$IFEND (<- ide place units here)};';

           //S1 := 'uses Windows, Messages, ShellAPI, KOL' + AdditionalUnits;
           S1 := 'uses Windows, Messages, KOL' + AdditionalUnits;

      ...

               Source.Insert( I, S3);
    {            Source.Insert( I,
              //'uses Windows, Messages, ShellAPI, KOL' + AdditionalUnits + ' ' +
              LongStringSeparate( 'uses Windows, Messages, KOL' +
                AdditionalUnits + ' ' + S ) );}


             SL.Add( LongStringSeparate('uses' + #13#10 +
               '  Windows, Messages, KOL' + AdditionalUnits + ' {$IF Defined(KOL_MCK)}' + #13#10 +
               '  (*User unit place here ->*) (*<- User unit place here*)' + #13#10 +
               '  {$ELSE}, mirror, Classes, Controls, mckCtrls,' + #13#10 +
               '  mckObjs, Graphics {$IFEND (<- IDE place units here)};'));
    {          SL.Add( LongStringSeparate(
                     'uses Windows, Messages, KOL' + AdditionalUnits + ' ' +
                       IfNotKolMck[ GlobalNewIF ]
                     + ', mirror, Classes, Controls, mckCtrls, mckObjs, Graphics ' +
                       EndIfKolMck[ GlobalNewIF ] ) );}




    пользовательские модули должны помещаться между (*User unit place here ->*) и (*<- User unit place here*).
  • Vladimir Kladov © (29.03.11 15:20) [1]
    Спасибо, надеюсь, поможет не только для Turbo. До конца недели постараюсь выбрать время и внести Ваши правки в MCK. Со временем сейчас проблемы, не хотелось бы разбираться впопыхах.
  • Dufa © (29.03.11 20:02) [2]
    У меня в турбе таких проблем нету %)
  • UserName © (29.03.11 23:20) [3]

    > У меня в турбе таких проблем нету %)

    У меня такое в турбе ещё с KOL/MCK 2.8 творится О_о
    а счтением/записью исправлений модулей в файл вообще творилось нечто фееричное:
    добавляю компонет на форму
    IDE файл на диске изменён перезагрузить?
    'да', добавляются модули в раздел uses.
    IDE файл на диске изменён перезагрузить?
    'да', компонент исчезает с формы.
    IDE файл на диске изменён перезагрузить?
    'да', удаляются дополнительные модули из раздела uses.


    > Со временем сейчас проблемы, не хотелось бы разбираться впопыхах.

    попыхи вещь неблагодарная:

    ещё раз переделал функцию LongStringSeparate, теперь удаляются двойные пробелы и перевод строки - #13#10, форматирование вполне корректно работает:
    function LongStringSeparate( s: String ): String;
    var i: Integer;
       LineWidth: Integer;
    begin
     Result := '';
     LineWidth := 0;
     while pos( #13#10, s ) > 0 do
     begin
       Delete(s, pos( #13#10, s ), 2);
     end;
     while pos( '  ', s ) > 0 do
     begin
       Delete(s, pos( '  ', s ), 1);
     end;
     while s <> '' do
     begin
       i := pos( ',', s );
       if i <= 0 then i := Length( s );
       if i > 0 then
       begin
         LineWidth := LineWidth + i;
         if LineWidth > 78 then
         begin
           Result := Result + #13#10#32;
           LineWidth := i;
         end;
         Result := Result + Copy( s, 1, i );
         Delete( s, 1, i );
       end;
     end;
    end;



    ещё раз подправил функцию TKOLForm.GeneratePAS

    ...
           S3 := '';
           S3 := 'uses' + #13#10#32#32
                 + LongStringSeparate('Windows, Messages, KOL' +
                    AdditionalUnits + ' {$IF Defined(KOL_MCK)}');
           L1 := Pos('(*User unit place here ->*)', S) + 27;
           if L1 = 27 then L1 := Pos('{$IF Defined(KOL_MCK)}', S) + 22;
           L2 := Pos('(*<- User unit place here*)', S);
           if L2 = 0 then L2 := Pos('{$ELSE}', S);
           S3 := S3  + #13#10#32
                 + LongStringSeparate(' (*User unit place here ->*)'
                    + Copy(S, L1, L2 - L1)
                    + '(*<- User unit place here*)');
           L1 := Pos(';', S) - L1;
           L2 := Pos('(*<- User unit place here*)', S) + 27;
           if L2 = 0 then L2 := Pos('{$ELSE}', S);
           S3 := S3  + #13#10#32 + LongStringSeparate(Copy(S, L2, L1));

           //S1 := 'uses Windows, Messages, ShellAPI, KOL' + AdditionalUnits;
           S1 := 'uses Windows, Messages, KOL' + AdditionalUnits;
    ...

             SL.Add( 'uses' + #13#10#32#32 +
               LongStringSeparate('Windows, Messages, KOL' + AdditionalUnits +
               ' {$IF Defined(KOL_MCK)}') + #13#10 +
               '  (*User unit place here ->*) (*<- User unit place here*)' + #13#10 +
               '  {$ELSE}, mirror, Classes, Controls, mckCtrls,' + #13#10 +
               '  mckObjs, Graphics {$IFEND (<- IDE place units here)};');

    {          SL.Add( LongStringSeparate(
                     'uses Windows, Messages, KOL' + AdditionalUnits + ' ' +
                       IfNotKolMck[ GlobalNewIF ]
                     + ', mirror, Classes, Controls, mckCtrls, mckObjs, Graphics ' +
                       EndIfKolMck[ GlobalNewIF ] ) );}



    пользовательские модули должны помещаться между (*User unit place here ->*) и (*<- User unit place here*) и начинаться с ,
    пример
    (*User unit place here ->*), OpenGL (*<- User unit place here*)



    Сейчас пытаюсь переписать функцию UpdateSource так, чтобы  в редакторе вносились исправления только в необходимые строки, а не перезаписывался весь текст целиком (чтобы можно использовать фичу IDE - подсвечивать только изменённые строки).
  • Vladimir Kladov © (03.04.11 14:24) [4]
    Провермл: в Delphi 7 код нерабочий. После добавления в проект модуля, и установки на форму TKOLForm, uses остается незатронутый, строка { KOL MCK } // Do not remove this line! не вставляется, все, что меняется, это вот эта строка:

    Form2 {$IFDEF KOL_MCK} : PForm2 {$ELSE} : TForm2 {$ENDIF} ;

    И больше никакие изменения не пишутся. В итоге код нерабочий.
    Кстати, а как новый вариант с (*User unit place here ->*) (*<- User unit place here*) предполагается состыковывать с существующими модулями, в которых прописано {$IFEND (place your units here->)} ?

    Если у Вас есть рабочий вариант, выложите его циликом (или по почте пришлите), так, наверное, сподручнее будет. А то, может забыли что.
  • UserName © (04.04.11 01:18) [5]

    > Если у Вас есть рабочий вариант, выложите его циликом (или
    > по почте пришлите), так, наверное, сподручнее будет. А то,
    >  может забыли что.

    да, будет проще, скинул mirror.pas и MCKAppWizard.pas (визард для нового проекта).
  • Dufa © (04.04.11 13:20) [6]
    А что за MCKAppWizard.pas? чем MCKAppExpert200x.pas не устраивает?
  • UserName © (04.04.11 23:16) [7]

    > А что за MCKAppWizard.pas? чем MCKAppExpert200x.pas не устраивает?


    MCKAppWizard.pas это переделанный MCKAppExpert200x.pas под

    "(*User unit place here ->*) (*<- User unit place here*)"

    и добавлен код генерации пустого файла ресурсов, во избежание ругани со стороны IDE


    const
    ...
    res_template = #000#000#000#000#032#000#000#000#255#255#000#000#255#255#000#000 +
                  #000#000#000#000#000#000#000#000#000#000#000#000#000#000#000#000;
    ...

         // gen dummy res file
         resfile := FileCreate(prj + '.res');
         FileWrite(resfile, res_template, 32);
         FileClose(resfile);
         // gen project

    ...

 
Конференция "KOL" » MCK v3.1415926 vs Turbo Delphi [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.013]