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;
您不能将字符串直接存储在 TStrings
的 Objects[]
属性 中,因为字符串是托管类型。您可能应该将名称存储在单独的字符串列表或其他更强大的数据结构中。使用 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]
想要将名称值对加载到 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;
您不能将字符串直接存储在 TStrings
的 Objects[]
属性 中,因为字符串是托管类型。您可能应该将名称存储在单独的字符串列表或其他更强大的数据结构中。使用 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]