程序段如下:unit ChannelOptimize;interface
.
.
type
  TAryChkBox = array of TsuiCheckBox;
.
.
  public
    { Public declarations }
    AryChkBox : TAryChkBox;  {定义数组变量AryChkBox}
  end;
.
.
implementation
.
.{在FormDestroy中释放对象出错:‘Invalid pointer operation}
procedure TfrmChannelOptimize.FormDestroy(Sender: TObject);
var
  I : Integer;
begin
  I := High(AryChkBox);
  if Assigned(AryChkBox) then
  begin
    for I := Low(AryChkBox) to High(AryChkBox) do
    begin
      if Assigned(AryChkBox[I]) then
        AryChkBox[I].Free;
    end;
  end;
end; <-- 跟踪到此出错假设I = 16 ,当单步跟踪到FormDestroy的end是出现"Project mdiapp.exe raised exception class EInvalidPointer with message 'Invalid pointer
operation'.Process stopped. Use Step or Run to continue."的错误提示。我将TsuiCheckBox对象建立并存储在数组AryChkBox中:procedure TfrmChannelOptimize.CreateCheckBox;
var
  RecCount, Cols, Rows, I, J ,K: Integer;
  BorderTop, BorderLeft, MatrixTop, MatrixLeft : Double;
  SqlStr : String;
  ChkBox : TsuiCheckBox;
begin
  with DM.dtsGetParameter do
  begin
.
.
    I := 0;
    J := 0;
    K := 0;
    RecCount := RecordCount;    SetLength(AryChkBox, RecCount);    ChkBox := TsuiCheckBox.Create(Self);  {建立TsuiCheckBox对象实例}
    ChkBox.Name := 'chkAll';
    ChkBox.Parent := gpbOpmitizeParameter;
    ChkBox.Caption := '全选';
    ChkBox.Top := Round(BorderTop);
    ChkBox.Left := Round(BorderLeft + (MatrixLeft * J));
    ChkBox.TabOrder := K;
    AryChkBox[0] := ChkBox;
    Inc(I);
    Inc(K); <-- {去掉此句时运行正常}    while not Eof do
    begin
        ChkBox := TsuiCheckBox.Create(Self);
        ChkBox.Parent := gpbOpmitizeParameter;
        ChkBox.Caption := FieldByName('ParameterName').AsString;
        if J = Cols then
        begin
          Inc(I);
          J := 0;
        end;
        ChkBox.Top := Round(BorderTop) + Round((MatrixTop * I));
        ChkBox.Left := Round(BorderLeft + (MatrixLeft * J));
        ChkBox.TabOrder := K;
        SetLength(AryPara, K);
        AryPara[K - 1] := FieldByName('parameter').AsString;
        AryChkBox[K] := ChkBox;
        Inc(J);
        Inc(K);
      Next;
    end;
  end;
end;当去掉上述的Inc(K); 时程序运行不会出错,但这样我的第一个对象AryChkBox[0] 会被下面的循环建立对象时覆盖掉。while .. do
begin
  .
  .
  AryChkBox[K] := ChkBox;
  .
  .        
end;

解决方案 »

  1.   

    SetLength(AryChkBox, RecCount);改成
    SetLength(AryChkBox, RecCount + 1);
    看看!
      

  2.   

    将      SetLength(AryPara, K);
          AryPara[K - 1] := FieldByName('parameter').AsString;
          AryChkBox[K] := ChkBox;
    改为        
          SetLength(AryPara, K);
          AryPara[K - 1] := FieldByName('parameter').AsString;
          SetLength(AryChkBox, K + 1);
          AryChkBox[K] := ChkBox;就没事了
    就是说把  SetLength(AryChkBox, RecCount);    改为 SetLength(AryChkBox, K + 1); 放在while循环中, 有点不明白,请大家研究研究!
      

  3.   

    哎,就是你分配的数组空间不够,
    ChkBox.Caption := '全选';从这里看出这个CheckBox和数据库无关从
    while not Eof do
        begin
            ChkBox := TsuiCheckBox.Create(Self);
    看出你要把数据库中每个记录创建一个对应的CheckBox
    所以数组大小应该是RecCount + 1