将对象添加到正在定义的对象的子容器中
ADD OBJECT to subcontainer of object being defined
我正在编写一个程序来生成 VFP 表单 class,上面有很多(每个 90 多个)标签和单选按钮。这是最简单的部分。 (是的,我知道有很多单选按钮,但这正是用户想要的)。
我们的应用程序中有多个 VCX,它们执行类似的操作,但没有那么多单独的控件。因此,与其花费大量时间拖放字段,并意识到我碰巧有一个包含所有字段、它们的选项和默认值的方便列表,我使用了 'View Class Code' 选项 Class 浏览器获取代码样例作为基础。然后我写了代码来生成一个包含我需要的所有片段的 PRG。
我的实际问题是 'View Class Code' 输出的代码似乎包含无效语法:
DEFINE CLASS form40 AS frmae
Height = 427
Width = 710
ScrollBars = 2
DoCreate = .T.
Visible = .T.
Name = "form40"
ADD OBJECT form40.cntouter.cntform40 AS cntctrls WITH ;
Top = 175, ;
Left = 2, ;
Visible = .T., ;
Name = "Cntform40"
ENDDEFINE
class frmae 是一个 class(来自 VCX),其中包含一个名为 'cntouter' 的容器。 Class cntctrls 是包含所有 labels/radio 按钮的容器。
问题是您显然不能在 DEFINE CLASS 命令中向成员添加对象。点分语法会导致语法错误。然而,这种技术被用在 'View Class Code' 输出中。
我怀疑我可以通过生成调用 ADDOBJECT() 将我的控件容器添加到 cntouter 的 Init 方法来解决这个问题,但我宁愿将它包含在 class 定义中。
"View Class Code" 选项不生成 运行 可用代码;它从来没有。
我的建议是创建一个具有您想要的外观的选项按钮 class。然后,使用您现有的列表来填充光标并编写代码来旋转它并将选项按钮添加到容器 class。
这里您需要了解的关键是您可以 运行 在影响表单的 IDE 或在表单设计器中打开的 class 或 Class 设计师。这就是建设者所做的。因此,与其生成基于代码的 class,不如使用代码创建视觉对象 class.
如果您想在代码中执行此操作,那么首先您不应该像 Tamar 已经指出的那样依赖视图代码。您可以在代码中执行任何表单及其控件(可能有一个或两个 activex 控件除外),但您需要了解如何编写容器类型控件的代码。首先,要从 class 库中添加 class,您需要指定其来源。即:
add object myContainer as MyBeautifulContainer from myClasslib.vcx
不行。相反,您需要像这样在代码中定义 class:
define class form40 as form
* ...
add object myContainer as MyContainer with ...
* ...
enddefine
define class myContainer as MyBeautifulContainer from myClasslib.vcx
* additiobnal code if any
enddefine
其次,您需要先创建内部控件,然后根据需要添加以创建最外层的对象。
在设计时,您可以转到命令 window,弹出代码 window:
modify command [enter]
然后使用 ASELOBJ() 函数,您可以获得对您正在设计的表单上的任何对象的引用。获得所需的参考后,您可以通过编程方式在该代码 window 中添加和排列对象,select 代码并执行 selection(擦除控件,更正代码并如果您第一次做错了,请重试)。那是临时的 "do and throw away" 样式生成器。
我正在编写一个程序来生成 VFP 表单 class,上面有很多(每个 90 多个)标签和单选按钮。这是最简单的部分。 (是的,我知道有很多单选按钮,但这正是用户想要的)。
我们的应用程序中有多个 VCX,它们执行类似的操作,但没有那么多单独的控件。因此,与其花费大量时间拖放字段,并意识到我碰巧有一个包含所有字段、它们的选项和默认值的方便列表,我使用了 'View Class Code' 选项 Class 浏览器获取代码样例作为基础。然后我写了代码来生成一个包含我需要的所有片段的 PRG。
我的实际问题是 'View Class Code' 输出的代码似乎包含无效语法:
DEFINE CLASS form40 AS frmae
Height = 427
Width = 710
ScrollBars = 2
DoCreate = .T.
Visible = .T.
Name = "form40"
ADD OBJECT form40.cntouter.cntform40 AS cntctrls WITH ;
Top = 175, ;
Left = 2, ;
Visible = .T., ;
Name = "Cntform40"
ENDDEFINE
class frmae 是一个 class(来自 VCX),其中包含一个名为 'cntouter' 的容器。 Class cntctrls 是包含所有 labels/radio 按钮的容器。
问题是您显然不能在 DEFINE CLASS 命令中向成员添加对象。点分语法会导致语法错误。然而,这种技术被用在 'View Class Code' 输出中。
我怀疑我可以通过生成调用 ADDOBJECT() 将我的控件容器添加到 cntouter 的 Init 方法来解决这个问题,但我宁愿将它包含在 class 定义中。
"View Class Code" 选项不生成 运行 可用代码;它从来没有。
我的建议是创建一个具有您想要的外观的选项按钮 class。然后,使用您现有的列表来填充光标并编写代码来旋转它并将选项按钮添加到容器 class。
这里您需要了解的关键是您可以 运行 在影响表单的 IDE 或在表单设计器中打开的 class 或 Class 设计师。这就是建设者所做的。因此,与其生成基于代码的 class,不如使用代码创建视觉对象 class.
如果您想在代码中执行此操作,那么首先您不应该像 Tamar 已经指出的那样依赖视图代码。您可以在代码中执行任何表单及其控件(可能有一个或两个 activex 控件除外),但您需要了解如何编写容器类型控件的代码。首先,要从 class 库中添加 class,您需要指定其来源。即:
add object myContainer as MyBeautifulContainer from myClasslib.vcx
不行。相反,您需要像这样在代码中定义 class:
define class form40 as form
* ...
add object myContainer as MyContainer with ...
* ...
enddefine
define class myContainer as MyBeautifulContainer from myClasslib.vcx
* additiobnal code if any
enddefine
其次,您需要先创建内部控件,然后根据需要添加以创建最外层的对象。
在设计时,您可以转到命令 window,弹出代码 window:
modify command [enter]
然后使用 ASELOBJ() 函数,您可以获得对您正在设计的表单上的任何对象的引用。获得所需的参考后,您可以通过编程方式在该代码 window 中添加和排列对象,select 代码并执行 selection(擦除控件,更正代码并如果您第一次做错了,请重试)。那是临时的 "do and throw away" 样式生成器。