0

vfpでモードレスフォームを作成し、showwindowプロパティを「0-inscreen」に設定しました。フォームにボタンを配置し、クリックメソッドに「DOFormForm2」を追加しました。Form2もモードレスフォームであり、showwindowプロパティは「0-inscreen」に設定されています。最初のフォームを実行して、ボタンをクリックしました。2番目のフォームが表示されます。問題は、最初に2番目のフォームを閉じない限り、最初のフォームにフォーカスを設定/アクティブ化できないように見えることです。そのように機能することを想定していますか?はいの場合、なぜですか?この状況の回避策はありますか?

実際、私のシナリオはもう少し複雑です。form1を開きます。form1のボタンをクリックすると、form2が表示されます。両方のフォームが_screenにあります。form1の別のボタンをクリックすると、form2の中にForm3が表示されます。これが可能であることを願っています。:)

助けてくれてありがとう。

4

2 に答える 2

1

遭遇する可能性があるのは、2つのウィンドウが同じサイズ(またはフォーム2の方が大きい)であり、フォーム1が物理的に重なっていることです...両方のフォームが全画面表示領域を占める最大化モードに設定されていない限り。

とは言うものの、デフォルトでは、VFPがフォームを実行するとき、基本的にフォーム名に相関する変数名があります...つまり、実際のフォームの名前である場合は「Form1」と「Form2」です(これは疑わしいですが、テスト目的の場合があります)。

これで、サンプルを実行しています。フォーム1が表示され、ボタンをクリックすると、フォーム2が表示されます。(フォーム1の別のインスタンスを再実行するのではなく)「フォーム1に戻る」などのボタンをフォーム2に配置できます。そのクリックイベントでは、次のことができます

if wexist( "form1" )
   activate window form1
endif 

同様に、メインフォームで、フォーム2に戻りたいが、すでに開いているフォームの2番目のインスタンスを再作成したくない場合は、次のようなコードを使用できます。

if wexist( "form2" )
   */ Show the already loaded form
   activate window form2
else
   */ Not loaded yet, do so now
   do form form2
endif 

あるフォームを別のフォームの中に表示することはできますが、少し面倒で慣れている場合もあります...これらは「フォームセット」と呼ばれます。そのためには、基本的に、すべてのフォームを1つの全体的な「フォームセット」に事前に構築します。単一のフォームを作成することから始めます。次に、「FORM」メニュー項目から、「CreateFormSet」のメニューオプションをクリックします。親の「フォームセット」レベルが作成され、フォーム自体が子の位置に移動します。次に、「フォーム」メニューから「新しいフォームの追加」を再度選択し、必要な数だけ追加できます。これを行うと、次のフォームを起動するために「do form」呼び出しを明示的に実行するだけでなく、すべてのフォームが作成されることに注意してください。ウィンドウごとにタイトルを設定したり、それらの物理的な位置を移動したりすることができます...フォームを保存して実行します...

あなたが試みるかもしれないもう一つの代替案は、「コンテナ」を使って作業し、自分でクラスライブラリを構築することです。コンテナは、他のコントロールを持つことができるコントロールに他なりません。利点は、一度作成してフォームの一部として使用したり、同じ最初のフォームを呼び出し続けることなく、必要に応じて複数のフォームで使用したりできることです。たとえば、住所情報のコンテナ。Company、Address1、Address2、Cityなどのラベル/テキストボックスがあり、それを保存できます。ここで、出荷先と請求先が記載された請求書が必要です。同じフォームで同じ「レイアウト」コンテナクラスの2つのインスタンスを使用できます。それらは同じように見え、同じように動作します。「コントロールソース」をそれぞれのフィールドにバインドするだけです。

これにより、「タブ付きページ」の使用を開始し、1つの「ページ」に関連付けられているすべてのもののコンテナーを作成することもできます。次に、すべてのコントロールを個別に1つのフォームにまとめるのではなく、そのコンテナをページに配置します...事前に時間がかかりますが、下流の管理にもメリットがあります。

于 2012-05-28T12:58:54.373 に答える
-1

モードレスの 2 つのフォームがある場合は、パラメーター ステートメントを仲介する prg を使用して、2 番目のフォームで 1 つのアプリを作成してみてください。sample:** 最初のフォーム メソッドで 2 番目のメソッドを呼び出す:**

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

2 番目の形式 prg main :

PARAMETERS xparform

IF PARAMETERS() = 1

      DO FORM secondform WITH xparform

   endif 

第二形態で。

パラメータを含むプロパティを作成します

初期化メソッドで:

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

これにより、完了後に最初のフォームを表示するように 2 番目のフォームが強制されます public var を解放することを忘れないでください

次のようなものを試してください:

if type("namevar") <> "U"

   namevar=null

   release namevar

endif 
于 2014-08-31T01:34:56.083 に答える