【问题标题】:Changing TStrings.Delimiter breaks search by name更改 TStrings.Delimiter 会破坏按名称搜索
【发布时间】:2015-02-10 16:06:00
【问题描述】:

以下代码有效:

var
  SL: TStrings;
begin
  SL := TStringList.Create;
  try
    SL.Add(Format('%s=%s', ['Alex', '14.05.1984']));

    ShowMessage(SL.Values['Alex']);
  finally
    SL.Free;
  end;
end;

虽然此代码不起作用(无法从名称中获取值):

var
  SL: TStrings;
begin
  SL := TStringList.Create;
  try
    SL.Delimiter       := '|';  // <=== changed from default '=' char
    SL.QuoteChar       := '"';  // <=== added
    SL.StrictDelimiter := True; // <=== added

    SL.Add(Format('%s=%s', ['Alex', '14.05.1984']));

    ShowMessage(SL.Values['Alex']); // <=== returns an empty string
  finally
    SL.Free;
  end;
end;

有人可以帮我吗?

已编辑

program Sample;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes,
  Dialogs;

var
  SL: TStrings;
begin
  try
    SL := TStringList.Create;
    try
      SL.Delimiter := '|';
      SL.QuoteChar := '"';
      SL.StrictDelimiter := True;

  //    SL.Add(Format('%s=%s', ['Alex', '14.05.1984']));
      SL.LoadFromFile('ReplacementPairs.txt');
      ShowMessage(SL.Values['Alex']);
    finally
      SL.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

ReplacementPairs.txt 文件的内容是:

Alex|14.05.1984
Paul|10.07.2015
Edith|18.11.1961

【问题讨论】:

  • 你为什么不用字典?
  • 因此更改分隔符会中断按名称搜索,即使 TStrings 实例内部知道新分隔符。
  • 与其自己添加名称-值对,为什么不写:SL.Values['Alex'] := '14.05.1984'?
  • 我真的很想知道你说什么。因为在 Delphi 6 中,StrictDelimiter 不存在,但是当我删除它时,代码不会返回空字符串。在 XE3 中,我无法重现您报告的内容。
  • 您的代码不会产生您报告的行为。我建议你尝试运行它。如果您在控制台应用程序中制作了一个完整的程序,您只需复制/粘贴一个演示该行为的程序即可。就目前而言,这个问题没有任何意义,因为您报告的行为无法重现。

标签: delphi delphi-xe3


【解决方案1】:

确定名称和值之间分隔符的属性是NameValueSeparator。因此,将其设置为 '|',代码将按照您的意愿运行。

我不禁觉得字典会更适合你的需要。

【讨论】:

  • 当我为你和其他人写一封道歉信时,你已经预料到了我:无论如何:谢谢!
  • 您在原始问题中犯了一个错误。这可能发生。但是当它受到攻击时,你做得很好!做得好。因此,我推翻了我的投票。但是,我不能足够强调提供 MCVE 的重要性。一个简短的 20 行控制台应用程序就可以完成这项工作。它确实使每个人的问题都变得更好。
  • 是的@大卫:你是对的!为未来的问题吸取的教训:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多