我在释放在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;

09-29 22:36