//释放label for i:=0 to 999 do begin a[i].Free; end;//释放数组a a := nil
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private a:array of tlabel; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin setlength(a,1000); for i:=0 to 999 do begin a[i] := TLabel.Create(self); a[i].Left := i+5; a[i].top := i+5; a[i].Caption := ' Label'+ IntToStr(i); a[i].Parent := Form1; end; end;procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin for i := Length(a)-1 downto 0 do a[i].free; end;
private s:TStringList;//定义为TORM中的全局变量 //-------------------------------------------- var temp:TLabel; begin s := TStringList.Create(); s.AddObject(Label.Caption,Label); temp := TLabel(s.indexof(Label.Caption));//取TLabel Button2Click(nil);//释放里面的LABEL s.Free;//用完释放 end; procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin for s.Count -1 downto 0 do //释放里面的对象 begin s.Object(i).Free; s.delete(i); end; end;手头没有DELPHI,大致就是这样了,不知道你理解了没有呢?
我来贴个我之前创建动态控件的例子(也是别人给帮我的,现在我转给你了,希望你看的懂)unit Unit3; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm3 = class(TForm) ScrollBox1: TScrollBox; Panel1: TPanel; Edit_Count: TEdit; Button1: TButton; Edit_Width: TEdit; Label1: TLabel; Label2: TLabel; Edit_Height: TEdit; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ScrollBox1Resize(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Edit_WidthChange(Sender: TObject); private FList: TList; procedure PanelOnClick(Sender: TObject); public procedure ClearList; procedure SetPanelPosition; end; var Form3: TForm3; implementation {$R *.dfm} procedure TForm3.Button1Click(Sender: TObject); var vPanel: TPanel; iCount: Integer; i: Integer; begin if TryStrToInt(Edit_Count.Text, iCount) then begin ClearList; for i := 1 to iCount do begin vPanel := TPanel.Create(Self); try FList.Add(vPanel); vPanel.Caption := IntToStr(i); vPanel.Font.Size := 15; vPanel.Font.Color := clBlue; vPanel.Font.Style := [fsBold]; vPanel.Width := 0; vPanel.Height := 0; vPanel.Parent := ScrollBox1; vPanel.OnClick := PanelOnClick; except vPanel.Free; raise; end; end; SetPanelPosition; end; end; procedure TForm3.ClearList; var i: Integer; vPanel: TPanel; begin ScrollBox1.OnResize := nil; try for i := 0 to FList.Count - 1 do begin vPanel := FList.Items[i]; vPanel.Free; end; FList.Clear; finally ScrollBox1.OnResize := ScrollBox1Resize; end; end; procedure TForm3.FormCreate(Sender: TObject); begin FList := TList.Create; end; procedure TForm3.SetPanelPosition; var i: Integer; vLeft: Integer; vTop: Integer; vPanel: TPanel; vWidth, vHeight: Integer; begin if TryStrToInt(Edit_Width.Text, vWidth) and TryStrToInt(Edit_Height.Text, vHeight) then begin vLeft := 0; vTop := 0; for i := 0 to FList.Count - 1 do begin vPanel := FList.Items[i]; vPanel.Width := vWidth; vPanel.Height := vHeight; if vLeft + vPanel.Width > ScrollBox1.Width then begin vLeft := 0; vTop := vTop + vPanel.Height; end; vPanel.Left := vLeft; vPanel.Top := vTop; vLeft := vLeft + vPanel.Width; end; end; end; procedure TForm3.ScrollBox1Resize(Sender: TObject); begin SetPanelPosition; end; procedure TForm3.PanelOnClick(Sender: TObject); begin ShowMessage('This is Panel ' + TPanel(Sender).Caption); end; procedure TForm3.FormDestroy(Sender: TObject); begin ClearList; FreeAndNil(FList); end; procedure TForm3.Edit_WidthChange(Sender: TObject); begin if FList.Count > 0 then SetPanelPosition; end; end.
for i:=0 to 999 do
begin
a[i].Free;
end;//释放数组a
a := nil
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
a:array of tlabel;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
setlength(a,1000);
for i:=0 to 999 do
begin
a[i] := TLabel.Create(self);
a[i].Left := i+5;
a[i].top := i+5;
a[i].Caption := ' Label'+ IntToStr(i);
a[i].Parent := Form1;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
for i := Length(a)-1 downto 0 do
a[i].free;
end;
(我看见佛)
很好很好,总结的很好
使用了构造器(如Create)时,需要明确的free 或freeandnil,
setlength(a,0)....这样的?
a[i].free;设置为0长度的数组,如setlength(a,0)可以认为就是释放数组,有人说a:=nil也是释放,不过这2个都没意义
因为动态数组是在堆上分配的,过程结束自动释放,不用手工去处理,只要把创建的控件释放就行了
用TList TStringList 实现你要的功能
简单 方便维护 方便处理新增需求
s:TStringList;//定义为TORM中的全局变量
//--------------------------------------------
var
temp:TLabel;
begin
s := TStringList.Create();
s.AddObject(Label.Caption,Label);
temp := TLabel(s.indexof(Label.Caption));//取TLabel
Button2Click(nil);//释放里面的LABEL
s.Free;//用完释放
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
for s.Count -1 downto 0 do //释放里面的对象
begin
s.Object(i).Free;
s.delete(i);
end;
end;手头没有DELPHI,大致就是这样了,不知道你理解了没有呢?