どうも、transformer1958です。
VB6での質問です。
あるひとつのフォームがあります。
そのフォームには「終了」ボタンがあり、
クリックをすると画面を閉じるという、処理をしています。
sub cmdEnd_Click()
unload me
end sub
この処理を以下のように変えてみました。
sub cmdEnd_Click()
call subA.unloadForm(me)
MsgBox "close!"
end sub
subA.bas
public sub unloadForm(frmObj as Form)
unload frmObj
end sub
これを実行すると、画面が閉じた後にMSGが表示されます
(当然ですが)。
やりたい事は、MSGが表示された後に画面を閉じる。
つまり、subA.unloadFormをポストしたいのです。
これって出来ます?
まさかとは思いますが、
sub cmdEnd_Click()
MsgBox "close!"
call subA.unloadForm(me)
end sub
ってこと?
こんにちは
sub cmdEnd_Click()
unload me
end sub
はそのままにしておいて、フォームのQuerryUnloadイベントに
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("フォームを閉じます。", 33, "MESSAGE") = vbCancel Then
Cancel = 1
End If
End Sub
とでもすればよろしいんじゃないでしょうか?。
こうすればフォーム右上の×マークで閉じるときも、メッセージでますよ。
いなさん、ドクロベさん、こんにちは。
処理の流れで説明すると、
1 sub cmdEnd_Click()
2 call subA.unloadForm(me)
3 MsgBox "close!"
4 end sub
5 public sub unloadForm(frmObj as Form)
6 unload frmObj
7 end sub
1,2,5,6,7,3,4の順を
1,3,4,2,5,6,7の順に処理をさせたいのです。
4のend subが終わった後、
2から関数を呼ぶことは無理なのでしょうか?
いなさんと、ドクロベさんの内容を混ぜて、ちょっと改良すれば
意図した動きになりませんか?
例えば、こんな感じで・・・。
sub cmdEnd_Click()
If MsgBox("フォームを閉じます。", 33, "MESSAGE") = vbOK Then
Unload Me
End If
end sub
ただ、ドクロベさんが言われている様に、このやり方だと、
フォーム右上の×マークで閉じる時はこの様に動きませんよ?
あ、すみません。
>1,3,4,2,5,6,7の順に処理をさせたいのです。
これじゃ、この順番では動いてませんね・・・。
申し訳ないです。
また、早合点しちゃいました。
案1)PostMessage APIを使用してユーザーメッセージを自アプリに送り、自前のウィンドウプロシージャで処理する。(unloadFormの呼び出し)
案2)タイマーを一つ用意し、3,4の間でタイマー起動。タイマー内でunloadFormの呼び出し。
GODさん、こんにちは。
案1)PostMessage APIを使用して...
このAPIを使ってみました。
1 sub cmdEnd_Click()
2 call subA.unloadForm(me)
3 MsgBox "close!"
4 end sub
5 public sub unloadForm(frmObj as Form)
6 Call PostMessage(frmObj.hWnd, WM_CLOSE, 0, 0)
7 end sub
これでもMSGBOXが閉じた後に表示されます。
あってますでしょうか?
すみません、MSGBOXは表示されなくなり、
アプリ自体終了してしまいました。
案1)ですが、これはサブクラス化して自分でウィンドウプロシージャを実装しなければなりません。(サブクラス化についてはぐぐって)
1 sub cmdEnd_Click()
2 MsgBox "close!"
3 call PostMessage(Me.hwnd, &H8001&, 0, 0)
4 end sub
5 public sub unloadForm(hWnd as Form)
6 ウィンドウハンドルからフォームオブジェクトを求めてUoloadする
7 end sub
8 Public ウィンドウプロシージャ関数
9 if 受信メッセージ = &H8001& Then
10 call unloadForm(ウィンドウハンドル)
11 Endif
12 End Function
上記の 3 でウィンドウに対して &H8001& (仮のunloadForm関数呼び出しコマ
ンド)のメッセージを送るように記載してます。
なので自分で実装したウィンドウプロシージャで &H8001& メッセージを受けたら
unloadForm関数を呼び出すように記載する必要があります。
#2と3を入れ替えるとMsgBox時にシステム側に処理が戻るみたいなのでメッセー
#ジキューに溜まっているメッセージを処理してしまうみたい。^^;
#unloadFormの引き数にフォームオブジェクトは記載できない。
#(For Each Obj In Formsとかでハンドルからオブジェクトを求めればOK)
ごめん、ひとつ言っていい。
こ ん な 実 装 あ り え ま せ ん・・・
やめろに1票。
はじめまして。
確かにこんな実装はありえませんが、業務ロジックの場合ユーザーの我侭に付き合うのは仕方ない事かと・・・
まず「メッセージを出したい」or「メッセージボックスを表示したい」で処理が変わるのでは?
メッセージボックスは基本的にOKなどのアクションが実行されるまで処理が止まります。
メッセージを表示したいだけであれば擬似MsgBoxで対応でしょうか?
sub cmdEnd_Click()
frmMsgBox.lblMsg.Caption = "Close!"
frmMsgBox.show vbModeless
call subA.unloadForm(me)
end sub
subA.bas
public sub unloadForm(frmObj as Form)
unload frmObj
end sub
frmMsgBox ←メッセージボックスに似せたフォームを作成 中身は考えてください。
元フォームからのパラメータか何かを受け取ってボタンを表示する等。
琴さんの提案に1票!
(ハズしてたらごめんなさいね)
何となくですけど、これって「スタートアップ画面(見出し画面)」の
逆のコトをやりたがっているように感じるんですけど、、、
お客さんは、終了画面が表示されて、その後ろでメイン画面が閉じていく
っていう絵をイメージしているのではないのかなぁ?
解決策でなくてスミマセン
こんな方法じゃ無理なんでしょうか?
注)自分で下記仕様で作るスキルが無いです ^^;
1.メニューアプリ(自作のアプリを呼び出すアプリ)を作成して
現行のアプリを呼び出す。
2.サブアプリ(現行アプリ)の終了ボタンが押された場合
終了メッセージを表示?し、メニューアプリに連絡。
(DDEとかソケットとか??)
3.メニューアプリから、サブアプリを終了する。
(隠しボタン作っておいてPostMessageするとか??)
これで、順番通り?
そのボタンがCommand1の場合
Private Sub Form_Load()
Command1.Caption = "Exit"
End Sub
これでできると・・・
ツイート | ![]() |