动态创建对象列表
- 问题描述:
设计器在使用时没有固定的控件数量规定,同时控件类型也没有明确细分,需要程序在用户通过button选择后动态创建。
- 问题分析:
控件类型的不同是指在最后完成界面设计后导出的文本消息不同,但基本属性结构相同,所以直接在自定义的父类下完成类的派生,在子类中对导出动作进行重写。
动态创建需要通过一个TObjectList对象对产生的动态对象进行保存,同时也可以通过该类的一些属性完成动态对象的操作。
- 具体实现
在这里只派生了3个子类,同时在界面上也添加了3个button,通过button的点击回调函数完成一个对象的创建和保存,这里以创建T1Object对象为例:
procedure TMainForm.ToolButton1Click(Sender: TObject);
var
newObject:T1Object;
begin
newObject := T1Object.Create(owner);
with newObject do
begin
parent := panel1;
kLeft := 1;
kTop := 1;
kWidth := 50;
kHeight := 20;
ID := proj.IdObjectNumber;
page := tabset1.TabIndex;
end;
//加入对象列表
if ObjectList = nil then ObjectList := TObjectList.Create(true);
ObjectList.Add(newObject);
proj.IdObjectNumber := proj.IdObjectNumber +1;
//更新ListBox
UpdateValueListEditor(newObject);
ListBox1.Items.Add(inttostr(newObject.ID)+':'+newObject.Caption);
tabset1.OnClick(sender);
proj.saveFlag := 1;
end;
对于面向对象十分不熟练的我一开始不太理解为什么声明的变量对象还要再调用一次Create,但是不调用就会出问题,后面慢慢发现Creat有点像C里的malloc,声明的变量对象只是一个指针,只用Creat后内存的内容才不会本覆盖。Destory就像是free将动态分配的内存释放掉,对于这里来说就是删除一个动态对像。
为了能让用户清除的看到已经创建了几个对象,这里添加了一个ListBox控件,当ObjectList对象列表发生改变时,及时的对ListBox进行更改。
总结
当对象列表完成构建后,后续的操作基本就是对列表的遍历操作。TObjectList对象在使用前要判断是否等于nil,如果是nil的情况代表该对象没有进行Creat,此时如果调用对象的属性会产生报错。