画面イメージ |
||
親フォーム Name:Parent |
子フォーム1 Name:Child |
子フォーム2 Name:Info |
![]() |
![]() |
![]() |
| Startup Code |
Global PopMode as Integer '---- ModalFormの状態チェック用
Global PopForm as Short '---- Modal表示させるFormのIDを格納(必ずShort型)
Global theData as Integer '---- テスト用のデータを格納する変数
theData=10 '---- テスト用データの初期値
|
| 親フォームのBeforeコード |
Select Case PopMode '---- 現在のPopModeによって処理を振り分けます
Case 2 '---- PopMode=2
If PopForm=1005 Then '---- 現在表示中の子フォームを判定します
Call Child_Before() '---- ChildフォームのBeforeをCallします
End If
Exit Sub '---- このParent_beforeを抜けます
Case 1 '---- PopMode=1
Exit Sub '---- 処理せずにこのParent_Beforeを抜けます
End Select
'---- 以下はダミーデータをDummyListに追加する処理です
Dim I as Integer
DummyList.Clear
For I=1 to 200
DummyList.Add "TestData"+Format(I,"000"),,NoDisplay
Next
DummyList.Selected=1
|
PopMode:2の時は子フォームが表示される時のBeforeイベントになるので、 子フォームのBeforeイベント「Child_Before()」を呼び出しています その後、Child_Before()が終了すると戻ってきますが、 これ以上このイベントを実行するとおかしくなるので Exit Subでこのイベントを抜けています。 PopMode:1の時は子フォームから親フォームへ戻って来た時の処理です。 何もせずにExit Subしています。 なぜ、こんな事をしているのかというと... このExit Subに注釈をつけると良く判ると思います。 当然、子フォームのAfterイベントに何かイベントがあれば、 ここから飛ばしてやる必要があります。
| 親フォームのAfterコード |
Select Case PopMode '---- 現在のPopModeによって処理を振り分けます
Case 2 '---- PopMode=2
If PopForm=1014 Then '---- 現在表示中の子フォームを判定します
Call Info_After() '---- InfoフォームのAfterをCallします
End If
Exit Sub '---- 処理せずにこのParent_Afterを抜けます
Case 1 '---- PopMode=1
If PopForm=1005 Then '---- 現在表示中の子フォームを判定します
Selector.Text=Str(theData) '---- 子フォームで選択されたデータの値を/
'---- Selectorオブジェクトにセットします
End If
PopMode=0 '---- PopModeを0にクリアします
Exit Sub '---- このParent_Afterを抜けます
End Select
Selector.Text=Str(theData) '---- Selectorに値をセットします(初期処理)
DummyDate.Text=DateMMDDYY(ToDay()) '---- 現在の日付をDummyDateにセットします(初期処理)
|
PopMode:2の時は何もせずにこのイベントを抜けます。 なぜかというと... このExit Subに注釈を付けると判りますが、 子フォームに無いハズのSelectorオブジェクトが表示されたりしてしまいます。 PopMode:1の時は子フォームで選択した値を、Selectorオブジェクトにセットします。 その後、子フォームから親フォームへの復帰が終了したとしてPopModeを0にクリアしています。 そしてその後、余計な処理をしないようにExit Subしています。
| 親フォームのEventコード |
Select Case PopMode '---- 現在のPopModeによって処理を振り分けます
Case 2 '---- PopMode=2
If PopForm=1014 Then '---- 現在表示中の子フォームを判定します
Call Info_Event() '---- InfoフォームのEventをCallします
End If
Exit Sub '---- 処理せずにこのParent_Eventを抜けます
Case 1 '---- PopMode=1
Exit Sub '---- 処理せずにこのParent_Eventを抜けます
End Select
If GetEventType()=1 Then '---- 親フォーム上でのイベントを判定
If Asc(GetKey())=5 Then '---- メニューボタンがタップされたか判定
PopMode=2 '---- PopModeに2をセットします
PopForm=1014 '---- これから呼び出すModalフォームのIDをセットします
SysTrapSub 412,1,PopForm '---- APIの412を呼び出して、子フォームを表示します
End If
End If
|
|
親フォーム上のSelectorオブジェクトのイベント ※ココで子フォーム(Modalなフォーム)を呼び出します。 |
PopMode=2 '---- PopModeに2をセットします
PopForm=1005 '---- これから呼び出すModalフォームのIDをセットします
SysTrapSub 412,1,PopForm '---- APIの412を呼び出して、子フォームを表示します
|
| 子フォーム(Child)のBeforeコード(通常では呼び出される事が無い部分です) |
Dim I as Integer
DataList.Clear
For I=1 to 20
DataList.Add Format(I,"00"),,NoDisplay
Next
DataList.Selected=theData
|
|
子フォーム(Child)上のButtonイベント ※ココで子フォームから親フォームに戻ります |
If DataList.Selected=0 Then Exit Sub '---- リストが選択されていない場合はサブルーチンを抜けます
theData=Val(DataList.Text(DataList.Selected)) '---- リストの選択された値を変数theDataに保存します
PopMode=1 '---- PopModeに1をセットします
NextForm "Parent" '---- 親フォームを表示します。
|
| 子フォーム(Info)のAfterイベント(通常では呼び出される事が無い部分です) |
DrawBitmap 1016,12,18 '---- BitマップをChildフォームは貼り付けます
DrawChars "ソフト(笑)",10,40 '---- 文字列をChildフォームに貼り付けます
|
| 子フォーム(Info)のEventイベント |
If GetEventType()=2 Then '---- スクリーンのタップを判定
PopMode=1 '---- PopModeに1をセット
NextForm "Parent" '---- 親フォームを表示します
End If
|
| 親フォームオープン | 親フォームのBeforeイベント発生 |
| 親フォームのAfterイベント発生 | |
| 親フォームでイベント発生 | 親フォームのEventイベント発生 |
| 子フォームオープン | 親フォームのBeforeイベント発生 |
| 親フォームのAfterイベント発生 | |
| 子フォームでイベント発生 | 親フォームのEventイベント発生 |
| 親フォームオープン | 親フォームのBeforeイベント発生 | |
| 親フォームのAfterイベント発生 | ||
| 親フォームでイベント発生 | 親フォームのEventイベント発生 | |
| 子フォームオープン | 親フォームのBeforeイベント発生 | → 子フォームのBeforeイベントをCall |
| 親フォームのAfterイベント発生 | → 子フォームのAfterイベントをCall | |
| 子フォームでイベント発生 | 親フォームのEventイベント発生 | → 子フォームのEventイベントをCall |