【发布时间】:2012-08-14 14:36:55
【问题描述】:
我编写了一个 Delphi 函数,它将 .dat 文件中的数据加载到字符串列表中。然后它解码字符串列表并分配给一个字符串变量。字符串的内容使用“#”符号作为分隔符。
我怎样才能获取这个字符串的内容,然后将其内容分配给局部变量?
// Function loads data from a dat file and assigns to a String List.
function TfrmMain.LoadFromFile;
var
index, Count : integer;
profileFile, DecodedString : string;
begin
// Open a file and assign to a local variable.
OpenDialog1.Execute;
profileFile := OpenDialog1.FileName;
if profileFile = '' then
exit;
profileList := TStringList.Create;
profileList.LoadFromFile(profileFile);
for index := 0 to profileList.Count - 1 do
begin
Line := '';
Line := profileList[Index];
end;
end;
解码后,var "Line" 包含如下内容:
示例:
Line '23#80#10#2#1#...255#'.
并非所有分隔符之间的值都具有相同的长度,并且每次调用函数 LoadFromFile 时,“Line”的值都会有所不同(例如,有时一个值在接下来的两个或三个等中可能只有一个数字等,所以我不能依赖于字符串或数组的 Copy 函数)。
我正在尝试找出一种循环遍历“Line”内容的方法,将其分配给名为“buffer”的局部变量,然后如果遇到“#”,则将缓冲区的值分配给局部变量,将缓冲区重新初始化为 '';然后移动到“Line”中的下一个值,重复下一个参数的过程,每次忽略'#'。
我想我已经纠结这个问题太久了,我似乎无法取得任何进展,需要休息一下。如果有人愿意看一看,我欢迎任何关于如何实现这一目标的建议。
非常感谢
KD
【问题讨论】:
-
文件是单行还是多行#分隔的行?
-
看来你没有释放profileList。那就是内存泄漏。如果您需要在解析每一行之前将文件拆分为行,那么您应该使用 try-finally 来释放对象。查看@UweRaabe 的答案 - 并使用创建和释放 profileList 的相同模式。外壳“profileList”表明您来自 Java 领域或类似的地方。这里没有垃圾收集是Delphi。如果你创造了一些东西——你有责任释放它。虽然有引用计数的接口,比如我的回答中提到的 IJclStringList 。它们将被编译器释放。
-
如果文件不是多行,而是单行,那么你应该把它读入字符串变量而不是字符串列表。
-
"OpenDialog1.Execute;" - 你会检查结果吗?如果用户按下“取消”,他会对结果感到非常好笑……
-
@Arioch'The,我越是觉得您需要在 StackOverflow 上为您的 cmets 提供一个特殊选项卡。然后人们可以简单地与其他 cmets 一起阅读问题,并可以选择使用您的选项卡切换到选项卡:-)
标签: delphi loops delphi-xe2 tstringlist