Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   F9 misslingt (https://www.delphipraxis.net/208250-f9-misslingt.html)

Delbor 3. Jul 2021 20:25

Delphi-Version: 10.4 Sydney

F9 misslingt
 
Hi zusammen

Ich hab hier ein älteres Projekt, das nicht mehr startet. Die Fehlermeldung:
Zitat:

[dcc32 Fehler] SynCommons.pas(67232): E2029 Ausdruck erwartet, aber 'END' gefunden
Das Codeschnipsel:
Delphi-Quellcode:
                      function GetDelphiCompilerVersion: RawUTF8;
                      begin
                        result :=
{$IFDEF FPC}
                          'Free Pascal'
{$IFDEF VER2_6_4} + ' 2.6.4'{$ENDIF}
{$IFDEF VER3_0_0} + ' 3.0.0'{$ENDIF}
{$IFDEF VER3_0_1} + ' 3.0.1'{$ENDIF}
{$IFDEF VER3_0_2} + ' 3.0.2'{$ENDIF}
{$IFDEF VER3_1_1} + ' 3.1.1'{$ENDIF}
{$IFDEF FPC_HAS_MANAGEMENT_OPERATORS} + ' MOP'{$ENDIF}
{$ELSE}
{$IFDEF VER130} 'Delphi 5'{$ENDIF}
{$IFDEF CONDITIONALEXPRESSIONS}  // Delphi 6 or newer
{$IF    defined(KYLIX3)}'Kylix 3'
{$ELSEIF defined(VER140)}'Delphi 6'
...
...
{$ELSEIF defined(VER330)}'Delphi 10.3 Carnival'
{$IFEND}
{$ENDIF CONDITIONALEXPRESSIONS}
{$ENDIF}
{$IFDEF CPU64}
                          + ' 64 bit'
{$ENDIF}
                      end;
Doppelklick auf die Fehlermeldung setzt den Cursor vor das End;

Die ersten Zeilen der Unit:
Delphi-Quellcode:
/// common functions used by most Synopse projects
/// - this unit is a part of the freeware Synopse mORMot framework,
/// licensed under a MPL/GPL/LGPL tri-license; version 1.18
unit SynCommons;



{$I Synopse.inc} /// define HASINLINE USETYPEINFO CPU32 CPU64 OWNNORMTOUPPER

interface
Ich habe die Unit nie angefasst.

Gruss
Delbor

DeddyH 3. Jul 2021 20:52

AW: F9 misslingt
 
Ich bin jetzt nicht durch die ganzen verschachtelten IFDEFs durchgegangen, aber da fehlt wohl Sydney noch in der Liste, deshalb wird Result nichts zugewiesen.

mytbo 3. Jul 2021 21:43

AW: F9 misslingt
 
Zitat:

Zitat von Delbor (Beitrag 1491799)
Ich hab hier ein älteres Projekt, das nicht mehr startet. Die Fehlermeldung:
Zitat:

[dcc32 Fehler] SynCommons.pas(67232): E2029 Ausdruck erwartet, aber 'END' gefunden

Ich würde mir die aktuelle Version von mORMot1 laden. Arnaud achtet sehr auf Kompatibilität und in neueren Versionen ist die Unit SynCommons nicht mehr ganz so groß. Da mORMot nicht installiert werden muss, kann man eine neue Version mal problemlos in 2 Minuten testen.

Bis bald...
Thomas

jaenicke 3. Jul 2021 21:53

AW: F9 misslingt
 
Leider machen viele Entwickler den gleichen Fehler:
Es wird nur auf bekannte Delphiversionen geprüft, aber neue unbekannte Versionen werden vollkommen vergessen.

Sinnvoll ist bei solchen Versionsprüfungen immer, dass man davon ausgeht, dass es sich um eine neuere Version handelt, wenn die bereits bekannten Direktiven nicht vorhanden sind. In diesem Fall könnte man z.B. 'Neuer als Delphi 10.3" schreiben.
Meistens geht es aber um die Prüfung, ob man etwas auf die eine oder andere Weise machen muss, weil sich bei neueren Versionen etwas geändert hat bzw. erst dann verfügbar ist. Auch dann wäre es sinnvoll von einer neueren Version auszugehen und alles so zu machen wie für die höchste bekannte Version.

Ein Beispiel dafür ist meine Definition hier:
https://github.com/jaenicke/MTCL/blo...erVersions.inc
Diese Komponenten funktionieren mit 10.4 ganz normal weiter, weil zwar zu dem Zeitpunkt nur 10.3 Rio bekannt war, es aber als Delphi10RioUp erkannt wird...

Amateurprofi 4. Jul 2021 00:08

AW: F9 misslingt
 
Ich bin nicht so sehr vertraut mit all diesen {$If...}, habe aber mal versucht mich da durchzubeißen.

Wenn keines der {SIF..} zutrifft, dann steht da m.E.nur noch
Delphi-Quellcode:
begin
   result :=
end;
und das führt dann zu dem Fehler.
Ich habe mal folgende Zeilen hinzugefügt

Hinter {$ELSEIF defined(VER330)}'Delphi 10.3 Carnival'
Delphi-Quellcode:
{$ELSE} 'Unbekannte Version'
.
vor {$ENDIF CONDITIONALEXPRESSIONS}
Delphi-Quellcode:
{$ELSE} 'Keine CONDITIONALEXPRESSIONS'
.

Das sieht dann so aus (und funktioniert bei mir)
Den Typ des Results von GetDelphiCompilerVersion habe ich auf String geändert, weil mein Delphi RawUTF8 nicht mag.

Delphi-Quellcode:
                      function GetDelphiCompilerVersion:String;
                      begin
                        result :=
{$IFDEF FPC}
                          'Free Pascal'
   {$IFDEF VER2_6_4} + ' 2.6.4'{$ENDIF}
   {$IFDEF VER3_0_0} + ' 3.0.0'{$ENDIF}
   {$IFDEF VER3_0_1} + ' 3.0.1'{$ENDIF}
   {$IFDEF VER3_0_2} + ' 3.0.2'{$ENDIF}
   {$IFDEF VER3_1_1} + ' 3.1.1'{$ENDIF}
   {$IFDEF FPC_HAS_MANAGEMENT_OPERATORS} + ' MOP'{$ENDIF}

{$ELSE}

   {$IFDEF VER130} 'Delphi 5'{$ENDIF}
   {$IFDEF CONDITIONALEXPRESSIONS}  // Delphi 6 or newer
      {$IF    defined(KYLIX3)}'Kylix 3'
      {$ELSEIF defined(VER140)}'Delphi 6'
      {$ELSEIF defined(VER330)}'Delphi 10.3 Carnival'

      {$ELSE} 'Unbekannte Version' // Hinzugefügt

      {$IFEND}

   {$ELSE} 'Keine CONDITIONALEXPRESSIONS' // Hinzugefügt

   {$ENDIF CONDITIONALEXPRESSIONS}


{$ENDIF}

{$IFDEF CPU64}
                          + ' 64 bit'
{$ENDIF}
                      end;

Delbor 4. Jul 2021 06:54

AW: F9 misslingt
 
Hi DeddyH

Guten Morgen! Vielen Dank für deine prompte Antwort!

Gruss
Delbor

Delbor 4. Jul 2021 18:56

AW: F9 misslingt
 
Hi zusammen

Meine derzeitige Lösung:
Delphi-Quellcode:
{$ELSEIF defined(VER320)}'Delphi 10.2 Tokyo'
{$ELSEIF defined(VER330)}'Delphi 10.3 Carnival'
{$ELSEIF defined(VER340)}'Delphi 10.4 Sydney'
{$IFEND}
{$ENDIF CONDITIONALEXPRESSIONS}
{$ENDIF}
{$IFDEF CPU64}
                          + ' 64 bit'
{$ENDIF}
                      end;
Erstmal hat es mich doch etwas verblüfft, wie einfach das ging - kein suchen nach irgendwelchen Versionsnummern und verwenden des Originalnamens. Meines Wissens war Carnival der Entwicklungsname für Rio. Denjenigen für Sydney hätte ich erst suchen müssen.

[QUOTE=mytbo;1491801]
Zitat:

Zitat von Delbor (Beitrag 1491799)
Ich würde mir die aktuelle Version von mORMot1 laden. Arnaud achtet sehr auf Kompatibilität und in neueren Versionen ist die Unit SynCommons nicht mehr ganz so groß. Da mORMot nicht installiert werden muss, kann man eine neue Version mal problemlos in 2 Minuten testen.
Bis bald...
Thomas

Zumindest im Moment ist die Weiterverwendung, bzw. Erneuerung des aktuellen Projektes kein Thema. Nachdem ich damit an Grenzen gestossen war, hab ich die weitere Arbeit daran eingestellt. Ich wollte mir das Projekt aber nochmal debuggen, da es die einzelnen Seiten eines PDFs per Zeiger verwaltet und dabei alle Seiten 'schliesst', die ausserhalb des Anzeigebereichs landen.

Gruss
Delbor

Amateurprofi 5. Jul 2021 01:49

AW: F9 misslingt
 
Und wenn dann eine neue Version erscheint, hast du wieder das gleiche Problem.
Wie jaenicke in #4 schrieb
Zitat:

Leider machen viele Entwickler den gleichen Fehler:
Es wird nur auf bekannte Delphiversionen geprüft, aber neue unbekannte Versionen werden vollkommen vergessen.
Vielleicht entschließt du dich dann ja doch, auch diesen Fall abzufangen.
Ein Beispiel habe ich in #5 gezeigt.

sakura 5. Jul 2021 05:16

AW: F9 misslingt
 
Zitat:

Zitat von jaenicke (Beitrag 1491802)
Leider machen viele Entwickler den gleichen Fehler:
Es wird nur auf bekannte Delphiversionen geprüft, aber neue unbekannte Versionen werden vollkommen vergessen.

In diesem Fall ist es aber definitiv kein Fehler, sondern eine bewusste Entscheidung von Arnaud. Einer der Gründe ist, dass er die Nutzer dazu anhalten will, sich regelmäßig Updates zu holen, und diese gibt es i.A. mehrfach pro Woche ;-)

