首页 > 解决方案 > Delphi 5 TStringList NameValueSeparator

问题描述

我有一个带有像这样的键值对的文本文件

user1|password1
user2|password2
user3|password3

在delphi 10中,我使用这个函数来获取键值

function getKeyByName(fileName, key: string) : string;
var
  dataFile : TStringList;
begin
  Result := 'Not Found';
  dataFile := TStringList.Create;
  dataFile.LoadFromFile(fileName);
  dataFile.NameValueSeparator := '|';
  if dataFile.Values[key] <> '' then
    Result := dataFile.Values[key];
  dataFile.Free;
end;

现在一切都很好。

我尝试将此功能与 delphi 5 一起使用,但属性 (NameValueSeparator) 不存在。

如果我将分隔符更改为 (=) 并将函数更改为:

function getKeyByName(fileName, key: string) : string;
var
  dataFile : TStringList;
begin
  Result := 'Not Found';
  dataFile := TStringList.Create;
  dataFile.LoadFromFile(fileName);
  if dataFile.Values[key] <> '' then
    Result := dataFile.Values[key];
  dataFile.Free;
end;

我可以得到结果,但我的文本文件中的分隔符是 (|)。

我应该怎么做才能为列表设置分隔符(|)?

感谢帮助。

标签: delphi-5tstringlist

解决方案


Delphi 5 没有该NameValueSeparator属性,因此您必须手动解析各个字符串,例如:

function getKeyByName(fileName, key: string) : string;
var
  dataFile : TStringList;
  i, j: Integer;
  s: string;
begin
  Result := 'Not Found';
  dataFile := TStringList.Create;
  try
    dataFile.LoadFromFile(fileName);
    for i := 0 to dataFile.Count-1 do
    begin
      s := dataFile[i];
      j := Pos('|', s);
      if j = 0 then Continue;
      if Copy(s, 1, j-1) <> key then Continue;
      s := Copy(s, j+1, MaxInt);
      if s <> '' then Result := s;
      Break;
    end;
  finally
    dataFile.Free;
  end;
end;

推荐阅读