-3

我是 Delphi 的新手,并尝试Setup.e32使用带有 Delphi 10.1 Berlin 的 Inno Setup 的源代码来编译 Inno Setup 的文件。

但问题是当我尝试编译时,我不断收到错误[dcc32 Error] uPSUtils.pas(944): E2064 Left side cannot be assigned to.

我不知道如何解决这个问题,并且还阅读了本网站中询问该错误但甚至无法确定此代码有什么问题的问题。

代码的部分:

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;

这些代码有什么问题?

在我创建compilesettings.bat并单击compile.bat以编译非 Unicode Inno 安装程序(现在我安装了 Delphi 7.............)之后,这就是发生的事情。

这是按照指示后发生的............

4

2 回答 2

3

这段代码是为 Delphi 的预 Unicode 版本编写的,其中Char8 位的别名AnsiChar。演员表Byte反映了这一点。由于 Delphi 2009Char别名为 16 位WideChar

假设您正在编译正确的代码(您不是 - 见下文),解决方案是使用预期的编译器编译此代码。要确定它是什么,请阅读文档:https ://github.com/jrsoftware/issrc/blob/master/README.md 。我对此的解读是,您应该能够使用 Delphi 7 或 Delphi 2007 编译 Inno 的非 Unicode 版本。

当然,编译 Unicode 版本可能对您来说更容易。同样,自述文件中非常清楚地列出了这样做的说明。


从您没有编译 PascalScript 源的预期版本的注释中可以看出。你说你下载了一些同名的文件。不要那样做。使用从 Inno 存储库链接的源代码。使用那里推荐的编译器。因为你有 Delphi 10.1 Berlin 编译 Unicode Inno。

看起来你已经陷入了混乱的源文件中。如果我是你,我会从 Inno 存储库的干净下载重新开始。

  1. 删除现有的混杂文件。
  2. 从 Inno 存储库中获取最新的源代码。
  3. 按照自述文件中的说明编译 Inno 的 Unicode 版本。
于 2016-07-11T03:54:35.040 回答
2

自述文件特别指出 Inno 有 Unicode 版本:

  • 安装 Borland Delphi

    Unicode Inno 设置

    我们在 Delphi 2009 下使用 Update 3 编译所有 Inno Setup 的项目

    较新的 Delphi 版本也应该可以工作,但会导致文件大得多。

    要在 Windows 8.1 下使用 Delphi 2009 IDE,您需要以下两点才能使其正常工作:

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

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

    ...

  • 建造

    要构建所有文件,请运行 build.bat 并按照说明进行操作。

    仅编译 Inno Setup 运行compile-unicode.batUnicode Inno Setup或 compile.bat 运行 Non Unicode Inno Setup 并按照说明进行操作。

    ...

使用 Delphi 2009 或更高版本(包括 10.1 Berlin)时,请确保您正在编译 Inno 的Unicode版本,而不是Ansi版本。

话虽如此,麻烦的代码行可以重写以与 Unicode 版本的 Delphi 兼容:

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);

但是,如果您开始使用正确的支持 Unicode 的代码版本,则不需要这样做。

于 2016-07-11T04:57:25.573 回答