フォームを閉じるには


transformer1958  2006-01-13 23:37:28  No: 93577

どうも、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をポストしたいのです。

これって出来ます?


いな  2006-01-13 23:41:44  No: 93578

まさかとは思いますが、

sub cmdEnd_Click()
  MsgBox "close!"
  call subA.unloadForm(me)
end sub

ってこと?


ドクロベ  2006-01-14 00:21:51  No: 93579

こんにちは
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

とでもすればよろしいんじゃないでしょうか?。
こうすればフォーム右上の×マークで閉じるときも、メッセージでますよ。


transformer1958  2006-01-14 00:43:44  No: 93580

いなさん、ドクロベさん、こんにちは。

処理の流れで説明すると、

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から関数を呼ぶことは無理なのでしょうか?


ひでらん  2006-01-14 01:24:53  No: 93581

いなさんと、ドクロベさんの内容を混ぜて、ちょっと改良すれば
意図した動きになりませんか?

例えば、こんな感じで・・・。
sub cmdEnd_Click()
    If MsgBox("フォームを閉じます。", 33, "MESSAGE") = vbOK Then
        Unload Me
    End If
end sub

ただ、ドクロベさんが言われている様に、このやり方だと、
フォーム右上の×マークで閉じる時はこの様に動きませんよ?


ひでらん  2006-01-14 01:29:59  No: 93582

あ、すみません。

>1,3,4,2,5,6,7の順に処理をさせたいのです。

これじゃ、この順番では動いてませんね・・・。
申し訳ないです。
また、早合点しちゃいました。


GOD  2006-01-14 01:32:26  No: 93583

案1)PostMessage APIを使用してユーザーメッセージを自アプリに送り、自前のウィンドウプロシージャで処理する。(unloadFormの呼び出し)

案2)タイマーを一つ用意し、3,4の間でタイマー起動。タイマー内でunloadFormの呼び出し。


transformer1958  2006-01-14 02:02:03  No: 93584

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が閉じた後に表示されます。
あってますでしょうか?


transformer1958  2006-01-14 02:04:48  No: 93585

すみません、MSGBOXは表示されなくなり、
アプリ自体終了してしまいました。


GOD  2006-01-14 03:01:26  No: 93586

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


はいこーん  2006-01-15 08:43:45  No: 93587

ごめん、ひとつ言っていい。

こ  ん  な  実  装  あ  り  え  ま  せ  ん・・・

やめろに1票。


  2006-01-16 20:20:55  No: 93588

はじめまして。
確かにこんな実装はありえませんが、業務ロジックの場合ユーザーの我侭に付き合うのは仕方ない事かと・・・

まず「メッセージを出したい」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 ←メッセージボックスに似せたフォームを作成  中身は考えてください。
元フォームからのパラメータか何かを受け取ってボタンを表示する等。


Seraph  2006-01-16 21:01:40  No: 93589

琴さんの提案に1票!

(ハズしてたらごめんなさいね)

何となくですけど、これって「スタートアップ画面(見出し画面)」の
逆のコトをやりたがっているように感じるんですけど、、、

お客さんは、終了画面が表示されて、その後ろでメイン画面が閉じていく
っていう絵をイメージしているのではないのかなぁ?

解決策でなくてスミマセン


ひでらん  2006-01-16 21:04:01  No: 93590

こんな方法じゃ無理なんでしょうか?

注)自分で下記仕様で作るスキルが無いです ^^;
  

1.メニューアプリ(自作のアプリを呼び出すアプリ)を作成して
  現行のアプリを呼び出す。
2.サブアプリ(現行アプリ)の終了ボタンが押された場合
  終了メッセージを表示?し、メニューアプリに連絡。
  (DDEとかソケットとか??)
3.メニューアプリから、サブアプリを終了する。
  (隠しボタン作っておいてPostMessageするとか??)

これで、順番通り?


初心者  2007-07-15 19:12:23  No: 93591

そのボタンがCommand1の場合

    Private Sub Form_Load()
         Command1.Caption = "Exit"
      End Sub
これでできると・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加