如何删除动态生成的控件(30分)

  • 主题发起人 主题发起人 冰刀
  • 开始时间 开始时间

冰刀

Unregistered / Unconfirmed
GUEST, unregistred user!
我在制作报表时,用了动态生成字段的方法,但是我想取消一次选择,重新选择,但动态
生成的字段已经建立在报表上,我该怎么清除,并重新选择字段。
 
你Free掉重新建不行?
 
那怎么用free?例如我建立一个edit控件,如果用edit。free,但是在程序编译时系统
提示还没有声明,
 
创建控件时Tag:=1
....
....

释放时:
var
ls:TList;
...
ls:=TList.Create;
try
for i:=0 to ControlCount-1do
if Controls.Tag=1 then
ls.Add(Controls);

for i:=0 to ls.Count-1do
TObject(ls).Free;
finally
ls.free;
end;


 
未创建就FREE当然会提示还没有声明
 
ls.Add(Controls);
是什么意思?
ls.Count,系统提示出错。ls,ls这样写是数组呀?
能不能说仔细点儿?请多指教。
 
如果你建立一个edit控件,要Free的话不能用edit.free,而要用那个Edit控件的名字,如
Edit1.Free,你用Edit.Free,当然会提示你没有声明啦
 
把组件定义成全局变量,你就可以在任何地方free了
 
free是控件的方法,你创建了一个新的控件在需要的时候就来个free就搞定
 
创建控件时(以TEdit为例):
.......
with TEdit.Create(Form1)do
begin
Left:=100;
Top:=100;
Tag:=1;
Parent:=Form1;
end;
.......
释放时调用过程FreeAllCreatedByMe(Form1):
procedure FreeAllCreatedByMe(const WinControl:TWinControl);
var
ls:TList;
i:Integer;
begin
ls:=TList.Create;
try
with WinControldo
for i:=0 to ControlCount-1do
if Controls.Tag=1 then
ls.Add(Controls);
for i:=0 to ls.Count-1do
TControl(ls).Free;
finally
ls.Free;
end;
end;

???ls.Count,系统提示出错???
不会吧。
TList是一个用于存放指针的列表,像个随意增加的数组。
可以写成ls等价于ls.Items,因为属性Items是默认属性的。
过程FreeAllCreatedByMe通过控件数组历遍所有控件,如果控件的Tag为1,该控件就是
刚刚创建的,把它放进ls中,最后把ls中的所有控件释放。
注意不要直接在控件数组中释放控件,那样控件数组就会进行排列操作,元素的次序
可能会改变。
 
谢谢你的耐心指教,我刚开始学delphi,还有一点,就是调用FreeAllCreatedByMe();
过程时,用的实参,twincontrol对应什么样的实参?是什么呢?这一点我总是搞不清。
 
怎么还没人回呀?kyq请指教
 
TWinControl是TForm,TPanel等具有窗体句柄的控件的父类。
也就是说可以:
FreeAllCreatedByMe(Panel1);
FreeAllCreatedByMe(Form1);
FreeAllCreatedByMe(Frame1);
...
???twincontrol对应什么样的实参???
不太明白指的是什么。


 
多人接受答案了。
 
后退
顶部