程序段如下: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;
.
.
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;
SetLength(AryChkBox, RecCount + 1);
看看!
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循环中, 有点不明白,请大家研究研究!
ChkBox.Caption := '全选';从这里看出这个CheckBox和数据库无关从
while not Eof do
begin
ChkBox := TsuiCheckBox.Create(Self);
看出你要把数据库中每个记录创建一个对应的CheckBox
所以数组大小应该是RecCount + 1