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

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

Будет ли KOL портирован на FreePascal?


Страницы:   1 2

Darts ©   (2002-12-23 12:56:00) 

Или заточен только под Delphi?


Boguslaw   (2002-12-29 00:06:00) [21]

What FPC version You used ? I use 1.0.6.
I know that Lazarus team used slighty modified version of FPC. Will this version be better ?


PVOzerski   (2002-12-28 23:21:00) [22]

Значит, так... Я, понятно, не Vladimir Kladov, за него планировать генеральную линию развития KOL не могу. Скажу о проблемах со стороны FPC.
1) Самое отвратительное - FPC не умеет выбрасывать полностью перекрытые виртуальные методы объектов BP-стиля из готового кода. Это обстоятельство препятствует тому самому уменьшению размеров, за которое так любят KOL. А причина - в организации VMT. При этом в FPC Team фиксить здесь ничего не собираются, полагая, что объекты эти нужны только для переноса старых программ.
2) properties для объектов BP-стиля поддерживаются только в довольно глючной версии 1.1, и то только в Delphi-совместимом режиме;
3) BASM INTEL-стиля довольно ограничен по возможностям по сравнению с BASM AT&T. Для компиляции кода KOL его не хватает;
4) Не работает передача параметров в функции через регистры - для части ассемблерных функций это критично;
5) Есть некоторые проблемы с поддержкой свойств по индексу (детали уже не помню).

Так что для переноса KOL надо сначала изрядно потрудиться над компилятором. Добровольцы есть? Считайте, я свой вклад сделал уже давно :^)


Vladimir Kladov   (2002-12-27 16:32:00) [23]

Например, так:

program DivPasFile;

uses
windows, KOL;

procedure DivideFile( const Filename: String );
var SL, FSNames: PStrList;
Outs: PList; // of file streams
i, j: Integer;
S: String;
FS: PStream;

procedure ShowError;
begin
MessageBox( 0, PChar( "Can not execute line " + Int2Str( i ) +
", command: " + SL.Items[ i ] ), "DivPasFile", MB_OK );
end;

