Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   JCL und JVCL in 10.3 CommunityEdition installieren geht nicht (https://www.delphipraxis.net/198650-jcl-und-jvcl-10-3-communityedition-installieren-geht-nicht.html)

jaenicke 22. Nov 2018 08:21

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von Schokohase (Beitrag 1418744)
Eigentlich dürfte der nicht übernommen werden, denn du verwendest
Delphi-Quellcode:
{$ifend}
anstatt
Delphi-Quellcode:
{$ENDIF}
und das kann nicht jeder Compiler.

Sollte das nicht innerhalb des IFDEF für Delphi 2009 gehen? Ich habe keine alte Version zum Testen...

Uwe Raabe 22. Nov 2018 08:41

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von Schokohase (Beitrag 1418744)
denn du verwendest
Delphi-Quellcode:
{$ifend}
anstatt
Delphi-Quellcode:
{$ENDIF}
und das kann nicht jeder Compiler.

Sollte das nicht genau andersherum heißen? Delphi-Compiler vor XE4 verstehen kein $ENDIF als Abschluss für $IF, aber $IFEND verstehen alle (ab Delphi 6 natürlich, vorher gab es kein $IF).

jaenicke 22. Nov 2018 13:57

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
So war meine Erinnerung auch, aber mit alten Versionen habe ich schon länger nichts mehr gemacht, von daher möchte ich mich da nicht festlegen...
Kann das vielleicht jemand testen?

Schokohase 22. Nov 2018 14:32

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Da haben wir es - ja, irgendwas war da ...

http://docwiki.embarcadero.com/RADSt...o/en/Compiling
Zitat:

Require
Delphi-Quellcode:
$IF
to be terminated by
Delphi-Quellcode:
$IFEND
Enables you to use
Delphi-Quellcode:
$IFEND
(instead of the proper
Delphi-Quellcode:
$ENDIF
) to terminate a
Delphi-Quellcode:
$IF
clause. Without this option enabled, the compilers might emit E2029. See the Legacy IFEND (Delphi) compiler directive.

Default = False
http://docwiki.embarcadero.com/RADSt...IFEND_(Delphi)
Zitat:

Allows you to require the
Delphi-Quellcode:
$IFEND
directive in order to close the associated
Delphi-Quellcode:
$IF
statement in your code.

At the XE4 release, the Delphi compilers were changed to accept either
Delphi-Quellcode:
$IFEND
or
Delphi-Quellcode:
$ENDIF
to close
Delphi-Quellcode:
$IF
statements. Before XE4, only
Delphi-Quellcode:
$IFEND
could be used to close
Delphi-Quellcode:
$IF
statements. The
Delphi-Quellcode:
$LEGACYIFEND
directive allows you to restore the old behavior, which is useful if your code is emitting E2029 related to nested
Delphi-Quellcode:
$IF
and
Delphi-Quellcode:
$IFDEF
statements.

jaenicke 23. Nov 2018 20:18

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Die Änderungen sind jetzt übrigens gemerged, das normale JVCL Repository sollte nun fehlerfrei kompilieren, tut es hier zumindest überall.

Zitat:

Zitat von gammatester (Beitrag 1418743)
Da Du schon zum wiederholten Male dieses Thema ansprichst ohne Code zu zeigen, wäre ich an einer Implementation interessiert, die ohne $IF oder Conditional Expressions auskommt, sprich die alle Versionen von TP5 bis Delphi Rio und FPC331 (in allen Modi) unterstützt (selbst die allerneueste FPC Version 3.3.1 kennt zB kein Result im Default-Modus).

Ich arbeite nur mit Delphi, da ist es sehr einfach:
https://github.com/jaenicke/MTCL/blo...erVersions.inc
Ich habe einmal eine umfangreichere Variante erstellt, die kann ich allerdings nicht veröffentlichen. Vielleicht schreibe ich so etwas aber noch einmal privat und richtig sauber.

gammatester 23. Nov 2018 22:13

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1418989)
Ich arbeite nur mit Delphi, da ist es sehr einfach:
https://github.com/jaenicke/MTCL/blo...erVersions.inc

Danke für den Link. Aber neben Eindruck, dass das ziemlich verschachtelt ist, sehe ich auf den ersten Blick nicht wie es gegen unbekannte Versionen helfen kann (oder übersehe ich da was Offensichtliches?)

