Delphi```
我有一个主窗体A(fsMDIForm),一个子窗体B(fsMDIChild),一个正常窗体(fsNormal).
A 的Create 什么也没有做```
B 的Create 做了个查询
C 的Create 做了个查询,并根据查询结果生成了一个动态数组,然后又数组绑定``生成一些动态控件.
步骤:A 调用 B 调用 C
调用没有出现问题```一切很正常``
但是 当我关闭就出现问题
1\当 C 窗体没有生成动态数组及动态控件 ,关闭C 窗体很正常,然后关闭 B窗体 也正常.
2\当 C 窗体有生成动态数组及动态控件 ,关闭C 窗体正常, 然后关闭 B 窗体就报错,\
错误步骤如下:
1\ Invalid pointer operation
2\Access violation at address ````````````
等错误弹过后```然后在打开 B窗体 `
就告知: A Conponent named Mlll_Frm already exists. 请朋友们帮我解决下这个问题``我在线等候``谢谢```
本人QQ 251812159
我有一个主窗体A(fsMDIForm),一个子窗体B(fsMDIChild),一个正常窗体(fsNormal).
A 的Create 什么也没有做```
B 的Create 做了个查询
C 的Create 做了个查询,并根据查询结果生成了一个动态数组,然后又数组绑定``生成一些动态控件.
步骤:A 调用 B 调用 C
调用没有出现问题```一切很正常``
但是 当我关闭就出现问题
1\当 C 窗体没有生成动态数组及动态控件 ,关闭C 窗体很正常,然后关闭 B窗体 也正常.
2\当 C 窗体有生成动态数组及动态控件 ,关闭C 窗体正常, 然后关闭 B 窗体就报错,\
错误步骤如下:
1\ Invalid pointer operation
2\Access violation at address ````````````
等错误弹过后```然后在打开 B窗体 `
就告知: A Conponent named Mlll_Frm already exists. 请朋友们帮我解决下这个问题``我在线等候``谢谢```
本人QQ 251812159
for i :=0 to AFrm.MDIChildCount -1 do
if (AFrm.MDIChildren[i] is TBFrm) then
begin
self.MDIChildren[i].BringToFront;
MDIChildren[i].SetFocus;
Exit;
end; //创建新窗体
Application.CreateForm(TBFrm,BFrm);
MeterFrm.Show;
释放:procedure TBFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BFrm := nil;
Action := caFree;
end;
该如何释放`我能想到的我都想了 `` 我C 窗体释放代码如下:
close事件
CBox:=nil;//我创建的动态数组
Action:=caFree;
在Delphi程序中,一个最普遍导致Access Violation错误的原因是使用了一个没有被创建的对象!
B(fsMDIChild)窗体调用代码:
if YanSe_Frm=nil then
YanSe_Frm:=TYanSe_Frm.Create(Self); //创建窗体
YanSe_Frm.Show; //显示窗体
B(fsMDIChild)窗体释放代码:
Action:=caFree;
-----------------------------------------------------
C(fsNormal)窗体全部代码:
procedure TYanSe_Frm.FormCreate(Sender: TObject);
var
SqlStr:String;
TempStr:String;
begin
tp:=30;
count:=1;
Label3.Caption:=Mlll_Frm.cxComboBox2.Text+'颜色:';
TempStr:=Copy(Mlll_Frm.cxComboBox2.Text,1,Pos('/',Mlll_Frm.cxComboBox2.Text)-1);
SqlStr:='SELECT MIANLIAO.MLDM,MIANLIAO.MLMC,DANWEI.DWMC ,VW_MLJXCMX.GGDM as YSDM,HGUIGE1.GGMC as YSMC,SUM(VW_MLJXCMX.SL) AS SL_S '
+' FROM (SELECT CKDM,QRRQ,MLDM,GGDM,SL FROM VW_MLJXCMX WITH (NOLOCK) WHERE VW_MLJXCMX.QR='+QuotedStr('1')+' and MLDM='+QuotedStr(TempStr)+' )VW_MLJXCMX, MIANLIAO, CANGKU, DANWEI ,HGUIGE1 WITH (NOLOCK) '
+' WHERE VW_MLJXCMX.MLDM=MIANLIAO.MLDM AND VW_MLJXCMX.CKDM=CANGKU.CKDM AND MIANLIAO.DWDM = DANWEI.DWDM AND VW_MLJXCMX.GGDM=HGUIGE1.GGDM '
+' GROUP BY MIANLIAO.MLDM,MIANLIAO.MLMC,DANWEI.DWMC ,VW_MLJXCMX.GGDM,HGUIGE1.GGMC HAVING SUM(VW_MLJXCMX.SL) <>0'; OpenQuery(DataModule1.ADOQuery1,SqlStr);//自定义函数,功能就是查询.
SetLength(CBox,DataModule1.ADOQuery1.RecordCount); //为动态数组划分空间
DataModule1.ADOQuery1.First;
while not(DataModule1.ADOQuery1.Eof) do
begin
TempStr:=DataModule1.ADOQuery1.FieldValues['YSDM'] +'/'+DataModule1.ADOQuery1.FieldValues['YSMC'];
CreateBtn(Sender,TempStr,clRed,17,97,67,tp);
DataModule1.ADOQuery1.Next;
count:=count+1;
tp:=tp+25;
end;
end;
//创建CheckBox
function TYanSe_Frm.CreateBtn(Sender: TObject; BtnCaption: String;
BtnColor: TColor; BtnHeight, BtnWidth, BtnLeft,
BtnTop: Integer): Integer;
begin
CBox[Count]:=TcxCheckBox.Create(Self);
CBox[Count].Parent:=Self;
CBox[Count].Properties.Alignment:=taRightJustify;
CBox[Count].Caption:=BtnCaption;
// DTbutton.Font.Color:=BtnColor;
CBox[Count].Height:=BtnHeight;
CBox[Count].Width:=BtnWidth;
CBox[Count].Left:=BtnLeft;
CBox[Count].Top:=BtnTop;
CBox[Count].Cursor:=crHandPoint;
// 按钮事件
// CBox[Count].OnClick:=OnCheckChick;
// DTbutton.OnMouseUp:=MYRightClick;
CBox[Count].Show;
end;procedure TYanSe_Frm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
//YanSe_Frm:=nil;
//CBox:=nil;
//YanSe_Frm.Free;
// Action:=caHide;
{
try
CBox:=nil;
except
ShowMessage('未释放');
end;
}
end;procedure TYanSe_Frm.FormDestroy(Sender: TObject);
begin
CBox:=nil;
end;end.
if YanSe_Frm=nil then
YanSe_Frm:=TYanSe_Frm.Create(Self); //创建窗体
YanSe_Frm.Show; //显示窗体
B(fsMDIChild)窗体释放代码:
Action:=caFree;
B窗体变量 := nil;
你的意思是让每个 Cbox:=nil ?
但是,我在关掉 B 窗体的时候还是报错啊 ``错误跟我刚刚说的一样```
begin
CBox[Count].Free;
end;
CBox[Count]:=TcxCheckBox.Create(Self); //刚刚看到这里,你不需要手工释放CBox,系统会自动为你释放的!
SetLength(CBox,DataModule1.ADOQuery1.RecordCount); //为动态数组划分空间
我把它改成:
SetLength(CBox,100);
就什么问题也没有了``很神奇吧``同时也很抑郁~!!~!~!
不过很感谢朋友们的帮助!!!
谢谢你们~!~!~!