Inno Setup:如何从CDATA创建TStringList

4
我有一个在CDATA元素中的列表。如何从CDATA获取元素并将其添加到TStringList中?
如果我获取CDATA字符串,它会返回:
'字符串'#10#9#9#9'字符串'#10#9#9#9'字符串'#10#9#9#9'字符串'...
然而字符#10#9#9#9不是字符串;我无法使用StringChangeEx方法替换这些字符。
谢谢

这是SOLVE。我使用StringChangeEx(),但我替换的是“#10”,而不是字符串。非常抱歉,感谢您的时间。 - MarkOccam
1个回答

3
您所得到的字符串是包含不可打印字符的有效表示。但是,在使用字符串列表或StringChangeEx函数时,您不需要担心会丢失任何字符。请看以下简短的脚本,让我来说服您:
[Code]
const
  PrintableString = 'string-string-string-string';
  NonPrintableString = 'string'#10#9#9#9'string'#10#9#9#9'string'#10#9#9#9'string';

procedure InitializeWizard;
var
  S: string;
  StringList: TstringList;
begin
  StringList := TstringList.Create;
  try
    StringList.Add(NonPrintableString);
    S := StringList[0];

    if S = NonPrintableString then
      MsgBox('String list didn''t lose non printable chars!', mbInformation, MB_OK);

    StringChangeEx(S, #10#9#9#9, '-', True);

    if S = PrintableString then
      MsgBox('String has been modified as expected!', mbInformation, MB_OK);
  finally
    StringList.Free;
  end;
end;

然而,我认为你之所以提出这个问题,是因为你想向用户展示这些数据,但是非可打印字符可能会让这变得有时候困难。举一个例子,如果你有一个包含空终止符的字符串,并且你想将这个字符串显示给用户,例如在消息框中,你只会看到这个终止符之前的部分。但是,这不是你能够控制的。这是由于Windows API函数调用对待字符串的方式决定的。
[Code]
procedure InitializeWizard;
var
  S: string;
begin
  S := 'Hello'#0' world!';
  MsgBox(S, mbInformation, MB_OK);
end;

正如您所看到的,对于上述情况,需要用可打印字符(例如空格)替换空终止符字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接