Delphi从文本文件加载名称/值对

时间:2015-07-17 21:58:01

标签: delphi delphi-xe4 tstringlist

想要将名称值对加载到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

和结果的对象

a
a
b
d

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

3 个答案:

答案 0 :(得分:5)

您必须使用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;

有了这个,我确定你可以弄明白其余部分(因为我不确定结果字符串和对象到底是什么意思)。

答案 1 :(得分:2)

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

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;

您无法将字符串直接存储在Objects[]的{​​{1}}属性中,因为字符串是托管类型。您应该将名称存储在单独的字符串列表或另一个更强大的数据结构中。扩展上面的代码很容易使用TStrings属性填充两个列表而不是一个列表。

听起来您正在尝试将所有数据填充到可视控件中。不要那样做。将视觉控件视为显示数据的东西,而不是保存和管理它。

答案 2 :(得分:0)

尝试使用LoadFromFile加载组合框。结束创建两个单独的列表。

FormCreate处理程序

LoadData(...)

myComboBox.Items := displayList;

<强> LoadData

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]