我是Delphi的新手,并尝试使用Inno Setup的源代码和Delphi 10.1柏林编译Inno Setup的Setup.e32
文件。
但问题是当我尝试编译时,我不断收到错误[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 .............),这就是发生了。
答案 0 :(得分:3)
此代码是为Unicode前版本的Delphi编写的,其中Char
是8位AnsiChar
的别名。演员Byte
反映了这一点。由于Delphi 2009 Char
别名为16位WideChar
。
假设您正在编译正确的代码(您不是 - 见下文),解决方案是使用预期的编译器编译此代码。要确定这是什么,请阅读文档:https://github.com/jrsoftware/issrc/blob/master/README.md。我对此的解读是,您应该能够使用Delphi 7或Delphi 2007编译Inno的非Unicode版本。
当然,编译Unicode版本可能更容易。在自述文件中再次详细说明了这样做的说明。
从评论中可以看出,您没有编译PascalScript源的预期版本。你说你下载了一些名称相同的文件。不要这样做。使用从Inno存储库链接的源。使用那里推荐的编译器。既然你有Delphi 10.1柏林编译Unicode Inno。
看起来你因为源文件混乱而陷入困境。如果我是你,我会从Inno存储库中重新下载。
答案 1 :(得分:2)
自述文件明确指出有Inno的Unicode版本:
安装Borland Delphi
Unicode Inno设置:
我们使用Update 3 编译Delphi 2009下的所有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.bat
进行Unicode 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的代码版本,则不需要这样做。