有一函数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的。
其中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的。
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;
for i :=1 to 20 do begin
TLabel(DetailLabel[i]).Free;
end;
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;
if DetailLabel[L] <> nil then //8
DetailLabel[L].Free; //9
if DetailLabel[L] <> nil then //8
FreeAndNil(DetailLabel[L]); //9
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;
if DetailLabel[L] <> nil then //8
DetailLabel[L].Free; //9
反过来释放。 for L:=20 downto 1 do //7
if DetailLabel[L] <> nil then //8
DetailLabel[L].Free; //9
[/Quote][Quote=引用 10 楼 JeffChung 的回复:]
赞成此方法.