arrays - Lazarus 数组中的 TStringList
问题描述
我对 Lazarus 中的 TStringLists 有疑问。我有一个名为“trans”的数组,其中包含名为“TTrans”的记录,其中包含名为“meebetalers”的 TStringList。因此,例如,当我需要知道该 StringList 中的行数时,我必须写这个吗?
trans[i].meebetalers.Count;
无论如何,我首先创建了一个字符串列表,并将从一个复选框中选择的字符串放入其中,这很有效(即,当我要求计数时,程序返回 3,这是正确的)。
在这段代码中,我将值添加到 StringList:
slmeebetalers := TStringList.Create;
for i:= 0 to Form6.CLBox.Count-1 do begin
if Form6.CLBox.Checked[i] then begin
slmeebetalers.Add(Form6.CLBox.Items[i]);
end;
end;
然后我将 stringlist 放入一个过程,并在该过程中将我第一个创建的 StringList 分配给我之前提到的 stringlist ( trans[i].meebetalers
),接下来看我的代码。
Unit6.VoegTransToe(Form6.TransNaam.Text,
Form6.TrComboBox.Text,
bedrag,
slmeebetalers,
Form6.CalendarDialog1.Date);
但是当我要求计数时,它返回 0。
procedure VoegTransToe(naam, betaalpers: string; bedrag: currency;
meebetalers: TStringList; datum: TDateTime);
begin
aantaltrans:= aantaltrans+1;
trans[aantaltrans].naam:=naam;
trans[aantaltrans].pers.naam:=betaalpers;
trans[aantaltrans].bedrag:=bedrag;
trans[aantaltrans].datum:=datum;
meebetalers:= TStringList.Create;
trans[aantaltrans].meebetalers:= TStringList.Create;
trans[aantaltrans].meebetalers.Assign(meebetalers);
meebetalers.Free;
//trans[aantaltrans].meebetalers.Free;
end;
注意变量名称的不同是因为它们的单位不同
使用此代码,我没有收到错误,但它返回 0。当我说//meebetalers.Free;
同样的情况时。但是当我添加时,我//trans[aantaltrans].meebetalers.Free;
在编译时没有出错,但是当我调用程序时。然后我得到这个错误:
Project project1 raised exception class 'External: SIGSEGV'.
我认为 Create and Free 功能有问题,但我不知道是什么。当我实现 try...finally...end 它返回相同的错误。有谁能够帮我?
解决方案
问题是您的VoegTransToe()
过程忽略了通过其参数传入的填充对象。 您正在重置以在分配给之前指向新创建的空对象。TStringList
meebetalers
meebetalers
TStringList
meebetalers
trans[aantaltrans].meebetalers
procedure VoegTransToe(naam, betaalpers: string; bedrag: currency;
meebetalers: TStringList; datum: TDateTime);
begin
aantaltrans:= aantaltrans+1;
trans[aantaltrans].naam:=naam;
trans[aantaltrans].pers.naam:=betaalpers;
trans[aantaltrans].bedrag:=bedrag;
trans[aantaltrans].datum:=datum;
// meebetalers:= TStringList.Create; // <-- GET RID OF THIS!
trans[aantaltrans].meebetalers:= TStringList.Create;
trans[aantaltrans].meebetalers.Assign(meebetalers);
//meebetalers.Free; // <-- AND THIS!
end;
完成使用后不要忘记Free()
输入TStringList
对象:
slmeebetalers := TStringList.Create;
try
for i := 0 to Form6.CLBox.Count-1 do begin
if Form6.CLBox.Checked[i] then begin
slmeebetalers.Add(Form6.CLBox.Items[i]);
end;
end;
Unit6.VoegTransToe(..., slmeebetalers, ...);
finally
slmeebetalers.Free;
end;
推荐阅读
- docker - gRPC 未实现/未知服务
- node.js - ReactJS SSR 导航到主页
- python - 如何在 django 中有效地对模型 obj 进行排名
- ruby-on-rails - 通过 hashid 查询 ActiveRecord
- r - R:从未命名的向量列表中生成数据框,其中包含来自向量名称的名称列
- android - dlopen 失败:在 android 11(android r)上找不到符号“__exidx_end”
- python - 使用多个子图在 seaborn 散点图上叠加一条垂直线
- python - 如何使用 Dataproc 中的 Jupyter notebook 获取 GCS Bucket 中的文件列表?
- xpath - Nightwatch - xpath 定位器停止为 .waitForElementVisible() 和 .waitForElementPresent() 工作
- python - 使用python刮取在线商店的产品颜色