vb6.0においてのフォームについて教えてください。

例として「Form1」という名前のフォームがあるとします
その「Form1」を閉じるためのコマンドを誰か教えていただけないでしょうか?

ちなみに「Form1」はアクティブになっている時、いない時両方の場合が
考えられるのですが、関係あるのでしょうか??

皆様宜しくお願いします。

A 回答 (10件)

itohhさんの回答にちょっとだけ補足します。



他のアプリケーションであっても、自分自身のアプリケーションであってもメッセージボックスの制御は基本的に可能です。

まず、他アプリのメッセージボックスの場合はFindWindowでメッセージボックスを検索し、ダイアログのハンドルを得るのは必須です。

↓これについて補足
>SendMessage関数でWM_CLOSE

それ以外に情報が必要です。メッセージボックスの中に「はい」「いいえ」ボタンがあって、「いいえ」ボタンを押したようにして閉じたいのであれば、「いいえ」ボタンのハンドルとvbNo定数値が必要です。
それらをSendMessageにてWM_CLOSEと一緒に送らないと、WINDOWS自体が不安定になります。
    • good
    • 0
この回答へのお礼

的確なアドバイスありがとうございます
早速試してみたいと思います。

お礼日時:2001/12/03 19:48

あの、2回間違いと、申し訳ないのですが、TimerなどのIntervalは


プロパティウィンドウじゃないと効果ありませんでした。
下のコードのスペースが3つ、ついてるところは消したほうが
効率いいかもしれません。

Private Sub Timer1_Timer()
   Timer1.Interval = 1000
End
End Sub

Private Sub Timer2_Timer()
   Timer2.Interval = 1000
Unload Form1
Form2.Show
End Sub
    • good
    • 0

すみません!!下のコードに間違いがありました。

Label2は下記のコードを使ってください。
間違いの点は、このコードは、本来Timer2を
アクティブにするのに、Timer1をアクティブにしていました。
大変ご迷惑おかけいたしました。

Private Sub Label2_Click()
Label2.Caption = "Form2開く"
Timer2.Enabled = True
End Sub
    • good
    • 0

小4のkunpaです。


 単に、Form1を終了して、別のForm(例として、Form2)を開くのであれば、
「Unload Form1
Form2.Show」と書けば、Form1を閉じて、Form2を開くことができます。
これを利用すれば、タイマーコントロールで設定できます。
また、ソフトを終了するなら、「End」というコードを書き込めば、
ソフトが終了します。
 なので、Formがアクティブになっていない時も、タイマーコントロール
(例:Interval 1000=1秒)のコードに[Unload Form1
                  Form2.Show]または[End]のコードを
書き込んでしまえば、Formがアクティブでなくても、タイマーで設定した
Intervalの時間になれば、UnloadまたはEndします。
 タイマーのEnabledをFalseにして、LabelをクリックしたらEnabledをTrueに
しても面白いです。
 サンプルコードです。Labelを、
「終わり(Label1)」と「Form2開く(Label2)」を用意して、終わりをクリックすると、1秒後に終わって、Form2開くをクリックすると1秒後に閉じるコード
です。Timerのコードを抜けば、簡単なプログラムに使えます。
CaptionとIntervalはプロパティウィンドウで設定してもいいです。
Timer1とTimer2のEnabledはプロパティウィンドウで
Falseにしておいてください。
参考になれば幸いです。

Private Sub Label1_Click()
Label1.Caption = "終わり"
Timer1.Enabled = True
End Sub

Private Sub Label2_Click()
Label2.Caption = "Form2開く"
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Timer1.Interval = 1000
End
End Sub

Private Sub Timer2_Timer()
Timer2.Interval = 1000
Unload Form1
Form2.Show
End Sub
    • good
    • 0

こんにちは。

itohhといいます。

先のアドバイスちょっと間違いがありました、すみません。

