Form1を使用して作成したアプリ、prg1.exeがあります。
Form2を使用して作成したアプリ、prg2.exeがあります。

Form1で開始ボタンを押下すると、prg2.exeを呼び出し、Form2が表示されます。(CreateObjectで)
prg2.exeの終了ボタンを押下するとprg2.exeがunloadして、呼び出し元のprg1.exeのForm1の画面が現れますが、
その時、Form1を再描画する処理を行いたいのですが。。

イベントを作って渡せばいいのでは?(RaiseEvent)と助言を頂いたんですが、
難しくてよく分かりません。どうか簡単で分かりやすい方法を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

RefreshではForm_Load()は呼ばれません。

イベントを使うのがよさそうです。
-------------------------------------------------------
Project1
<<Form1>>
Option Explicit
Private WithEvents obj1 As Project2.Class2
'Reload処理
Private Sub SubReload()
Text1.Text = "Recall"
End Sub
Private Sub Command1_Click()
Text1.Text = ""
Call obj1.Start
End Sub
Private Sub Form_Load()
Set obj1 = New Project2.Class2
SubReload
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set obj1 = Nothing
End Sub
'ActiveXからのイベント
Private Sub obj1_Closed()
SubReload
End Sub
-------------------------------------------------------
Project2 (ActiveX Exe)
<<Class2>>
Option Explicit
Public Event Closed()
Public Sub Start()
Dim obj As Form2
Set obj = New Form2
Set obj.Main = Me
obj.Show
Set obj = Nothing
End Sub
'Project1にイベント通知
Public Sub ClosedNotice()
RaiseEvent Closed
End Sub
<<Form2>>
Option Explicit
Public Main As Class2
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Main.ClosedNotice
End Sub
-------------------------------------------------------
2つのプロジェクトはグループプロジェクトにしないで、別プロジェクトにします。
Project1のメニュー「プロジェクト」「参照設定」でProject2を選択します。
テスト中は、プログラムを止めたつもりでもProject2.exeが残っている場合があるので、タスクマネージャーで監視が必要です。
    • good
    • 0
この回答へのお礼

何度も丁寧に教えて頂きありがとうございました。
今までActiveXイベント制御とかやった事なく、
あまり分かりやすい本もなくて困っていたのですが、
親切な解説でしっかり理解でき、目的のプログラムを作成する事ができました。

お礼日時:2009/05/15 19:05

CreateObject後にForm2を表示するために、何らかのメソッドを呼び出していると思いますが、メソッドからリターンするタイミングが prg2.exeの終了ボタンを押した時の場合は、呼び出し直後にMe.Refreshを行う。


----Form1側で----
set xx = CreateObject(...)
xx.hoge() 'Form2表示
Me.Refresh '自分を再描画

メソッドが終了を待たずにりターンしてしまう場合は、質問のようにイベントを使いますが、簡単にするには、
----Form2側で----
hogeにパラメータを1個追加 hoge(mainForm as Form)
終了直前に mainForm.Refresh を実行
----Form1側で----
xx.hoge(Me) 'Form2表示

この回答への補足

実際作っているものはもうちょっとややこしいのですが、
ちゃんと理解したいのでロジックを簡単にしました。
どこをどうすればいいのかもう一度教えて頂けますでしょうか。
(Project1.vbp) 標準EXE スタートアップForm1

<<Form1>>
Private obj1 As Object
'Reload処理
Private Sub SubReload()
Text1.Text = "Recall"
End Sub
Private Sub Command1_Click()
Text1.Text = ""
'呼び出し
If obj1 Is Nothing Then
Set obj1 = CreateObject("Project2.Class2")
End If
With obj1
Call .Start(Me)
Me.Refresh
End With
End Sub
Private Sub Form_Load()
SubReload
End Sub
-----------------------------------------------------
(Project2.vbp) Activex.EXE

<<Form2>>
Option Explicit
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Me.Refresh
End Sub
<<class2>>
Public obj2 As Object
Public Sub Start(Frm As Object)
If obj2 Is Nothing Then
Set obj2 = New Form2
End If
obj2.Show
End Sub

補足日時:2009/05/14 14:38
    • good
    • 0

>Form1で開始ボタンを押下すると、prg2.exeを呼び出し、Form2が表示されます


この時Form1の状態は?
非表示にしている、Form2の裏になる、アイコン化している、…
>呼び出し元のprg1.exeのForm1の画面が現れますが、
最初の質問に関連ですが、現れる前の状態は?
何がきっかけで現れるのですか?

VB6ですよね?

この回答への補足

失礼しました。VB6です。
Form1は、Form2の裏になっています。
Form1には、LOADしたら再描画するようにしているのですが、
上になっているForm2が閉じてForm1が表になるだけなので、
再描画がかからなくて困っているというわけです。
Form1からパラメータを渡してForm2で処理し、
Form2からForm1には何もパラメータを送る必要はありません。
よろしくお願いします。

補足日時:2009/05/14 10:34
    • good
    • 0

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


人気Q&Aランキング

おすすめ情報