-
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.GenerateDPRSaveStrings( 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*). -
Спасибо, надеюсь, поможет не только для 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 - подсвечивать только изменённые строки). -
Провермл: в 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
...