Delphi 从文本文件加载 name/value 对

Delphi load name/value pair from text file

想要将名称值对加载到 TStringList 中。

有一个包含数据的文本文件:

a=ant
a=animal
b=bob
d=darn

加载它的函数:

LoadData(argPath: string): TStringList;
var
  data: TStringList;
begin
  data := TStringList.Create(true);
  data.Delimiter := '=';
  try
    data.LoadFromFile(argPath);
  except on E : Exception do
  begin
    Application.MessageBox(PWideChar(E.Message), 
       'Unable to Load Data', MB_OK or MB_ICONERROR);
    Application.Terminate;
  end;
  end;
  Result := data;
end;

当前结果为:

a=ant
a=animal
b=bob
d=darn

希望结果的字符串为:

ant
animal
bob
darn

结果的 TObject 为

a
a
b
d

在此之后我希望能够在 TComboBox 中显示它。

您将不得不使用 TStringList 中的内置函数。为了便于阅读/理解,我将其分解为变量,但可以压缩:

var
  X: Integer;
  Name, Value: String;
begin
  for X:= 0 to MyList.Count - 1 do begin
    Name:= MyList.Names[X];
    Value:= MyList.ValueFromIndex[X];
    MyCombo.Items.Add(Value);
  end;
end;

有了这个,我相信您可以弄清楚其余部分(因为我不确定结果字符串和对象的确切含义)。

最好将字符串列表作为参数传递,以简化生命周期管理。最好让函数引发异常并在以后处理它们。这允许更大的灵活性和重用的可能性。像这样:

procedure LoadValues(const FileName: string: Values: TStringList);
var
  i: Integer;
begin
  Values.LoadFromFile(FileName);
  for i := 0 to Values.Count - 1 do
    if Pos(Values.NameValueSeparator, Values[i]) <> 0 then
      Values[i] := Values.ValueFromIndex[i];
end;

您不能将字符串直接存储在 TStringsObjects[] 属性 中,因为字符串是托管类型。您可能应该将名称存储在单独的字符串列表或其他更强大的数据结构中。使用 Names[] 属性 很容易扩展上面的代码来填充两个列表而不是一个列表。

听起来您正试图将所有数据塞入可视化控件中。不要那样做。将视觉控件视为显示数据而不是保存和管理数据的东西。

放弃尝试使用 LoadFromFile 加载组合框。最终创建了两个单独的列表。

FormCreate 处理程序中:

LoadData(...)

myComboBox.Items := displayList;

加载数据

procedure MyForm.LoadData(
    const path: string; data: TStringList);
var index : Integer;
begin
    data.LoadFromFile(path);
    for index := 0 to data.Count - 1 do
    begin
        displayList.Add(data.ValueFromIndex[index]);
        valueList.Add(data.Names[index]);
    end;
end;

每当您需要获取所选值时:

valueList[myComboBox.ItemIndex]