Recent

Author Topic: KOL4 Beta available.  (Read 921 times)

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
KOL4 Beta available.
« on: July 16, 2026, 04:15:15 pm »
I have committed an initial new KOL version 4 repository with working code on github.
KOL makes your GUI executables much smaller (about 10 - 200 times, really) , but it is a framework, you can not mix with Lazarus LCL code or Delphi VCL, but you can use all rtl units.
All older KOL projects should work. Let me know if it doesn't.
The MCK (The design controls) are not yet translated.

Link:
https://github.com/Thaddy/kol4/blob/main/
Simple example:
Code: Pascal  [Select][+][-]
  1. {$ifdef fpc}{$mode delphi}{$endif}
  2. uses kol;
  3. begin
  4.   applet := newform(nil, 'kol64').SetSize(800,600);
  5. end.
With fpc -CX -XXs ~70kb, 45kb with older versions.
With D12.1 ~70kb too.
With D7 ~21kb
With D7 + system replacement ~14kb. That is kilo, not mega...

FreePascal is supported from version 2.6.x.
It is definitely Windows only.

Good instruction site:
https://www.artwerp.be/kol/index.html
« Last Edit: July 18, 2026, 06:05:52 pm by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

schuler

  • Sr. Member
  • ****
  • Posts: 382
Re: KOL4 Beta available.
« Reply #1 on: July 16, 2026, 06:34:34 pm »
:) I've just had the luck to give the first star of the project! :)

schuler

  • Sr. Member
  • ****
  • Posts: 382
Re: KOL4 Beta available.
« Reply #2 on: July 17, 2026, 02:23:51 am »
The Free Pascal community is just too strict. 11 hours have passed and only one star from me... If FP developers do not value the work of other FP developers, we should not expect admiration beyond our own borders...
« Last Edit: July 17, 2026, 02:27:29 am by schuler »

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #3 on: July 17, 2026, 06:20:26 am »
Thanks, Joao.
Many developers are aware of KOL, but it has a different paradigm that the may or may not like.
I merely resurrected it for those that appreciated it back in the early 2000's and made it maintainable again.
Although the core units now work with modern Delphis and Freepascal, there is a lot left to do, like the MCK and most of the add-ons, documentation updates, etc.
I also need to debug the include file for Delphi versions that do not support {$if D2..D7 need $ifdefs}. Freepascal is unaffected.I also need to check the version for WINCE (armv4)

I don't expect it to be the success it was back then. But people who worked with KOL in the past might be interested.
« Last Edit: July 17, 2026, 06:26:08 am by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

Fibonacci

  • Hero Member
  • *****
  • Posts: 1081
  • Behold, I bring salvation - Unleashed Pascal
    • fibo.gg
Re: KOL4 Beta available.
« Reply #4 on: July 17, 2026, 06:47:39 am »
Another star from me :)

I remember pestering you about KOL years ago, asking again and again when it'd finally happen - and here it is. Never used it myself (too young for that... :D), but I'll take a look later and see if it's still good for anything these days. Is this Unleashed-compatible? :D I might add it to the installer someday.



The example you posted creates the form in code, but you wrote back then that it replaces LCL/VCL and that you could drop components onto a form. So which is it - does it actually have components you can drop on a form, or is everything done in code?

Because if it's code-only, I've already got my own lib for that :-X
« Last Edit: July 17, 2026, 06:53:10 am by Fibonacci »
Unleashed Pascal: async/await, parallel for, match, tuples, string interpolation, inline vars, autofree, no-RTTI & tons more. Star on GitHub

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #5 on: July 17, 2026, 10:14:44 am »
It is possible to use the mck mirror classes for Delphi: that makes the designer very VCL like, but uses kol to generate the code. That part I am still working on because Lazarus refuses to coöperate with mck right now.
(I blame myself, though, will be OK soon) I never used mck much, I prefer to use Kol from code.
If you use only a single part of the LCL or classes (possible) you will loose all size advantages.
« Last Edit: July 17, 2026, 05:42:40 pm by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