begin
SL := NewStrList;
SL.LoadFromFile( Filename );
Outs := NewList;
FSNames := NewStrList;
for i := 0 to SL.Count-1 do
begin
S := UPPERCASE( SL.Items[ i ] );
if StrIsStartingFrom( PChar(S), "{===CREATE" ) then
begin
S := CopyEnd( S, 11 );
S := Trim( Parse(S, "}") );
FS := NewWriteFileStream( S );
if FS.Handle = 0 then
begin
ShowError;
break;
end;
Outs.Add( FS );
FSNames.Add( S );
end
else
if StrIsStartingFrom( PChar(S), "{===APPEND" ) then
begin
S := CopyEnd( S, 11 );
S := Trim( Parse(S, "}") );
FS := NewReadWriteFileStream( S );
if FS.Handle = 0 then
begin
ShowError;
break;
end;
FS.Position := FS.Size;
Outs.Add( FS );
end
else
if StrIsStartingFrom( PChar(S), "{===STOP" ) then
begin
S := CopyEnd( S, 9 );
S := Trim( Parse(S, "}") );
j := FSNames.IndexOf( S );
if j < 0 then
begin
ShowError;
break;
end;
FS := Outs.Items[ j ];
FS.Free;
Outs.Delete( j );
FSNames.Delete( j );
end
{else
if StrIsStartingFrom( PChar(S), "{===COPY" ) then
begin

end}
else
begin
for j := 0 to Outs.Count-1 do
begin
FS := Outs.Items[ j ];
FS.WriteStr( SL.Items[ i ] + #13#10 );
end;
end;
end;
Outs.ReleaseObjects;
FSNames.Free;
SL.Free;
end;

procedure DivideAllFiles;
var i: Integer;
begin
for i := 1 to ParamCount do
( ParamStr( i)

Например, так:

program DivPasFile;

uses
windows, KOL;

procedure DivideFile( const Filename: String );
var SL, FSNames: PStrList;
Outs: PList; // of file streams
i, j: Integer;
S: String;
FS: PStream;

procedure ShowError;
begin
MessageBox( 0, PChar( "Can not execute line " + Int2Str( i ) +
", command: " + SL.Items[ i ] ), "DivPasFile", MB_OK );
end;

begin
SL := NewStrList;
SL.LoadFromFile( Filename );
Outs := NewList;
FSNames := NewStrList;
for i := 0 to SL.Count-1 do
begin
S := UPPERCASE( SL.Items[ i ] );
if StrIsStartingFrom( PChar(S), "{===CREATE" ) then
begin
S := CopyEnd( S, 11 );
S := Trim( Parse(S, "}") );
FS := NewWriteFileStream( S );
if FS.Handle = 0 then
begin
ShowError;
break;
end;
Outs.Add( FS );
FSNames.Add( S );
end
else
if StrIsStartingFrom( PChar(S), "{===APPEND" ) then
begin
S := CopyEnd( S, 11 );
S := Trim( Parse(S, "}") );
FS := NewReadWriteFileStream( S );
if FS.Handle = 0 then
begin
ShowError;
break;
end;
FS.Position := FS.Size;
Outs.Add( FS );
end
else
if StrIsStartingFrom( PChar(S), "{===STOP" ) then
begin
S := CopyEnd( S, 9 );
S := Trim( Parse(S, "}") );
j := FSNames.IndexOf( S );
if j < 0 then
begin
ShowError;
break;
end;
FS := Outs.Items[ j ];
FS.Free;
Outs.Delete( j );
FSNames.Delete( j );
end
{else
if StrIsStartingFrom( PChar(S), "{===COPY" ) then
begin

end}
else
begin
for j := 0 to Outs.Count-1 do
begin
FS := Outs.Items[ j ];
FS.WriteStr( SL.Items[ i ] + #13#10 );
end;
end;
end;
Outs.ReleaseObjects;
FSNames.Free;
SL.Free;
end;

procedure DivideAllFiles;
var i: Integer;
begin
for i := 1 to ParamCount do
DivideFile( ParamStr( i ) );
end;

begin
DivideAllFiles;
end.

После компиляции получается 12К. Подставляем как параметр путь к
нужному файлу: c:\kol\kol.pas, и запускаем. Можно добавить в IDE:
Tools. Остается расставить по kol.pas в нужных местах правильные
директивы (я надеюсь, мне сообщат, где точно их надо поставить, и
какие). И все.


Kirill   (2002-12-26 16:29:00) [24]

А по-подробнее можно? А то я ничего не понял, как это реализовать.


Vladimir Kladov   (2002-12-26 10:50:00) [25]

Разделению KOL.PAS я предпочитаю использование внешнего скрипта,
который выделит указанные куски текста в заданные файлы. Команды для скрипта могут находиться в коде KOL.PAS. Например:

{===CREATE KOLNOWIN.PAS}
... начиная с этой строки все пишется в KOLNOWIN.PAS

{===STOP KOLNOWIN.PAS}
... начиная с этой строки прекращается копирование текста в
KOLNOWIN.PAS

{===APPEND KOLNOWIN.PAS}
... начиная с этой строки текст добавляется в конец KOLNOWIN.PAS

Дело в том, что я уже использовал деление на inc-файлы на начальныхстадиях разработки. Ни сам Delphi, ни многие внешние средства (MemProof, BoundsChecker) не работают с ними хорошо, особенно затрудняется навигация по коду и отладка. Символы условной компиляции тоже не очень хороши для редактора IDE и иногда вводят его в ступор, если начинать править код, который согласно опциям проекта сейчас вне видимости компилятора.

Предлагаемый вариант, по-моему, не очень плох. Исправлять результирующие файлы особого смысла нет. Проще исправить исходный (KOL.PAS) и запустить скрипт. Если использовать именно такие команды, то можно одновременно формировать несколько выходных файлов для различных конфигураций. Например:

{===CREATE KOLLIN.PAS}
{===CREATE KOLNOVISUAL.PAS}
...
{===STOP KOLLIN.PAS}
...
{===STOP KOLNOVISUAL.PAS}
...
{===APPEND KOLLIN.PAS}
...
{===STOP KOLLIN.PAS}

Если надо добавить какой-то код, который не нужен в Windows/Delphi и т.д., можно вставить его дополнительно между {$IFDEF}-{$ENDIF}, и внутри добавить {===APPEND} ... {===STOP}. Или, можно добавить еще команду для скрипта:

{===COPY KOLLIN.PAS FROM "path\Linux1.inc"}


Boguslaw   (2002-12-23 21:42:00) [26]

Why not ? I think I could compile non-visual objects ,but not sure for now. This must lead to break KOL into parts , becouse porting visual part is problematic.

KOL.pas should be just stub which include approprate files for each compiler (Delphi and FPC).
Something like :
{$IFDEF DELPHI}
{$I nonvisual.inc}
{$I visual.inc}
{$ELSE}
{$I nonvisual.inc}
{$ENDIF}

(It is just an example, really it"s more complicated ;-)
I like KOL much but without deep change there is no way to port it to fpc (and without deep knowledge of many issues like GTK library )
Anyway nonvisual objects (with platform independant code) should be portable when these objects will be extracted from KOL.pas file.

Take a look into example below. It is the easiest console program with object based on _TObj (however I extracted _TObj from KOL.pas , that"s why it works ! KOL.pas has too many dependiences)

This almost the same example as original from FPC distribution and it works also in Linux (when compiled by FPC) :-)
I"m starting to learn FPC (and many others multiplatform compilers and GUIs) so if I can do that , someone who knows FPC better can do much more !

{
$Id: hello.pp,v 1.2 2002/02/22 21:46:25 carl Exp $
This file is part of the Free Pascal run time library.
Copyright (c) 1993-98 by the Free Pascal Development Team

Hello World Example

See the file COPYING.FPC, included in this distribution,
for details about the copyright.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

**********************************************************************}

program hello;
{$APPTYPE CONSOLE}
{$MODE DELPHI}
{$asmmode intel}



type
_TObj = object
{* auxiliary object type. See TObj. }
protected
procedure Init;
{* Is called from a constructor to initialize created object instance
filling its fields with 0. Can be overriden in descendant objects
to add another initialization code there. (Main reason of intending
is what constructors can not be virtual in poor objects). }
{=


Darts   (2002-12-23 15:26:00) [27]

Не будет. А жаль...


Страницы:   1 2

Наверх

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