この人頭いいなと思ったエピソード

いつもお世話になってます。

さっそく質問ですが、
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のテキストボックスに文字を表示させることはできますか?
もしできるとしたら、どのような方法がありますか??

まだネットや本で調べ途中なので、もし何か参考ページがありましたら教えていただきたいです。


よろしくお願いします。

A 回答 (4件)

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



明後日のことを言ってたらごめんなさい。

この回答への補足

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

補足日時:2005/04/08 23:53
    • good
    • 0

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へ表示できるのではないでしょうか。
    • good
    • 0

#2です。


ごめんなさい。
>Private sub setTextBox(oText As Object)

>Public sub setTextBox(oText As Object)

じゃないといけないですね。すみません。
    • good
    • 0

#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を使うという手もあります。
    • good
    • 0

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