TStringList名称 - 值对的特殊字符限制?

时间:2012-07-12 00:57:17

标签: delphi delphi-7 tstringlist

我有一个TStringList加载了几千个Name-Value Pairs。 其中之一是 004001000002000=Timbre2 Volume 0~127 4995

我通过使用字符串'004001000002000'调用IndexOfName来查找特定索引。我希望ValueFromIndex返回字符串'Timbre2 Volume 0~127 4995'

相反,当我使用ValueFromIndex访问此值时,它返回字符串:

~127 4995

是什么原因引起的? Tilde是一个特殊字符导致字符串被截断吗?我可以将其设置为其他内容吗?

2 个答案:

答案 0 :(得分:3)

我无法在TButton.OnClick事件中使用以下代码重现问题(Delphi 2007和Delphi 7 - Delphi 2007测试中的屏幕截图):

procedure TForm2.Button2Click(Sender: TObject);
var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    SL.Add('004001000002000=Timbre2 Volume 0~127 4995');
    SL.Add('ABCDEF=Testing 1 2 3');
    i := SL.IndexOfName('004001000002000');
    if i > -1 then
      ShowMessage(SL.ValueFromIndex[i])
    else
      ShowMessage('IndexOfName returned -1');
  finally
    SL.Free;
  end;
end;

这正确显示了预期的对话框:

ShowMessage result

我还使用更简单的方法进行了测试:

    ShowMessage(SL.Values['004001000002000']);

这显示了相同的ShowMessage对话框。

答案 1 :(得分:3)

Tilde不是TStringList的特殊字符,除非您明确将其定义为一个。

TStringList.IndexOfName()TStringList.Name[Index]仅查看第一个NameValueSeparator字符前面的内容,TStringList.ValueFromIndex[Index]返回第一个NameValueSeparator字符后的所有内容,该值不会以任何方式截断。默认情况下,TStringList.NameValueSeparator设置为'='。因此,如果您发现截断,则要么在自己的代码中截断,要么TStringList包含实际显示为'004001000002000=~127 4995'的行。