Inno Setup从CDATA创建TStringList

时间:2014-02-28 11:26:27

标签: string inno-setup cdata tstringlist

我在CDATA元素中有一个列表。如何从CDATA获取元素并将其添加到TStringList?

如果我得到CDATA字符串,则返回:

'string'#10#9#9#9'string'#10#9#9#9'string'#10#9#9#9'string'...

然而字符#10#9#9#9不是字符串;我不能使用StringChangeEx方法来替换这些字符。

由于

1 个答案:

答案 0 :(得分:2)

您获得的字符串是包含不可打印字符的字符串的有效表示法。但是,在使用字符串列表或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;

正如您所看到的,对于上述情况,有必要用一些可打印的char替换null终止符char,例如空间。