想要将名称值对加载到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中显示它。
答案 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]