有一函数ADOQuery2AfterOpen,每次执行完数据库查询后都会被调用。它的功能是根据查询到的记录在ScrollBox上动态地创建Label来显示内容。
其中Label数组的定义如下:
var
  DetailLabel:array[1..20] of TLabel; 
动态创建Label的主要代码如下:
while not ADOQuery2.Eof do
  begin
    DetailLabel[I] := TLabel.Create(self);
    ...
    I := I + 1;
    ADOQuery2.Next;
  end;
现在的问题是第二次调用该函数时,第一次创建的Label还在,请问怎样才能撤销第一次生成的Label,撤销的代码放在哪里,使得每次执行该函数时ScrollBox上都是空白没有Label的。

解决方案 »

  1.   


    var
      i:integer;
    begin
      for i:=self.ControlCount-1 downto 0  do
      begin
        if (self.Controls[i] is Tlabel) then
          Tlabel(Controls[i]).Free
      end;
      
      

  2.   

    释放前你需要检查是否有20个label,有就调用以上程序
      

  3.   


     for i :=1  to 20 do begin
       TLabel(DetailLabel[i]).Free;
     end;
      

  4.   

    函数如下,释放的代码应该放在哪里?放在函数开始处(7、8、9行)就会报错,放在结尾处就会因为释放了而显示不了Label。
    procedure TWordForm.ADOQuery2AfterOpen(DataSet: TDataSet);
    var
      DetailLabel:array[1..20] of TLabel;
      I:integer;
    begin
      Sb1.VertScrollBar.Position := 0;//滚动条复位
      for L:=1 to 20 do               //7
        if DetailLabel[L] <> nil then //8
          DetailLabel[L].Free;        //9  Code.Caption := Lv1.Selected.Caption;
      Word.Caption := Lv1.Selected.SubItems[0];
      TypeL.Caption := Lv1.Selected.SubItems[1];  I := 1;
      while not ADOQuery2.Eof do
      begin
        DetailLabel[I] := TLabel.Create(self);
        DetailLabel[I].Parent := Sb1;
        DetailLabel[I].Left := 36;
        if I = 1 then
          DetailLabel[I].Top := 100
        else
          DetailLabel[I].Top := DetailLabel[I - 1].Top + 200;
        DetailLabel[I].Width := 72;
        DetailLabel[I].Height := 24;
        DetailLabel[I].Caption := '读音:';
        DetailLabel[I].Font.Charset := ANSI_CHARSET;
        DetailLabel[I].Font.Color := clWindowText;
        DetailLabel[I].Font.Height := -24;
        DetailLabel[I].Font.Name := '宋体';
        DetailLabel[I].Font.Style := [];    I := I + 1;
        ADOQuery2.Next;
      end;
    end;
      

  5.   

    我想知道如何判断控件是否已经被动态创建了,如果已经创建了就释放掉,但用这两句不行啊
        if DetailLabel[L] <> nil then //8 
          DetailLabel[L].Free;        //9 
      

  6.   

    用這個試試
        if DetailLabel[L] <> nil then //8 
          FreeAndNil(DetailLabel[L]);        //9 
      

  7.   

    while not ADOQuery2.Eof do 
      begin 
        DetailLabel[I] := TLabel.Create(self);     DetailLabel[i].Tag := 1;    ... 
        I := I + 1; 
        ADOQuery2.Next; 
      end; var
      i:integer;
    begin
      for i:=self.ControlCount-1 downto 0  do
      begin
        if (self.Controls[i] is Tlabel) then
        begin
          if Controls[i].Tag = 1 then
            Tlabel(Controls[i]).Free
        end;
      end;
      

  8.   

    反过来释放。  for L:=20 downto 1 do              //7 
        if DetailLabel[L] <> nil then //8 
          DetailLabel[L].Free;        //9 
      

  9.   


    反过来释放。   for L:=20 downto 1 do              //7 
        if DetailLabel[L] <> nil then //8 
          DetailLabel[L].Free;        //9 
    [/Quote][Quote=引用 10 楼 JeffChung 的回复:]
    赞成此方法.