CM630

  • Hero Member
  • *****
  • Posts: 1772
  • Не съм сигурен, че те разбирам.
    • http://sourceforge.net/u/cm630/profile/
Re: KOL4 Beta available.
« Reply #6 on: July 17, 2026, 12:40:01 pm »
The Free Pascal community is just too strict. 11 hours have passed and only one star from me... If FP developers do not value the work of other FP developers, we should not expect admiration beyond our own borders...
All I understood is that this thing allows making small size apps with fpc, or maybe even Lazarus? Making small size apps in Lazarus is worth many stars, if this is the case.
There are demos in https://github.com/Thaddy/kol4/tree/main/demos, but there are no .lpi and .lpr files there, I guess .dpr and .dproj are some Delphi things. But Delphi (used to) make small executables anyway.
Indeed, I am not a dev at all.
« Last Edit: July 17, 2026, 02:39:50 pm by CM630 »
Лазар 4,8 32 bit (sometimes 64 bit); FPC3,2,2

LemonParty

  • Hero Member
  • *****
  • Posts: 618
Re: KOL4 Beta available.
« Reply #7 on: July 17, 2026, 01:22:54 pm »
Interesting what the size differences when https://wiki.freepascal.org/Whole_Program_Optimization is used?
Lazarus v. 4.99. FPC v. 3.3.1. Windows 11

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #8 on: July 17, 2026, 04:37:51 pm »
You can use WPO and test. I do not use WPO with Kol, except when my software needs to be binary released and it happens to be written with Kol. (not done that yet)
But it won't make much of a difference with old school objects, if any: I don't really know if Jonas implemented WPO for old school objects. Although, similar to classes, there can be a vmt.
WPO is not a holy grail for reaching really small binaries. Using old school objects is. Or using the Windows API directly  ;D
« Last Edit: July 17, 2026, 05:10:34 pm by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #9 on: July 17, 2026, 04:45:13 pm »
There are demos in https://github.com/Thaddy/kol4/tree/main/demos, but there are no .lpi and .lpr files there, I guess .dpr and
I will add these. For now just use the import feature from Lazarus. For the command line compilers that does not matter if its extension is called dpr or pas: fpc -CX -XXs -Os -Mdelphi <your project>

Currently I am focussing on getting all the compilers to work it is supposed to support and luckily I have licenses and disks or floppies!(yes!) for most of them and Freepascal can look back into the past. That is time-consuming.
I also will add all the svn repositories for extra's, but these also need to be examined by hand. No AI here...
« Last Edit: July 17, 2026, 05:02:48 pm by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #10 on: July 18, 2026, 06:23:08 pm »
Funny, I instructed my define parser to parse for SMALLEST_CODE: that is frankly a mistake and removes too much functionality (not much but too much).
I will rerun it and there will be an update to 4.00RC2 tomorrow.
I ran into that while testing demos from old sources.
It only affects font handling and manifests: the code is sound otherwise. Font handling is a major issue, though: simply does not look right...After the fix you can always define SMALLEST_CODE yourself.
« Last Edit: July 18, 2026, 06:43:39 pm by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #11 on: July 25, 2026, 09:00:45 am »
There was an issue with Delphi 6 and 7 that did not affect KOL for Freepascal, but is now fixed because these compilers are important for the KOL ecosystem. This means versioning has become a bit more complex, but I have an auto generator (see code below) for koldef.inc that I will add to the repository later.
The reason is described below: support for Freepascal and Higher Delphi versions are not affected.

  Version detection for Delphi and Free Pascal
  Supports Delphi 2..12 Athens and FPC 2.6+

  NOTE: This version avoids {$IF CompilerVersion >= N} entirely.
  Delphi 6/7 support {$IFDEF CONDITIONALEXPRESSIONS} but their {$IF}
  evaluator does not reliably handle comparisons against CompilerVersion
  (especially real-number comparisons like >= 18.5), so every "orHigher"
  symbol below is set explicitly per {$IFDEF VERxxx} block instead.

  This is only to keep the file compatible with Delphi 6 and 7
  and frankly needlessly complex otherwise.
  This also means that for every newer version you have to add the affected
  two compiler define blocks in full.
 
