自制控件卡壳了 一个类名传参的问题 ( 积分: 120 )

  • 主题发起人 主题发起人 smithcouple
  • 开始时间 开始时间
S

smithcouple

Unregistered / Unconfirmed
GUEST, unregistred user!
我首先用程序做了一个MPI多页面的程序,用TPageControl做主容器,可以动态创建TTabSheet,TTabSheet

内含的是已经创建好的TFrame,菜单栏也可以动态生成Window菜单。释放也没问题。

后来我想做一个叫TMPIController的非可视组建,专门控制MPI,可以指定TPageControl TMenuItem 还有

动态TTabSheet内的TFrame,自己写了CreateNewPage,DeleteActivePage,DeleteAllPages,

DeleteSomePage(PageIndex: integer)等方法。这样就可以用很少的代码实现MPI程序。

但在我做的时候遇到了一个棘手的问题。就是在TFrame那里,因为一般的TFrame和TForm类似,都是

TFrame1 = class(TFrame)这样的子类。

我开始写的是property TabSheetInside: TFrame read FTabSheetInside write SetTabSheetInside;
这样肯定不行,这样只能指定一个类的对象,而不是其子类。因为后面再动态创建的时候都是针对类的。

后来我想到让用户将类名用字符串设置好property InsideClass: string read FInsideClass write SetInsideClass;,再用FindClass找到,但这需要RegisterClass,而我并不知道用户的TFrame那个子类叫什么名字,比如我可以叫TFrame1,他可以叫TFrameChild。这样我就没办法找到用户指定的TFrame子类。

也许我的方法有问题,请大家看看,应该在哪里做修改,或者整体结构就有问题。我重新做,谢谢!

TFrame子类我想是这么操作:比如这个子类叫TFrame1,TempTabSheetInsideName自动生成的,不会重复
TFrame1.Create(Self).Name := TempTabSheetInsideName;
TFrame1(FindComponent(TempTabSheetInsideName)).Parent :=
TTabSheet(FindComponent(TempTabSheetName))



还有一件事,我想问问,一个Frame在Free的时候,其内部的各组件是不是也可以自动Free,而不是需要手动一个个.Free?
 
我首先用程序做了一个MPI多页面的程序,用TPageControl做主容器,可以动态创建TTabSheet,TTabSheet

内含的是已经创建好的TFrame,菜单栏也可以动态生成Window菜单。释放也没问题。

后来我想做一个叫TMPIController的非可视组建,专门控制MPI,可以指定TPageControl TMenuItem 还有

动态TTabSheet内的TFrame,自己写了CreateNewPage,DeleteActivePage,DeleteAllPages,

DeleteSomePage(PageIndex: integer)等方法。这样就可以用很少的代码实现MPI程序。

但在我做的时候遇到了一个棘手的问题。就是在TFrame那里,因为一般的TFrame和TForm类似,都是

TFrame1 = class(TFrame)这样的子类。

我开始写的是property TabSheetInside: TFrame read FTabSheetInside write SetTabSheetInside;
这样肯定不行,这样只能指定一个类的对象,而不是其子类。因为后面再动态创建的时候都是针对类的。

后来我想到让用户将类名用字符串设置好property InsideClass: string read FInsideClass write SetInsideClass;,再用FindClass找到,但这需要RegisterClass,而我并不知道用户的TFrame那个子类叫什么名字,比如我可以叫TFrame1,他可以叫TFrameChild。这样我就没办法找到用户指定的TFrame子类。

也许我的方法有问题,请大家看看,应该在哪里做修改,或者整体结构就有问题。我重新做,谢谢!

TFrame子类我想是这么操作:比如这个子类叫TFrame1,TempTabSheetInsideName自动生成的,不会重复
TFrame1.Create(Self).Name := TempTabSheetInsideName;
TFrame1(FindComponent(TempTabSheetInsideName)).Parent :=
TTabSheet(FindComponent(TempTabSheetName))



还有一件事,我想问问,一个Frame在Free的时候,其内部的各组件是不是也可以自动Free,而不是需要手动一个个.Free?
 
不知道你是否熟识类工厂模式,其实你要实现的就是一个类工厂。
你定义这样一个类型的话,就可以接受所有TFram的参数了。
TFrameClass=Class of TFrame
然后你可以这样创建你的对象,你传递的是TFrame的子类的类指针。
 
如果你的控件都直接放到你的Frame上的话,那么你的Frame在释放的时候,会把那些控件也释放掉。
 
后退
顶部