>自分自身のメッセージボックスを制御するのは基本的に出来ないと思った方がよいですよ。
正しくは、
自分自身以外(他のプロセス)のメッセージボックスを制御するのは基本的に出来ないと思った方がよいですよ。
    • good
    • 0
この回答へのお礼

なるほど、やっぱり自分自身以外のMSGBOXの制御は
難しいんですね..ためになりました。
ありがとうございました

お礼日時:2001/12/03 19:50

こんにちは。

itohhといいます。

>プログラム上であるソフトを起動するとメッセージが立ち上がって
>くるので、そのメッセージボックスを閉じたいのですが...
自分自身のメッセージボックスを制御するのは基本的に出来ないと思った方がよいですよ。

例えば、そのメッセージボックスを閉じてしまった場合、起動したソフトまで終了してしまう
ということはないですか?

それでも、OKでしたらば。
1.FindWindow関数でWindowハンドルを取得する。
2.そのWindowハンドルにSendMessage関数でWM_CLOSEを送信する。
これで、閉じてくれるとは思いますが、先にも説明したようにソフト自体が終了して
しまうかもしれません。
    • good
    • 0

あ、ゴメン。

「閉じ」たかったのね。勘違いしてたので最初の回答は無視して下さい。
ARCさんありがとうございます。
    • good
    • 0

少し蛇足になりますが、#1でannie_xさんがお書きになった「Hide」はフォームを「隠す」為のコマンドで、「閉じる」とは意味合いが異なります。



