首页 > 解决方案 > 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 它返回相同的错误。有谁能够帮我?

标签: arrayslazarusfreepascaltstringlist

解决方案


问题是您的VoegTransToe()过程忽略了通过其参数传入的填充对象。 您正在重置以在分配给之前指向新创建的空对象。TStringListmeebetalersmeebetalersTStringListmeebetalerstrans[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;

推荐阅读