This include file may also be helpful if you maintain code that is supposed to compile in both Delphi 6 or Delphi 7 and FreePascal 2.6.x+.
This is relevant since more than a few here do exactly that!

This little utility does the trick:
Code: Pascal  [Select][+][-]
  1. program KolDefGen;
  2.  
  3. {$IFDEF FPC}
  4.   {$MODE DELPHI}
  5. {$ENDIF}
  6. {$APPTYPE CONSOLE}
  7.  
  8. (*-----------------------------------------------------------------------------
  9.   KolDefGen - regenerates koldef.inc, extended with one new Delphi version.
  10.  
  11.   Usage:
  12.     koldefgen <vernum> [shortname] [comment] [outputfile]
  13.  
  14.   Examples:
  15.     koldefgen 370
  16.     koldefgen 370 _D13 "Delphi 13"
  17.     koldefgen 370 _D13 "Delphi 13" koldef.inc
  18.  
  19.   <vernum>     the number after VER in the new {$IFDEF VERxxx}, e.g. for
  20.                {$IFDEF VER370} pass 370. This is the only required argument.
  21.   [shortname]  identifier used for the version, e.g. _D13. Defaults to
  22.                '_DVER<vernum>' if omitted.
  23.   [comment]    free text put in the generated comment, e.g. "Delphi 13".
  24.                Defaults to 'Delphi (VER<vernum>)' if omitted.
  25.   [outputfile] defaults to koldef.inc in the current directory.
  26.  
  27.   Only Delphi version handling is generated here; the FPC-specific block
  28.   is emitted unchanged/static, as agreed - extend separately if needed.
  29. -----------------------------------------------------------------------------*)
  30.  
  31. uses
  32.   SysUtils, Classes;
  33.  
  34. type
  35.   TVerEntry = record
  36.     VerNum: Integer;
  37.     OwnDefines: TArray<string>;    // defines set only for this exact version
  38.     HigherDefines: TArray<string>; // cascading defines from this version up
  39.     Comment: string;
  40.   end;
  41.  
  42. var
  43.   KnownVersions: TArray<TVerEntry>;
  44.  
  45. procedure InitKnownVersions;
  46. begin
  47.   SetLength(KnownVersions, 22);
  48.  
  49.   KnownVersions[0].VerNum := 140; KnownVersions[0].OwnDefines := ['_D6'];
  50.   KnownVersions[0].HigherDefines := ['_D6orHigher']; KnownVersions[0].Comment := 'Delphi 6';
  51.  
  52.   KnownVersions[1].VerNum := 150; KnownVersions[1].OwnDefines := ['_D7'];
  53.   KnownVersions[1].HigherDefines := ['_D7orHigher']; KnownVersions[1].Comment := 'Delphi 7';
  54.  
  55.   KnownVersions[2].VerNum := 170; KnownVersions[2].OwnDefines := ['_D8', '_D2005'];
  56.   KnownVersions[2].HigherDefines := ['_D8orHigher', '_D2005orHigher'];
  57.   KnownVersions[2].Comment := 'Delphi 2005 (also known as D8 .NET)';
  58.  
  59.   KnownVersions[3].VerNum := 180; KnownVersions[3].OwnDefines := ['_D2006'];
  60.   KnownVersions[3].HigherDefines := ['_D2006orHigher']; KnownVersions[3].Comment := 'Delphi 2006';
  61.  
  62.   KnownVersions[4].VerNum := 185; KnownVersions[4].OwnDefines := ['_D2007'];
  63.   KnownVersions[4].HigherDefines := ['_D2007orHigher']; KnownVersions[4].Comment := 'Delphi 2007';
  64.  
  65.   KnownVersions[5].VerNum := 200; KnownVersions[5].OwnDefines := ['_D2009'];
  66.   KnownVersions[5].HigherDefines := ['_D2009orHigher']; KnownVersions[5].Comment := 'Delphi 2009';
  67.  
  68.   KnownVersions[6].VerNum := 210; KnownVersions[6].OwnDefines := ['_D2010'];
  69.   KnownVersions[6].HigherDefines := ['_D2010orHigher']; KnownVersions[6].Comment := 'Delphi 2010';
  70.  
  71.   KnownVersions[7].VerNum := 220; KnownVersions[7].OwnDefines := ['_DXE'];
  72.   KnownVersions[7].HigherDefines := ['_DXEorHigher']; KnownVersions[7].Comment := 'Delphi XE';
  73.  
  74.   KnownVersions[8].VerNum := 230; KnownVersions[8].OwnDefines := ['_DXE2'];
  75.   KnownVersions[8].HigherDefines := ['_DXE2orHigher']; KnownVersions[8].Comment := 'Delphi XE2';
  76.  
  77.   KnownVersions[9].VerNum := 240; KnownVersions[9].OwnDefines := ['_DXE3'];
  78.   KnownVersions[9].HigherDefines := ['_DXE3orHigher']; KnownVersions[9].Comment := 'Delphi XE3';
  79.  
  80.   KnownVersions[10].VerNum := 250; KnownVersions[10].OwnDefines := ['_DXE4'];
  81.   KnownVersions[10].HigherDefines := ['_DXE4orHigher']; KnownVersions[10].Comment := 'Delphi XE4';
  82.  
  83.   KnownVersions[11].VerNum := 260; KnownVersions[11].OwnDefines := ['_DXE5'];
  84.   KnownVersions[11].HigherDefines := ['_DXE5orHigher']; KnownVersions[11].Comment := 'Delphi XE5';
  85.  
  86.   KnownVersions[12].VerNum := 270; KnownVersions[12].OwnDefines := ['_DXE6'];
  87.   KnownVersions[12].HigherDefines := ['_DXE6orHigher']; KnownVersions[12].Comment := 'Delphi XE6';
  88.  
  89.   KnownVersions[13].VerNum := 280; KnownVersions[13].OwnDefines := ['_DXE7'];
  90.   KnownVersions[13].HigherDefines := ['_DXE7orHigher']; KnownVersions[13].Comment := 'Delphi XE7';
  91.  
  92.   KnownVersions[14].VerNum := 290; KnownVersions[14].OwnDefines := ['_DXE8'];
  93.   KnownVersions[14].HigherDefines := ['_DXE8orHigher']; KnownVersions[14].Comment := 'Delphi XE8';
  94.  
  95.   KnownVersions[15].VerNum := 300; KnownVersions[15].OwnDefines := ['_D10'];
  96.   KnownVersions[15].HigherDefines := ['_D10orHigher']; KnownVersions[15].Comment := 'Delphi 10 Seattle';
  97.  
  98.   KnownVersions[16].VerNum := 310; KnownVersions[16].OwnDefines := ['_D101'];
  99.   KnownVersions[16].HigherDefines := ['_D101orHigher']; KnownVersions[16].Comment := 'Delphi 10.1 Berlin';
  100.  
  101.   KnownVersions[17].VerNum := 320; KnownVersions[17].OwnDefines := ['_D102'];
  102.   KnownVersions[17].HigherDefines := ['_D102orHigher']; KnownVersions[17].Comment := 'Delphi 10.2 Tokyo';
  103.  
  104.   KnownVersions[18].VerNum := 330; KnownVersions[18].OwnDefines := ['_D103'];
  105.   KnownVersions[18].HigherDefines := ['_D103orHigher']; KnownVersions[18].Comment := 'Delphi 10.3 Rio';
  106.  
  107.   KnownVersions[19].VerNum := 340; KnownVersions[19].OwnDefines := ['_D104'];
  108.   KnownVersions[19].HigherDefines := ['_D104orHigher']; KnownVersions[19].Comment := 'Delphi 10.4 Sydney';
  109.  
  110.   KnownVersions[20].VerNum := 350; KnownVersions[20].OwnDefines := ['_D11'];
  111.   KnownVersions[20].HigherDefines := ['_D11orHigher']; KnownVersions[20].Comment := 'Delphi 11 Alexandria';
  112.  
  113.   KnownVersions[21].VerNum := 360; KnownVersions[21].OwnDefines := ['_D12'];
  114.   KnownVersions[21].HigherDefines := ['_D12orHigher']; KnownVersions[21].Comment := 'Delphi 12 Athens';
  115. end;
  116.  
  117. function IndexOfVerNum(const AVerNum: Integer): Integer;
  118. var
  119.   i: Integer;
  120. begin
  121.   Result := -1;
  122.   for i := 0 to High(KnownVersions) do
  123.     if KnownVersions[i].VerNum = AVerNum then
  124.       Exit(i);
  125. end;
  126.  
  127. procedure AppendVersion(const AVerNum: Integer; const AShortName, AComment: string);
  128. var
  129.   n: Integer;
  130.   e: TVerEntry;
  131. begin
  132.   if IndexOfVerNum(AVerNum) >= 0 then
  133.     raise Exception.CreateFmt('VER%d is already a known version - nothing to add.', [AVerNum]);
  134.  
  135.   e.VerNum := AVerNum;
  136.   e.OwnDefines := [AShortName];
  137.   e.HigherDefines := [AShortName + 'orHigher'];
  138.   e.Comment := AComment;
  139.  
  140.   n := Length(KnownVersions);
  141.   SetLength(KnownVersions, n + 1);
  142.   KnownVersions[n] := e;
  143.  
  144.   // keep the table sorted by VerNum ascending (simple insertion sort step)
  145.   while (n > 0) and (KnownVersions[n - 1].VerNum > KnownVersions[n].VerNum) do
  146.   begin
  147.     e := KnownVersions[n - 1];
  148.     KnownVersions[n - 1] := KnownVersions[n];
  149.     KnownVersions[n] := e;
  150.     Dec(n);
  151.   end;
  152. end;
  153.  
  154. function BuildFile: TStringList;
  155. var
  156.   L: TStringList;
  157.   i, j: Integer;
  158.   cumulativeHigher: TArray<string>;
  159.   d: string;
  160. begin
  161.   L := TStringList.Create;
  162.   L.Add('(*-----------------------------------------------------------------------------');
  163.   L.Add('  Version detection for Delphi and Free Pascal');
  164.   L.Add(Format('  Supports Delphi 2..%s and FPC 2.6+', [KnownVersions[High(KnownVersions)].Comment]));
  165.   L.Add('  NOTE: This version avoids {$IF CompilerVersion >= N} entirely.');
  166.   L.Add('  Delphi 6/7 support {$IFDEF CONDITIONALEXPRESSIONS} but their {$IF}');
  167.   L.Add('  evaluator does not reliably handle comparisons against CompilerVersion');
  168.   L.Add('  (especially real-number comparisons like >= 18.5), so every "orHigher"');
  169.   L.Add('  symbol below is set explicitly per {$IFDEF VERxxx} block instead.');
  170.   L.Add('  This file was generated by koldefgen - do not hand-edit the version');
  171.   L.Add('  cascade below; re-run the generator instead.');
  172.   L.Add('-----------------------------------------------------------------------------*)');
  173.   L.Add('');
  174.   L.Add('{--- Delphi 2 .. 5 (no CONDITIONALEXPRESSIONS) ------------------------------}');
  175.   L.Add('{$IFDEF VER90}  // Delphi 2');
  176.   L.Add('  {$DEFINE _D2}');
  177.   L.Add('  {$DEFINE _D2orD3}');
  178.   L.Add('  {$DEFINE _D2orD3orD4}');
  179.   L.Add('{$ENDIF}');
  180.   L.Add('');
  181.   L.Add('{$IFDEF VER100} // Delphi 3');
  182.   L.Add('  {$DEFINE _D3}');
  183.   L.Add('  {$DEFINE _D3orHigher}');
  184.   L.Add('  {$DEFINE _D2orD3}');
  185.   L.Add('  {$DEFINE _D2orD3orD4}');
  186.   L.Add('  {$DEFINE _D3orD4}');
  187.   L.Add('{$ENDIF}');
  188.   L.Add('');
  189.   L.Add('{$IFDEF VER120} // Delphi 4');
  190.   L.Add('  {$DEFINE _D3orHigher}');
  191.   L.Add('  {$DEFINE _D3orD4}');
  192.   L.Add('  {$DEFINE _D4}');
  193.   L.Add('  {$DEFINE _D4orHigher}');
  194.   L.Add('  {$DEFINE _D2orD3orD4}');
  195.   L.Add('  {$IFnDEF KOL_MCK}');
  196.   L.Add('    {$DEFINE INPACKAGE}');
  197.   L.Add('  {$ENDIF}');
  198.   L.Add('{$ENDIF}');
  199.   L.Add('');
  200.   L.Add('{$IFDEF VER130} // Delphi 5');
  201.   L.Add('  {$DEFINE _D3orHigher}');
  202.   L.Add('  {$DEFINE _D4orHigher}');
  203.   L.Add('  {$DEFINE _D5}');
  204.   L.Add('  {$DEFINE _D5orHigher}');
  205.   L.Add('{$ENDIF}');
  206.   L.Add('');
  207.   L.Add('{--- Delphi 6 and above -----------------------------------------------------}');
  208.   L.Add('{$IFDEF CONDITIONALEXPRESSIONS}');
  209.   L.Add('  // These version-specific symbols are always true for D6+');
  210.   L.Add('  {$DEFINE _D3orHigher}');
  211.   L.Add('  {$DEFINE _D4orHigher}');
  212.   L.Add('  {$DEFINE _D5orHigher}');
  213.   L.Add('');
  214.  
  215.   SetLength(cumulativeHigher, 0);
  216.   for i := 0 to High(KnownVersions) do
  217.   begin
  218.     // extend the cumulative "orHigher" list with this version's own higher-defines
  219.     for j := 0 to High(KnownVersions[i].HigherDefines) do
  220.     begin
  221.       SetLength(cumulativeHigher, Length(cumulativeHigher) + 1);
  222.       cumulativeHigher[High(cumulativeHigher)] := KnownVersions[i].HigherDefines[j];
  223.     end;
  224.  
  225.     L.Add(Format('  {$IFDEF VER%d}      // %s', [KnownVersions[i].VerNum, KnownVersions[i].Comment]));
  226.     for d in KnownVersions[i].OwnDefines do
  227.       L.Add(Format('    {$DEFINE %s}', [d]));
  228.     for d in cumulativeHigher do
  229.       L.Add(Format('    {$DEFINE %s}', [d]));
  230.     L.Add('  {$ENDIF}');
  231.     L.Add('');
  232.   end;
  233.  
  234.   L.Add('  {--- Warning settings for D7+ (was {$IF CompilerVersion >= 15}) ---------}');
  235.   L.Add('  {$IFDEF _D7orHigher}');
  236.   L.Add('    {$WARN UNIT_DEPRECATED OFF}');
  237.   L.Add('    {$WARN SYMBOL_PLATFORM OFF}');
  238.   L.Add('    {$WARN UNSAFE_TYPE OFF}');
  239.   L.Add('    {$WARN UNSAFE_CAST OFF}');
  240.   L.Add('    {$WARN UNSAFE_CODE OFF}');
  241.   L.Add('  {$ENDIF}');
  242.   L.Add('');
  243.   L.Add('  {--- Delphi 2005+ (D8): inline off (was {$IF CompilerVersion >= 17}) ----}');
  244.   L.Add('  {$IFDEF _D2005orHigher}');
  245.   L.Add('    {$INLINE OFF}');
  246.   L.Add('  {$ENDIF}');
  247.   L.Add('');
  248.   L.Add('  {--- Stripping relocations, D2006+ (was {$IF CompilerVersion >= 18}) ----}');
  249.   L.Add('  {$IFDEF _D2006orHigher}');
  250.   L.Add('    {$IFNDEF NO_STRIP_RELOC}');
  251.   L.Add('      {$SetPEFlags 1}');
  252.   L.Add('    {$ENDIF}');
  253.   L.Add('  {$ENDIF}');
  254.   L.Add('');
  255.   L.Add('  {--- Platform specific, XE2+ WIN64 (was {$IF CompilerVersion >= 23}) ----}');
  256.   L.Add('  {$IFDEF _DXE2orHigher}');
  257.   L.Add('    {$IFDEF WIN64}');
  258.   L.Add('      {$DEFINE PAS_VERSION}');
  259.   L.Add('      {$DEFINE PAS_ONLY}');
  260.   L.Add('      {.$DEFINE UNICODE_CTRLS}');
  261.   L.Add('      {$DEFINE STREAM_LARGE64}');
  262.   L.Add('      {$DEFINE TMSG_WINDOWS}');
  263.   L.Add('    {$ENDIF}');
  264.   L.Add('  {$ENDIF}');
  265.   L.Add('');
  266.   L.Add('{$ENDIF} // CONDITIONALEXPRESSIONS');
  267.   L.Add('');
  268.   L.Add('{--- Free Pascal (2.6+) -----------------------------------------------------}');
  269.   L.Add('{$IFDEF FPC}');
  270.   L.Add('  {$MODE DELPHI}');
  271.   L.Add('  {$DEFINE PAS_ONLY}');
  272.   L.Add('  {$DEFINE USE_OLD_FLAGS} // size of set type in fpc is 4 bytes');
  273.   L.Add('');
  274.   L.Add('  // TODO: extend per FPC version, same as the Delphi cascade above');
  275.   L.Add('  {$DEFINE _D3orHigher}');
  276.   L.Add('  {$DEFINE _D4orHigher}');
  277.   L.Add('  {$DEFINE _D5orHigher}');
  278.   L.Add('  {$DEFINE _D6orHigher}');
  279.   L.Add('  {$DEFINE _D7}');
  280.   L.Add('  {$DEFINE _D7orHigher}');
  281.   L.Add('');
  282.   L.Add('  {$UNDEF ASM_VERSION} // FPC typically uses Pascal only');
  283.   L.Add('  {$DEFINE PAS_VERSION}');
  284.   L.Add('{$ENDIF FPC}');
  285.   L.Add('');
  286.   L.Add('{--- KOL specific ----------------------------------------------------------}');
  287.   L.Add('{$IFNDEF _NOT_KOLCtrlWrapper_}');
  288.   L.Add('  {$DEFINE _KOLCtrlWrapper_}');
  289.   L.Add('{$ENDIF}');
  290.   L.Add('');
  291.   L.Add('{---- from delphidef.inc ---------------------------------------------------}');
  292.   L.Add('{$DEFINE ASM_VERSION} // Comment to produce Pascal code (or add PAS_VERSION)');
  293.   L.Add('{$IFDEF ASM_VERSION}');
  294.   L.Add('  {$IFDEF PAS_VERSION}');
  295.   L.Add('    {$UNDEF ASM_VERSION}');
  296.   L.Add('  {$ENDIF}');
  297.   L.Add('{$ENDIF}');
  298.   L.Add('');
  299.   L.Add('{$IFNDEF _D6orHigher}');
  300.   L.Add('  {$DEFINE PARANOIA}');
  301.   L.Add('{$ENDIF}');
  302.   L.Add('');
  303.   L.Add('{$IFNDEF USE_OLD_FLAGS}');
  304.   L.Add('  {$DEFINE USE_FLAGS}');
  305.   L.Add('{$ELSE}');
  306.   L.Add('  {$UNDEF USE_FLAGS}');
  307.   L.Add('{$ENDIF}');
  308.   L.Add('');
  309.   L.Add('{$IFnDEF EVENTS_STATIC}');
  310.   L.Add('  {$DEFINE EVENTS_DYNAMIC}');
  311.   L.Add('{$ENDIF}');
  312.   L.Add('');
  313.   L.Add('{$IFnDEF CMDACTIONS_RECORD}');
  314.   L.Add('  {$DEFINE COMMANDACTIONS_OBJ}');
  315.   L.Add('  {$DEFINE PACK_COMMANDACTIONS}');
  316.   L.Add('  {$IFDEF NOT_PACK_COMMANDACTIONS}');
  317.   L.Add('    {$UNDEF PACK_COMMANDACTIONS}');
  318.   L.Add('  {$ENDIF}');
  319.   L.Add('{$ENDIF}');
  320.   L.Add('');
  321.   L.Add('{$DEFINE KOL3XX}');
  322.  
  323.   Result := L;
  324. end;
  325.  
  326. procedure PrintUsage;
  327. begin
  328.   Writeln('KolDefGen - regenerate koldef.inc with one new Delphi version added.');
  329.   Writeln;
  330.   Writeln('Usage:');
  331.   Writeln('  koldefgen <vernum> [shortname] [comment] [outputfile]');
  332.   Writeln;
  333.   Writeln('Example:');
  334.   Writeln('  koldefgen 370 _D13 "Delphi 13"');
  335.   Writeln;
  336.   Writeln('Currently known versions:');
  337. end;
  338.  
  339. var
  340.   VerNum: Integer;
  341.   ShortName, Comment, OutputFile: string;
  342.   Lines: TStringList;
  343.   i: Integer;
  344. begin
  345.   InitKnownVersions;
  346.  
  347.   if (ParamCount < 1) or not TryStrToInt(ParamStr(1), VerNum) then
  348.   begin
  349.     PrintUsage;
  350.     for i := 0 to High(KnownVersions) do
  351.       Writeln(Format('  VER%-4d  %s', [KnownVersions[i].VerNum, KnownVersions[i].Comment]));
  352.     Halt(1);
  353.   end;
  354.  
  355.   if ParamCount >= 2 then
  356.     ShortName := ParamStr(2)
  357.   else
  358.     ShortName := Format('_DVER%d', [VerNum]);
  359.  
  360.   if ParamCount >= 3 then
  361.     Comment := ParamStr(3)
  362.   else
  363.     Comment := Format('Delphi (VER%d)', [VerNum]);
  364.  
  365.   if ParamCount >= 4 then
  366.     OutputFile := ParamStr(4)
  367.   else
  368.     OutputFile := 'koldef.inc';
  369.  
  370.   try
  371.     AppendVersion(VerNum, ShortName, Comment);
  372.     Lines := BuildFile;
  373.     try
  374.       Lines.SaveToFile(OutputFile);
  375.       Writeln(Format('Wrote %s (added VER%d as %s / "%s")', [OutputFile, VerNum, ShortName, Comment]));
  376.     finally
  377.       Lines.Free;
  378.     end;
  379.   except
  380.     on E: Exception do
  381.     begin
  382.       Writeln('Error: ', E.Message);
  383.       Halt(1);
  384.     end;
  385.   end;
  386. end.
Write once, add newer versions later.... Helped by Claude, based on my specs.
In current design, KOL is not intended to use newer compiler syntax in its design, to the contrary: KOL uses old school objects, so there is no need to adapt the KOL code itself for versioning.

BTW: this is exactly the kind of small utility that saves you a lot of time if A.I. helps you to write well specified, but tedious code. Well done Claude! Saves me hours and this one took minutes.
« Last Edit: July 25, 2026, 09:43:42 am by Thaddy »
Any "programmer" that knows only one programming language is not a programmer

Thaddy

  • Hero Member
  • *****
  • Posts: 19625
  • Glad to be alive.
Re: KOL4 Beta available.
« Reply #12 on: July 25, 2026, 10:02:44 am »
@CM630
Added lpi. All compilers I have work now. (many!)
Any "programmer" that knows only one programming language is not a programmer

 

TinyPortal © 2005-2018