我在vfp中创建了一个无模式窗体,并将showwindow属性设置为'0-in screen'。我在窗体中放置了一个按钮,并在click方法中添加了'DO Form Form2'。 Form2再次是一个无模式窗体,showwindow属性设置为'0-in screen'。我运行第一个表单,然后单击按钮。出现第二种形式。问题是我似乎无法setfocus到/激活第一个表单,除非我先关闭第二个表单。它是否假设以这种方式工作?如果有,为什么?这种情况有没有解决办法?
实际上,我的情景有点复杂。我打开form1.If我单击form1中的一个按钮,form2显示。两个窗体都在_screen中。如果我单击form1中的另一个按钮,Form3显示,在form2内。我当然希望这是可能的。 :)
感谢您帮助我。
答案 0 :(得分:1)
你可能遇到的只是两个窗口大小相同(或者表格2更大)并且只是物理重叠形式1 ......除非两种形式都设置为最大化模式,这需要全屏观看区域。
那就是说,默认情况下,当VFP运行一个表单时,它基本上有一个与你的表单名称相关的变量名称...即:“Form1”和“Form2”如果这些是你的实际表单的名称(我怀疑,但可能是为了测试目的)。
因此,现在您正在运行示例,显示表单1,单击按钮,显示表单2。您可以在表单2上有一个按钮,例如“返回到表单1”(而不是重新运行表单1的另一个实例)。在点击事件中,您可以执行以下操作
if wexist( "form1" )
activate window form1
endif
同样,在您的主窗体中,如果您想再次返回到表单2,但又不想重新创建已打开表单的第二个实例,则可以使用类似
的代码。if wexist( "form2" )
*/ Show the already loaded form
activate window form2
else
*/ Not loaded yet, do so now
do form form2
endif
至于在另一种形式中显示一种形式,你可以,但它们有时会有点痛苦而且只是一些习惯......它们被称为“Formsets”。为此,您基本上将所有表单预先构建为一个整体“formset”。首先创建一个表单。然后,从“FORM”菜单项中,单击菜单选项“Create Form Set”。它将为您创建父级“formset”级别,并将表单本身移动到子级位置。然后,从“表单”菜单中,您可以再次选择“添加新表单”,并根据需要添加任意数量。请注意,在执行此操作时,它会构建所有表单,而不仅仅是基于您显式执行“执行表单”调用以启动下一个表单。你可以设置每个窗口的标题,移动它们的物理位置等等...保存并运行表格...然后你可以根据需要显示/隐藏......但是,再次,可能会很棘手。
你可能尝试的另一个替代方法是使用“容器”,并为自己建立一个类库。容器只不过是一个可以有其他控件的控件。好处是你可以构建一次并将其用作表单的一部分,或者根据需要在多个表单上使用它,而不必继续调用相同的第一个表单。例如,用于地址信息的容器。您可以为公司,地址1,地址2,城市等设置标签/文本框并保存。现在,您希望发票上有发货单和付款单。您可以在同一表单上使用相同“布局”容器类的两个实例。它们看起来和操作相同,你只需将它们的“控制源”绑定到各自的字段。
通过这样做,您还可以使用“选项卡式页面”并构建与一个“页面”关联的所有内容的容器。然后将该容器放在页面而不是所有控件上,只需一个表单...预先花费更多时间,但下游管理也是一个好处。
答案 1 :(得分:-1)
如果你有两种形式modedeless你可以尝试使用第二种形式制作一个带有prg的应用程序来介绍paremeter语句。 样品:** 在第一种形式的方法中呼叫第二:**
LOCAL cvar
cvar="F_"+ALLTRIM(TRANSFORM(SYS(3)))
PUBLIC &cvar
&cvar=THISFORM && instance the first form in a public var (dont forget relese this in unload methode)
DO secondform.app WITH cvar
thisform.hide
以第二种形式prg main:
PARAMETERS xparform
IF PARAMETERS() = 1
DO FORM secondform WITH xparform
endif
以第二种形式。
创建属性以包含参数
在init方法中:
PARAMETERS xparsecod
IF PARAMETERS() > 0
IF PARAMETERS() = 1
thisform.formfirst=xparsecod
endif
endif
卸载:
IF !EMPTY(thisform.formfirst)
LOCAL cprince,oprince
cprince=ALLTRIM(thisform.formfirst)
oprince=&cprince && instanciate the firsform object
IF TYPE("oprince")=="O"
oprince.show && show the first form
oprince=null
ENDIF
ENDIF
thisform.Release
这迫使第二种形式在完成后显示第一种形式 别忘了发布public var
尝试类似:
if type("namevar") <> "U"
namevar=null
release namevar
endif