var
a:array of tlabel;
begin
setlength(a,1000);
for i:=0 to 999 do
 begin
   创建1000个label;
 end;
end;这1000个label如何释放?

解决方案 »

  1.   

    //释放label
    for i:=0 to 999 do
     begin
      a[i].Free;
     end;//释放数组a
    a := nil
      

  2.   

    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;
      

  3.   

    case5166
    (我看见佛) 
    很好很好,总结的很好
      

  4.   

    不需要,这个由程序完成。
    使用了构造器(如Create)时,需要明确的free 或freeandnil,
      

  5.   

    怎样释放整型数组这样的变量呢?
    setlength(a,0)....这样的?
      

  6.   

    for i:=low(a) to hight(a) do
    a[i].free;设置为0长度的数组,如setlength(a,0)可以认为就是释放数组,有人说a:=nil也是释放,不过这2个都没意义
    因为动态数组是在堆上分配的,过程结束自动释放,不用手工去处理,只要把创建的控件释放就行了
      

  7.   

    如果你要了解如何释放动态创建的控件和数组,2楼是对的。总之对于Tobject调用free就可以释放,interface的设nil就行(当然也可以自动释放)。如果你只需要在退出时释放,那就没有必要了,在Windows平台是不建议程序在退出时释放内存和其他Windows对象如Handle,GDI对象等。因为这些进程退出时Windows会自动释放。只要程序在退出做好数据保存,就可以了,直接用ExitProcess,都不要考虑线程同步,更不需要等待。
      

  8.   

    不建议 用动态数组 
    用TList TStringList 实现你要的功能  
    简单 方便维护 方便处理新增需求 
      

  9.   

    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,大致就是这样了,不知道你理解了没有呢?
      

  10.   

    我来贴个我之前创建动态控件的例子(也是别人给帮我的,现在我转给你了,希望你看的懂)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.  
      

  11.   

     //不好意思,代码没整理,乱了。如果你想要的话,去这个网址下载 //http://download.csdn.net/detail/jayqiang/3882409