批量动态创建控件出错(请高手指点)
动态创建单个控件时没问题,但用数组创建多时,程序在执行到'btn[i] := TButton.Create(Form1);'就报错了:
'Access violation at address 004A1736 in module 'Project1.exe'.请大侠指教了.创建别的类型的控件也是这样.
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i := 1 to 5 do
begin
btn[i] := TButton.Create(Form1);
btn[i].Parent := Form1;
btn[i].Height := 30;
btn[i].Width := 75;
btn[i].Visible := True;
btn[i].top := Self.Top + 50 * i;
btn[i].Left := Self.Left + 50 * i;
btn[i].Caption := '动态控件';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
btn := TButton.Create(Form1);
btn.Parent := Form1;
btn.Height := 30;
btn.Width := 75;
btn.Visible := True;
btn.top := Self.Top + 50 * i;
btn.Left := Self.Left + 50 * i;
btn.Caption := '动态控件';
end;
[解决办法]
var i: integer; btn:array[1..5] of TButton;begin for i:= 1 to 5 do begin btn[i]:= TButton.Create(Form1); btn[i].Parent:= Form1; btn[i].Height:= 30; btn[i].Width:= 75; btn[i].Visible:= True; btn[i].top:=Self.Top+50*i; btn[i].Left:=Self.Left+50*i; btn[i].Caption:='动态控件'; end;end;
[解决办法]
var i: integer; btn:array of TButton; count:Integer;begin count:=10;//创建10个 setlength(btn,count); for i:= 0 to count-1 do begin btn[i]:= TButton.Create(Form1); btn[i].Parent:= Form1; btn[i].Height:= 30; btn[i].Width:= 75; btn[i].Visible:= True; btn[i].top:=Self.Top+50*i; btn[i].Left:=Self.Left+50*i; btn[i].Caption:='动态控件'; end;end;
[解决办法]
数组越界了!
数组下标是从0开始的:
DST.First;
if not DST.Eof then
begin
i := 0; //把1改成0
SetLength(BitBtnArry, DST.RecordCount);
while i <= DST.RecordCount -1 do // 这里给DST.RecordCount - 1
begin
.......
end;
end;
释放的时候:
在Form1.Destroy中写一个:SetLength(BitBtnArry, 0);就可以了,其他的去掉。
Form1 := nil;//不要这么写,如果要动态释放窗体并赋为nil,可以用FreeAndNil(Form1);
[解决办法]
form是动态创建
FreeAndNil(Form1);