何らかの理由で、この case スイッチはコンパイルされません
var
c: char;
begin
case c of
#32..#33, #35..pred('\'), succ('\')..#255, #256..#65535:
...
コンパイラは、「[DCC エラー] poparser.pas(206): E2030 Duplicate case label」と表示します
確認したところ、SizeOf(c) は 2、Low(c) は 0、High(c) は 65535 です。つまり、範囲は問題ないはずです。pred('\') は 91 のようで、succ('\') は 93 のようですが、これも OK です。他のケースもコメントアウトしましたが、結果は同じです。では、ここで何が問題なのですか?
完全な手順は次のとおりです。
function String2PO (s:string):string;
// Converts a string to the syntax that is used in .po files
var
i: integer;
c: char;
escnext:boolean;
begin
Result := '';
escnext:=False;
for i := 1 to length(s) do begin
c := s[i];
case c of
#32..#33, #35..pred('\'),succ('\')..#255, #256..#65535:
begin
if escnext then Result:=Result+'\';
Result := Result + c;
escnext:=False;
end;
'\':begin
Result:=Result+'\\';
escnext:=False;
end;
#13:; // Do nothing
#10:begin
Result := Result + '\n';
escnext:=False;
end;
#34:begin
Result := Result + '\"';
escnext:=False;
end;
#0:begin
Result := Result + '\0';
escnext:=True;
end;
#9:begin
Result:=Result+'\t';
escnext:=False;
end;
else
Result := Result + '\x' + IntToHex(ord(c),2);
escnext:=True;
end;
end;
Result := '"' + Result + '"';
end;
行を次のように変更すると、
#32..#33, #35..pred('\'),succ('\')..#65535:
(..#255、#256..を削除すると、コンパイルされます:)
注:それはデルファイ2009です