几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从窗体。
理解子/父联系
这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如OWL或MFC)中很常见,但在VCL程序中却不常见。VCL不允许简单地指定一下属性就使一个窗体从属于另一窗体,要做到这一点还得付出点小小的劳动。你得告诉Microsoft Windows从属窗体是主窗体的子对象,在C++ Builder编程中一般趋于认为窗体是窗口,元件是子对象,实际上从Windows的观点来看,窗体和元件都是窗口。可以将任一窗口
(窗体和元件)指定为另一窗口的子对象,只要你暂时跳出VCL圈子。
更好的“鼠夹”
将一个窗体附属于一个主窗体的一个好处是你可以象设计任何其他从属窗体一样设计子窗体,就是说你创建一个新的窗体,在其上添加元件并书写这个窗体的代码。这样使得设计你的子窗体变得容易,并将所有操纵子窗体的代码集中在一个地方。
程序设计范例
先给出一些程序的背景,程序名叫PARENTING,有一个主窗体,主窗体的顶部和底部各有一个工具条(Tool Bar)和状态条(Status bar),除主窗体外,还有两个子窗体,一个叫TTableForm,用栅格显示ANIMAL.DBF数据表,ANIMAL表是C++ Builder带的数据库样本的一个表。另一个子窗体TChartForm用Tchart显示ANIMAL表。(如果你购买的C++ Builder是标准版则没有数据库元件)你可以通过点击菜单项或工具按钮来选择显示表单还是图形窗体,在你作出选择时,活动窗体被摧毁而被选窗体被显示,子窗体在主窗体的工具条下方、状态条上方的客户区显示,而且随主窗体大小变动而随时保持充满客户区。