高分求教:生成动态按钮,通过自定义按钮事件,再动态生成另外一组按钮。Form退出后报错,

黑夜中最亮的星是菩提 2016-10-27 07:45:39
动态生成一组(A组)按钮后,通过点击这组动态按钮的任何一个按钮再次生成另外一组(B组)按钮,

在关闭窗体后,出错

测试生成A组按钮,释放没问题。其中A组按钮的自定义事件是
procedure Tfrm_MerchandiseSalesA.ParentClick(Sender: TObject);
var str:string;
begin
str:=IntToStr(SubBtnNum);
freeSubButton();
if Sender is TSpeedButton then
begin
myParentBtn:=Copy(TSpeedButton(Sender).Caption,1,3);

ShowSubButton();
end;

定义B组按钮的代码为
// 这个是定义的变量和常量,
const
iHtoH = 4; //行间距
iWtoW = 10; //列间距
iWidth = 80; //按钮宽度
var
NumOfSubPerLine : integer;
SubBtnNum:Integer ;
MySubBtn:array of TSpeedButton;

implementation
.



procedure Tfrm_fromA.ShowSubButton();
var i:Integer;
begin

// 显示子类
with qrySelect do
begin
Close;
SQL.Clear;
Sqlstr:='select * from TB_SPXX where substr(spbh,1,3)= '''+myParentBtn+''' ';
SQL.Add(Sqlstr);
Prepared;
Open();
if RecordCount>0 then
begin
SubBtnNum:=RecordCount;
SetLength(MySubBtn,SubBtnNum);
First;
NumOfSubPerLine := scrlbx2.Width div (iWidth+iWtoW);
for i:=1 to SubBtnNum do
begin
MySubBtn[i]:=TSpeedButton.Create(Self);
MySubBtn[i].Parent:=frm_MerchandiseSalesA.scrlbx2;
MySubBtn[i].Width:=80;
MySubBtn[i].Height:=70;
MySubBtn[i].Left:= iWtoW + (iWidth+iWtoW) * ((i) mod NumOfSubPerLine);
MySubBtn[i].Top:= iHtoH + (75+iHtoH) * (i div NumOfSubPerLine - integer((i mod NumOfSubPerLine)=0));
MySubBtn[i].Name:='A'+FieldByName('SPBH').AsString;
MySubBtn[i].Caption:=FieldByName('SPBH').AsString+#13+
FieldByName('SPMC').AsString;

MySubBtn[i].Visible:=True;
Next;

end;
end
else
begin
SubBtnNum:=0;
end;


end;



//******************显示子类
end;



释放B组按钮

procedure Tfrm_MerchandiseSalesA.freeSubButton();
var i:Integer;
begin

if SubBtnNum>0 then
begin
for i :=1 to SubBtnNum do
begin
MySubBtn[i].Free;
end;
end;


end;

现在关闭当前界面后 会报错

分不够再加!

...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
看那山瞧那水 2016-10-28
  • 打赏
  • 举报
回复
动态创建按钮时,Owner已经是Self(Form),不要再手工释放了;如果要手工释放,按钮创建的时候Owner = nil , MySubBtn[i]:=TSpeedButton.Create(nil);
  • 打赏
  • 举报
回复
这个问题我解决了,问题的重点还是在 ShowSubButton(); 里的 MySubBtn[i]:=TSpeedButton.Create(Self);。后来取消了数组,直接用MySubBtn:TSpeedButton 定义。解决了。 感谢楼上两位,虽然没有解决问题,但是还是感谢你们的精神。谢谢
  • 打赏
  • 举报
回复
楼上的高手,昨天晚上我用两个BUTTON 分别手工释放两组按钮,没问题,就是当前窗体退出时候出错。(A组)按钮动态生成后,我关闭窗体,正常。只要点击A组的动态生成B组按钮后,退出就出错。如果A组下的按钮生成的B组按钮为0,退出窗体也是正常的。我就是怀疑B组按钮生成有问题( ShowSubButton(); )
leeky 2016-10-28
  • 打赏
  • 举报
回复
支持2楼。退出程序时,动态创建的按钮已经被释放(freeSubButton()),然后Owner又要去释放它,指针错误。
  • 打赏
  • 举报
回复
图片上传不了。ACCESS VIOLATION AT ADDRESS 00405B65 IN MODULE"AAA.EXE",WRITE OF ADDRESS 004B318C

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