高分求教:生成动态按钮,通过自定义按钮事件,再动态生成另外一组按钮。Form退出后报错,
动态生成一组(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;
现在关闭当前界面后 会报错
分不够再加!