フォームを隠しただけでは、まだメモリ上にフォームの内容が保持されています。
(つまり、Form1上のテキストボックスに何か入力したあと、
Form1.Hide
Form1.Show
としても、入力した内容が残った状態でフォームが再表示されます。

Unload Form1だと、メモリ上からもフォームを削除してしまいますので、
Unload Form1
Form1.Show
とすると、Form1上のテキストボックスの内容は初期化されます。



#annie_xさま、つっこんじゃってスミマセン。この文章は回答に正確を期すために投稿しました。個人攻撃の意図は全く無いことをご理解ください。
お気を悪くなさらないで下さいね(^^;
    • good
    • 0

UnLoad Form1


をお試しください。
Form1のアクティブ/非アクティブに関係なく、Form1を閉じてくれます。
    • good
    • 0

>「Form1」を閉じるためのコマンド



Form1.Hide です。

>「Form1」はアクティブになっている時、いない時両方の場合が考えられるのですが

具体的にコードを見ないとなんともいえませんが、普通は関係ないですよ。

ちなみに表示させるときは Form1.Show です。
このあたりフォームのヘルプから、「メソッド」を見てみると書いてあると思います。

この回答への補足

プログラム上であるソフトを起動するとメッセージが立ち上がって
くるので、そのメッセージボックスを閉じたいのですが...

そのメッセージは最小化の状態でタイトルバーに”Mail”と
かかれた状態で立ち上がってくるので、

オブジェクトの名前が"Mail"なのだと思って、

Mail.hide

としたら”オブジェクトが必要です”とエラー表示されてしまいました。

このメッセージボックスをプログラム上で閉じるように制御する方法
を知りたいのです。

説明が足りなくて申し訳ありません。

補足日時:2001/12/03 00:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qモーダルフォームとモードレスフォーム

この二つの違いはどういう違いがあるのでしょうか?
どなたか教えてください。お願いいたします。

Aベストアンサー

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォーム2が表示されたあと
にメッセージボックスが表示されます。
つまりCommand1はShowのあとのロジックを、フォーム2が閉じるまで、未処理のままとなるわけです。

画面上はフォーム2が前面、フォーム1が背面になるどちらも似たような表示に見えますが、
Command1の場合はフォーム1はフォームをクリックしても、フォーカスを持たない
Command2の場合はフォーム1はフォームをクリックすると、フォーカスを持ちえる
という点も違います。


簡単にまとめると、
vbModalの場合はフォーム2だけに作業処理を固定させたい時に使用します。vbModelessの場合はフォーム2はポップアップ的な使用方法の時に使います。

実際にフォーム1とフォーム2を作成し、フォーム1に二つのコマンドボタンを用意して、以下のコードを貼り付けて見てください。

Private Sub Command1_Click()
Form2.Show vbModal, Me
MsgBox "vbModal"
End Sub

Private Sub Command2_Click()
Form2.Show vbModeless, Me
MsgBox "vbModeless"
End Sub

Command1でもCommand2でもフォーム2が開きます。しかしMsgBoxが表示するタイミングが変わってるはずです。
Command1の場合はフォーム2が閉じたあと
Command2の場合はフォー...続きを読む

QVBプログラムの終了

VB6.0で作成した実行ファイル(exe)を終了させても
タスクマネージャのプロセスに残ってしまい、
もう一度プログラムを起動することができません。
(プログラムで二重起動防止の処理をしています)

このプログラムをVBのラインタイムが入っていない
マシンで動かしているのですが、
やはりそれが問題なのでしょうか?
それとも別に何か原因があるのでしょうか?

Aベストアンサー

正常動作ならば、終了させれば プロセスも閉じられます。

VBのランタイムが 入ってない場合、異常終了で、ちゃんと終了してないと思われます。

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

Q他のフォームから別のフォームのサブルーチンを呼び出す

例えばフォームAからフォームBのCommand1_clickというサブルーチンを呼び出そうとすればどのようにすればいいんでしょうか?

私は

Call FormB!Command_click

とフォームAに書きましたがうまくいきませんでした

Aベストアンサー

Command1のClickイベントプロシージャの

Private Sub Command1_Click()
'(・・処理・・)
End sub



Public Sub Command1_Click()
'(・・処理・・)
End sub

に書き換えて下さい(「Private」→「Public」)。
こうすることにより、他のフォームから呼ぶことが可能になります。
ただしこのやり方は奨励しません(※後述)

また、呼び出し方も間違ってます。

Call FormB!Command_click

ではなく、

Call FormB.Command_click

として下さい(「!」→「.」)。

※自動生成するイベントプロシージャの構文を直接いじるのはあまり奨励しません(特に問題は発生しませんが)。
直接イベントプロシージャを呼ぶのではなく、下記のようにしてみてはいかがでしょう。

※下記をFormBに記述

Private Sub Command1_Click()
Call subCommand1Click
End sub

Public Sub subCommand1Click()
'(・・処理・・)
End sub

FormAではこのように呼ぶ
Call FormB.subCommand1Click

Command1のClickイベントプロシージャの

Private Sub Command1_Click()
'(・・処理・・)
End sub



Public Sub Command1_Click()
'(・・処理・・)
End sub

に書き換えて下さい(「Private」→「Public」)。
こうすることにより、他のフォームから呼ぶことが可能になります。
ただしこのやり方は奨励しません(※後述)

また、呼び出し方も間違ってます。

Call FormB!Command_click

ではなく、

Call FormB.Command_click

として下さい(「!」→「.」)。

※自動生成...続きを読む

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

Q上下の位置揃えについて

オブジェクトの TEXTやLABELで文字を左揃え、中央揃え、右揃えはALIGNMENTプロパティを指定しますが、上下の位置指定はどのようにすれば良いか教えてください。
いつも上揃えになってしまいます。
よろしくお願いします。

Aベストアンサー

色つきのラベルなのに文字位置が上詰で気になる!っていうときは
姑息な手段ですが、背景を透明に設定したラベルを
上に重ねると好きな位置に文字を表示できます。
テキストボックスの場合は下のテキストボックスを
Enable = Falseにしておき、上に重ねる方を
フラットにして実線を消しておくとそれらしくなります。
でもオブジェクトがたくさんあるとめんどくさいですよね…


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング