2016-07-11 24 views
-3

Ich bin neu in Delphi und habe versucht, Inno Setups Setup.e32 Datei mit Inno Setups Quellcode mit Delphi 10.1 Berlin zu kompilieren.Kompilierfehler: [dcc32 Error] E2064 Linke Seite kann nicht zugewiesen werden

Aber das Problem ist, wenn ich zu kompilieren versuchen, ich immer wieder Fehler beim [dcc32 Error] uPSUtils.pas(944): E2064 Left side cannot be assigned to.

Ich weiß nicht, wie dieses Problem zu beheben und auch Fragen auf dieser Seite lesen, die zu diesem Fehler gefragt, aber auch kann nicht feststellen, was in diesem Code falsch ist.

Die Teile des Kodex:

function FastUpperCase(const s: String): string; 
{Fast uppercase} 
var 
    I: Integer; 
    C: Char; 
begin 
    Result := S; 
    I := Length(Result); 
    while I > 0 do 
    begin 
    C := Result[I]; 
    if c in [#97..#122] then 
     Dec (Byte(Result[I]), 32); <<<Error E2064 HERE>>> 
    Dec(I); 
    end; 
end; 

function FastLowerCase(const s: String): string; 
{Fast lowercase} 
var 
    I: Integer; 
    C: Char; 
begin 
    Result := S; 
    I := Length(Result); 
    while I > 0 do 
    begin 
    C := Result[I]; 
    if C in [#65..#90] then 
     Inc(Byte(Result[I]), 32); <<<ERROR E2064 HERE>>> 
    Dec(I); 
    end; 
end; 

function ParseToken(var CurrTokenPos, CurrTokenLen: Cardinal; var CurrTokenId: TPSPasToken): TPSParserErrorKind; 
    {Parse the token} 
    var 
    ct, ci: Cardinal; 
    hs: Boolean; 
    p: PChar; 
    begin 
    ParseToken := iNoError; 
    ct := CurrTokenPos; 
    case FText[ct] of 
     #0: 
     begin 
      CurrTokenId := CSTI_EOF; 
      CurrTokenLen := 0; 
     end; 
     'A'..'Z', 'a'..'z', '_': 
     begin 
      ci := ct + 1; 
      while (FText[ci] in ['_', '0'..'9', 'a'..'z', 'A'..'Z']) do begin 
      Inc(ci); 
      end; 
       CurrTokenLen := ci - ct; 

      FLastUpToken := GetToken(CurrTokenPos, CurrtokenLen); 
      p := pchar(FLastUpToken); 
      while p^<>#0 do 
      begin 
      if p^ in [#97..#122] then 
       Dec ((Byte(p^)), 32); <<<ERROR E2064 HERE>>> 
      inc(p); 
      end; 
      if not CheckReserved(FLastUpToken, CurrTokenId) then 
      begin 
      CurrTokenId := CSTI_Identifier; 
      end; 
     end; 

Was in diesen Codes falsch ist?

Nachdem ich compilesettings.bat erstellt und auf compile.bat geklickt habe, um nicht Unicode Inno Setup zu kompilieren (wie ich jetzt Delphi 7 installiert .............), ist das passiert.

This is what happened after following instructions...........

Antwort

3

Dieser Code wird für eine Pre-Unicode-Version von Delphi geschrieben, in dem Char ein Alias ​​für die AnsiChar 8 Bit ist. Die Besetzung zu Byte spiegelt das wider. Seit Delphi 2009 Char ist aliased zu den 16 Bit WideChar.

Angenommen, Sie kompilieren den richtigen Code (Sie sind nicht - siehe unten), die Lösung besteht darin, diesen Code mit dem vorgesehenen Compiler zu kompilieren. Um festzustellen, was das ist, lesen Sie die Dokumentation: https://github.com/jrsoftware/issrc/blob/master/README.md. Meine Lektüre davon ist, dass Sie in der Lage sein sollten, die Nicht-Unicode-Version von Inno mit Delphi 7 oder Delphi 2007 zu kompilieren.

Natürlich könnte es einfacher für Sie sein, die Unicode-Version zu kompilieren. Auch hier sind die Anweisungen in der Readme sehr übersichtlich.


Es ergibt sich aus Kommentaren, dass Sie die beabsichtigten Versionen der PascalScript-Quelle nicht kompilieren. Sie sagen, dass Sie einige Dateien mit den gleichen Namen heruntergeladen haben. Tu das nicht. Verwenden Sie die aus dem Inno-Repository verknüpfte Quelle. Verwenden Sie die dort empfohlenen Compiler. Da Sie Delphi 10.1 Berlin kompilieren Unicode Inno.

Es sieht so aus, als ob Sie mit einer Verwechslung von Quelldateien ziemlich durcheinander geraten sind. Wenn ich Sie wäre, würde ich wieder mit einem sauberen Download aus dem Inno-Repository starten.

  1. Entfernen Sie Ihren bestehenden Mischmasch von Dateien.
  2. Holen Sie sich die neueste Quelle aus dem Inno-Repository.
  3. Kompilieren Sie die Unicode-Version von Inno gemäß den Anweisungen aus der Readme-Datei.
+0

Vielen Dank ......... Nachdem ich hart gesucht habe, lade ich diese Datei herunter: 'CodeGearRADStudio2007_Dec2007.iso'.Kann ich das mit diesem RAD Studio 2007 kompilieren? Ich kann nicht einmal bestimmen, was diese Datei ist, da Delphi 2007 jetzt das Ende ihres Lebens ist ... Ich lade nur herunter, um nachzusehen. :( – GTAVLover

+0

Sieht für mich wie ältere Delphi, desto besser für einige dieser Module. –

+0

Oder sollte ich dies stoppen und dies herunterladen? Das sieht aus wie Delphi 2009 Update 3. LINK: http: //altd.embarcadero.com/download/Delphi_C++ Builder2009/Delphi_C++ Builder2009_ISO_June2009.iso Ich denke, das muss funktionieren, da JR Software dies als den beabsichtigten Compiler sagt. – GTAVLover

2

Die Readme heißt es ausdrücklich, dass es eine Unicode-Version von Inno ist:

  • Installieren Sie Borland Delphi

    Unicode Inno Setup:

    Wir erstellen alle Inno Setups Projekte unter Delphi 2009 mit Update 3.

    Neuere Delphi-Versionen sollten auch funktionieren aber wird zu erheblich größeren Dateien führen.

    mit der Delphi 2009 IDE unter Windows 8.1 Sie diese beiden Dinge müssen arbeiten, um es gut funktioniert:

    http://www.jrsoftware.org/files/Delphi_2007_2009_WOW64_Debugger_Fix.exe (md5sum: 545fc506c0614cf7a3339a7acb5217dc)

    http://www.jrsoftware.org/files/dzEditorLineEndsFix.exe (md5sum: c9598cf14452dd08987c5aec23d04f7d)

    . ..

  • Gebäude

    Um alle Dateien zu erstellen, führen Sie build.bat aus und folgen Sie den Anweisungen.

    Um nur Inno Setup zu kompilieren, führen Sie compile-unicode.bat für Unicode Inno Setup oder compile.bat für nicht Unicode Inno Setup und folgen Sie den Anweisungen.

    ...

Bei der Verwendung von Delphi 2009 oder höher (einschließlich 10.1 Berlin), stellen Sie sicher, dass Sie eine Unicode Version von Inno kompilieren, kein Ansi Version.

Davon abgesehen, können die störenden Zeilen Code neu geschrieben werden mit Unicode-Versionen von Delphi kompatibel zu sein:

if c in [#97..#122] then 
    Result[I] := Char(Ord(c) - 32); 
    // or: Dec(c, 32); Result[I] := c; 

if C in [#65..#90] then 
    Result[I] := Char(Ord(c) + 32); 
    // or: Inc(c, 32); Result[I] := c; 

if p^ in [#97..#122] then 
    Dec(p^, 32); 

Dies sollte jedoch nicht notwendig sein, wenn Sie th verwenden Die richtige Unicode-fähige Version des Codes für den Anfang.

+0

Danke .......... Aber die Datei 'uPSUtils.pas, uPSDebugger.pas, uPSRuntime.pas', die ich von Github heruntergeladen habe, ist nicht mit dem Quellcode von Inno Setup gekommen. Als ich versucht habe' Setup zu kompilieren .dproj' im Inno Setup Quellcode, Delphi sagt Formular 'uPSUtils, uPSDebugger, uPSRuntime' nicht gefunden ........ Also habe ich diese drei Formulare zusätzlich aus dem PascalScript Quellcode heruntergeladen und zu 'Setup.dproj' hinzugefügt. Ist das das Problem?Ich wusste nicht, ob sie Unicode sind oder nicht. – GTAVLover

+0

@remy Ihre vorgeschlagenen Neuschreibvorgänge beheben den Compilerfehler, lassen diese Funktionen jedoch semantisch mit Nicht-ASCII-Daten unterbrochen. –

+0

Das innovative GitHub-Projekt ist mit dem Unicode-Port des Pascal-Skripts verlinkt, daher ist es wirklich ein wirklich schlechter Ratschlag, solche Änderungen zu empfehlen. –