• ベストアンサー

ActiveX EXEとタイマーとVB

いつもお世話になってます。 さっそく質問ですが、 ActiveX EXE側にタイマーとテキストボックスを持っています。 VB側のフォームにテキストボックスがあります。 VBからActiveX EXEを起動させ、決まった時間(例えば5秒おき)にVBのテキストボックスに ある文字を表示させる、ということがしたいです。 条件として、 VB側の動きは、 (1)最初のActiveXを起動 (2)ActiveXのSetとNothingだけしかしない                   しかしません。 なので、ActiveXからは「RaiseEvents」はしません。 ActiveX側で、タイマーイベント部分に、 ActiveXのフォームのテキストボックス.text = "文字" set △△ = ActiveXのフォームのテキストボックス (△△は、ActiveXのフォームのテキストボックスとしてセットされています。) のように、プログラムしてみたのですが、 VB側のテキストボックスに表示できませんでした。 尚、VB側は、ActiveX以外の処理があるので、途中からActiveXを起動させることになります。 この条件で、VBのテキストボックスに文字を表示させることはできますか? もしできるとしたら、どのような方法がありますか?? まだネットや本で調べ途中なので、もし何か参考ページがありましたら教えていただきたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • umejas
  • ベストアンサー率28% (9/32)
回答No.1

ActiveX EXEを起動する際に、VB側のTextBoxのObjectを渡しておいて、タイマルーチン内でそのTextBox Objectを使って文字を表示させればいいのではないでしょうか。 明後日のことを言ってたらごめんなさい。

hemakozo
質問者

補足

ご回答ありがとうございます!! 多分umejas様のおっしゃる通り、VB側のテキストボックスを 渡せばよいのだと思うのですが、具体的なプログラムがどうも分からなくて。。。 すみませんが、教えていただけませんでしょうか?

その他の回答 (3)

  • umejas
  • ベストアンサー率28% (9/32)
回答No.4

piyo2000様より、Object型で渡さないとエラーになるとのご指摘がございましたので、ご参考下さい。 (piyo2000様、ご指摘ありがとうございます。) 私が考えていたのは、ActiveX EXE側で  Private vbTextObj As Object  Public Property Let TextObject(ByVal newValue As Object)    Set vbTextObj = newValue  End Property などとしておいて、VB側でActiveX EXEを起動(New)後に  (ActiveX EXE Object名).TextObject = Text1 としておけば、ActiveX EXE側のタイマルーチン内で  (宣言先).vbTextObj.Text = ~ とすることで、ActiveX EXE側からVB側のTextBoxへ表示できるのではないでしょうか。

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.3

#2です。 ごめんなさい。 >Private sub setTextBox(oText As Object) は >Public sub setTextBox(oText As Object) じゃないといけないですね。すみません。

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

#1さんの方法を試してみましたが、TextBoxを渡すとコンパイルエラーになりますね(^^; # Objectで渡せばいいですけど。 >具体的なプログラムがどうも分からなくて ActiveX Exeのコントロールクラス(Newするときに指定するクラス)に Private m_oText As Object ... Private sub setTextBox(oText As Object) ' TextBoxではコンパイルエラー set m_oText = oText End sub のように、ActiveX Exe側に標準ExeのTextBoxオブジェクトを渡すメソッドを定義しておきます。 また、ActiveX Exeの(Timerがある)フォームに Public Event TimeUp() とイベントを定義して、Timerイベントでは Private Sub Timer1_Timer() RaiseEvent TimeUp End Sub とでもしておきます。 そしてコントロールクラスでWithEventsでフォームオブジェクトを定義し、Newした直後にsetTextBox()を呼びます。 private sub oForm_TimeUp() 'このプロシージャはWithEventsによるイベント if Not (m_oText is nothing) then m_oText.Text = Now '現在時刻 end if end sub のように書けばいいのでは。 この方法はTimerイベントをTimeUpイベントに置き換えているだけですので(コントロールクラスでTimerイベントを取得するため)、少々まどろっこしいかも。 コントロールで受け取ったm_oTextをそのままフォームのメソッドなりプロパティ変数なりに入れて表示処理自体はTimerイベントでやってもいいですね。 Object渡しが嫌ならhwndを渡してSetText()APIを使うという手もあります。

関連するQ&A

専門家に質問してみよう