4

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 メソッドを使用してこれらの文字を置き換えることはできません。

ありがとう

4

1 に答える 1

3

取得した文字列は、印刷できない文字を含む文字列の有効な表記です。StringChangeExただし、文字列リストまたは関数を操作するときに char が失われることを心配する必要はありません。この短いスクリプトであなたを納得させましょう:

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

ただし、これらのデータをユーザーに提示したいという理由だけで質問が提起されたと思います。印刷できない文字では難しい場合があります。すべての一例です。途中に null ターミネータを含む文字列があり、そのような文字列をメッセージ ボックスなどでユーザーに表示したい場合、ターミネータの前にある文字列の部分のみが表示されます。しかし、それはあなたが影響を与えることができるものではありません。これは、背後にある Windows API 関数呼び出しが文字列を処理する方法です。

[Code]
procedure InitializeWizard;
var
  S: string;
begin
  S := 'Hello'#0' world!';
  MsgBox(S, mbInformation, MB_OK);
end;

ご覧のとおり、上記のケースでは、ヌル ターミネータ文字を印刷可能な文字 (スペースなど) に置き換える必要があります。

于 2014-02-28T12:06:08.773 に答える