在vfp中切换无模式

时间:2012-05-28 05:23:08

标签: visual-foxpro

我在vfp中创建了一个无模式窗体,并将showwindow属性设置为'0-in screen'。我在窗体中放置了一个按钮,并在click方法中添加了'DO Form Form2'。 Form2再次是一个无模式窗体,showwindow属性设置为'0-in screen'。我运行第一个表单,然后单击按钮。出现第二种形式。问题是我似乎无法setfocus到/激活第一个表单,除非我先关闭第二个表单。它是否假设以这种方式工作?如果有,为什么?这种情况有没有解决办法?

实际上,我的情景有点复杂。我打开form1.If我单击form1中的一个按钮,form2显示。两个窗体都在_screen中。如果我单击form1中的另一个按钮,Form3显示,在form2内。我当然希望这是可能的。 :)

感谢您帮助我。

2 个答案:

答案 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