Nehmen wir an, ich habe die Includedatei in einem Archiv, das zu Zeiten von XE veröffentlicht wurde. Wenn jemand, das jetzt mit Rio übersetzt, ist Rio doch nicht bekannt, und auch nicht die speziellen nötigen Anpassungen (ich denke zB an Auslesen des DecimalSeparator).

Ich kann natürlich ein Rio-Version der INC veröffentlichen, aber das ist genau das, was ich ja auch so mache.

Meine INC ist nicht so sehr auf Versionen konzentriert sondern auf Features, wie zB sind Unit-Scopes vorhanden, sind Typecasts für Fließkommakonstanten erlaubt etc.

Uwe Raabe 23. Nov 2018 23:42

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von gammatester (Beitrag 1418994)
Nehmen wir an, ich habe die Includedatei in einem Archiv, das zu Zeiten von XE veröffentlicht wurde. Wenn jemand, das jetzt mit Rio übersetzt, ist Rio doch nicht bekannt, und auch nicht die speziellen nötigen Anpassungen (ich denke zB an Auslesen des DecimalSeparator).

Ich habe die besten Erfahrungen gemacht, wenn ich die bedingten Abschnitte auf die alten Versionen beziehe. Z.B. gibt es die function GetProductVersion in System.Sysutils.pas erst ab Delphi 10 Seattle. Damit der Code auch in älteren Versionen funktioniert, gibt es an geeigneter Stelle folgende Sequenz:
Delphi-Quellcode:
{$IF RTLVersion < 30.0 Seattle}
function GetProductVersion(const AFileName: string; var AMajor, AMinor, ABuild: Cardinal): Boolean;
var
  FileName: string;
  InfoSize, Wnd: DWORD;
  VerBuf: Pointer;
  FI: PVSFixedFileInfo;
  VerSize: DWORD;
begin
  Result := False;
  // GetFileVersionInfo modifies the filename parameter data while parsing.
  // Copy the string const into a local variable to create a writeable copy.
  FileName := AFileName;
  UniqueString(FileName);
  InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  if InfoSize <> 0 then
  begin
    GetMem(VerBuf, InfoSize);
    try
      if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
        if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
        begin
          AMajor := HiWord(FI.dwProductVersionMS);
          AMinor := LoWord(FI.dwProductVersionMS);
          ABuild := HiWord(FI.dwProductVersionLS);
          Result:= True;
        end;
    finally
      FreeMem(VerBuf);
    end;
  end;
end;
{$IFEND}
Ein anderes Beispiel aus PngComponents. Die Klasse TPngImage gibt es erst seit Delphi 2009 (vorher hieß es TPNGObject) und der Code läuft nur unter Delphi 7 und höher. Daher gibt es dort folgende Sequenz:
Delphi-Quellcode:
{$IF RTLVersion < 20.0 D2009 }
  {$IF RTLVersion < 15.0 D7 }
    PngComponents are only compatible with Delphi 7 and higher!
  {$IFEND}
type
  TPngImage = TPNGObject;
{$IFEND}
Hier noch ein paar Auszüge aus dem Project Magician:
Delphi-Quellcode:
function CompareNatural(const Key1, Key2: string): Integer;
{$IF RTLVersion < 27.0 XE6}
  function CheckCfg(const Key: string; out idx: Integer): Boolean;
  const
    cCfg = 'Cfg_';
  begin
    Result := StartsStr(cCfg, Key) and TryStrToInt(Copy(Key, 5), idx);
  end;

var
  idx1: Integer;
  idx2: Integer;
{$IFEND}
begin
{$IF RTLVersion < 27.0 XE6 }
  if CheckCfg(key1, idx1) and CheckCfg(key2, idx2) then begin
    Result := CompareValue(idx1, idx2);
  end
  else begin
    result := CompareText(key1, key2);
  end;
{$ELSE}
  Result := string.Compare(Key1, Key2, [coDigitAsNumbers, coIgnoreCase]);
{$IFEND}
end;
Delphi-Quellcode:
class function TCustomProjFile.GetKnownPlatforms: TArray<string>;
begin
  if FKnownPlatforms = nil then begin
    FKnownPlatforms := TArray<string>.Create(
      'Win32', 'Win64', 'OSX32', 'iOSSimulator', 'Android'
      {$IF RTLVersion < 29.0 XE8 }
      , 'iOSDevice'
      {$ELSE}
      , 'iOSDevice32', 'Linux64', 'iOSDevice64'
      {$ENDIF}
      );
  end;
  result := FKnownPlatforms;