...:cat:...

himitsu 5. Jul 2021 09:37

AW: F9 misslingt
 
* garnichts zu machen und den Nutzer grob fahrlässig in einen "nichtsagenden" Fehler rennen zu lassen
* oder einfach nur "unbemerkt" ein 'unbekannt' zurückzugeben
* oder stattdessen den Compiler gezielt mit einem
Delphi-Quellcode:
{$Message Error 'zu alt, hol dir was Neues'}
bzw.
Delphi-Quellcode:
{$Message Fatal ...
abzuwürgen
ist ein kleiner Unterschied

mytbo 5. Jul 2021 10:58

AW: F9 misslingt
 
Zitat:

Zitat von himitsu (Beitrag 1491870)
* garnichts zu machen und den Nutzer grob fahrlässig in einen "nichtsagenden" Fehler rennen zu lassen
* oder einfach nur "unbemerkt" ein 'unbekannt' zurückzugeben
* oder stattdessen den Compiler gezielt mit einem
Delphi-Quellcode:
{$Message Error 'zu alt, hol dir was Neues'}
bzw.
Delphi-Quellcode:
{$Message Fatal ...
abzuwürgen
ist ein kleiner Unterschied

Man kann es auch anders sehen. In der Dokumentation ist ganz klar beschrieben, welche Versionen von FPC und Delphi unterstützt werden. Damit ist es in jedem Download zu finden. Wenn ich eine Version, die z.B. für Delphi 7 - 10.2 freigegeben ist, in Delphi 10.4 einsetzen will, trage ich dafür als Entwickler schon selbst die Verantwortung. Zumal Arnaud die Kompatibilität gewährleistet und ich jeder Zeit eine aktuelle Version kostenfrei laden kann. Ich würde in einem solchen Fall eher bei mir selbst den Fehler suchen. Anregungen sind im mORMot Forum gern gesehen und Arnaud hat dafür immer ein offenes Ohr. Würde mich freuen dort eure Vorschläge zu lesen.

Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 Uhr.

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