我在释放在frmTransaction.Show上创建的按钮数组时遇到问题
从再次显示时,我收到无效的操作错误。
当我用其他用户运行该程序时,它说已经有该名称的项目了:)
这段代码是我程序中唯一可以释放内存的部分
SetLength(btnSale,iTrans);
for i := 1 to iTrans do
begin
readln(tPos,sPos);
iPos := Pos(';',sPos); //Gets positions of buttons
sTop := Copy(sPos,1,iPos-1);
sLeft := Copy(sPos,iPos+1,length(sPos));
btnSale[i] := TButton.Create(gbxSales);
with btnSale[i] do
begin
Parent := gbxSales;
name := 'Transaction' +
IntToStr(dmdata.tblTransactions['TransactionID']); //Creates buttons that represent Transactions
Caption := 'Sale ' + IntToStr(i);
Width := 153;
Height := 97;
Top := StrToInt(sTop);
left := strToInt(sleft);
show;
onClick := ClickSale;
end;
dmdata.tblTransactions.Next;
end;
procedure TfrmTransactions.FormHide(Sender: TObject);
var
i : integer;
begin
for i := low(btnSale) to high(btnSale) do //frees dynamically created objects
begin
btnSale[i].Free;
btnSale[i] := nil;
end;
end;
最佳答案
SetLength
函数设置动态数组的长度。高位成员将为MyArray[Length(MyArray)-1]
(在代码的第二部分中使用了高位函数)。您的代码正在寻址成员btnSale[i]
,因此它对成员#0没有任何作用,并且正在寻址高边界上方的成员btnSale[Length(btnSale)]
。
尝试使用这个。
SetLength(btnSale,iTrans);
for i := 0 to iTrans-1 do
// or this for i := low(btnSale) to high(btnSale) do
begin
...
btnSale[i] := TButton.Create(gbxSales);
with btnSale[i] do
...
end;