end;
Delphi-Quellcode:
      if not moduleIsPackage and AConfig.ClearChildAppSettings then begin
        { only base platform configurations have app settings and must keep them }
        if Arg.Parent.Key = buildConfiguration.Key then Exit;

        Arg.Remove(sOutputExt);
        Arg.Remove(sIcon_MainIcon);
        Arg.Remove(sIcns_MainIcns);
        Arg.Remove(sManifest_File);
        {$IF RTLVersion >= 30.0 Seattle}
        Arg.Remove(sAppEnableRuntimeThemes);
        Arg.Remove(sAppEnableHighDPI);
        Arg.Remove(sAppEnableAdministrator);
        Arg.Remove(sCustom_Styles);
        {$ENDIF}
      end;

Alle diese Konstrukte benötigen nicht die tatsächlichen VERxxx Bedingungen und compilieren in der Regel ohne Änderungen auf einer neuen Delphi Version. Deswegen kommen die Projekte auch ohne sowas wie die JEDI.inc oder COMPILERS.inc oder wie sie alle heißen aus.

Wenn irgendwas mit einer neuen Version nicht compiliert, wird die aktuelle Version des betreffenden Codes in ein passendes $IF-Konstrukt eingepackt, das den neuen Compiler und alle zukünftigen ausschließt und der verbleibende Code wird für den neuen Compiler angepasst, gegebenenfalls im ELSE Teil. Damit habe ich wieder für die nächsten Jahre Ruhe.

jaenicke 24. Nov 2018 04:10

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Ja, das mache ich intern auch so. Dass man da die Delphiversionen einfach so dahinter schreiben kann ohne dass es die Funktionalität beeinträchtigt, wusste ich nicht. Ich habe die eigenen Konstanten auch aus Gründen der Lesbarkeit benutzt und zudem in einer anderen Version eben auch noch bestimmte Features als DEFINE angeboten um so darauf direkt prüfen zu können ohne jedesmal zu überlegen wo es das noch einmal gab.

Zitat:

Zitat von gammatester (Beitrag 1418994)
Zitat:

Zitat von jaenicke (Beitrag 1418989)
Ich arbeite nur mit Delphi, da ist es sehr einfach:
https://github.com/jaenicke/MTCL/blo...erVersions.inc

Danke für den Link. Aber neben Eindruck, dass das ziemlich verschachtelt ist, sehe ich auf den ersten Blick nicht wie es gegen unbekannte Versionen helfen kann (oder übersehe ich da was Offensichtliches?)

Jetzt bei 10.3 spuckt das Ding einfach aus Delphi10TokyoUp.

// EDIT:
Ich habe 10.3 mal auch direkt hinzugefügt.

Uwe Raabe 24. Nov 2018 09:29

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1419003)
Dass man da die Delphiversionen einfach so dahinter schreiben kann ohne dass es die Funktionalität beeinträchtigt, wusste ich nicht.

Das habe ich auch nur durch Zufall herausgefunden. Der Compiler hört einfach nach dem Erkennen einer Floatzahl auf und überliest den Rest bis zur schließenden Kommentarklammer. Das manuelle Einfügen des Klartextes ist in der Regel auch kein Problem, da man in dem Moment ja genau weiß, warum man das tut und welche Delphi-Version betroffen ist.

Alter Mann 24. Nov 2018 09:31

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
So habe alles artig herunter geladen und installiert.:wink:
Nach Abschluss kam allerdings die Warnung im Anhang.

Schokohase 24. Nov 2018 09:38

AW: JCL und JVCL in 10.3 CommunityEdition installieren geht nicht
 
Zitat:

Zitat von Alter Mann (Beitrag 1419009)
So habe alles artig herunter geladen und installiert.:wink:
Nach Abschluss kam allerdings die Warnung im Anhang.

Bei mir nicht ... (siehe mein Patch). Und ist doch auch mit ein paar Handgriffen erledigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz