ID登録せずに、無料で質問できる♪ 教えて!gooアプリ>>

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

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

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


よろしくお願いします。

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

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に関連する人気のQ&A

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

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

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

QActiveX DLL と ActiveXコントロールの違い

VB6で開発をしています。
複数のEXEファイルを使用するシステムです。
各EXEファイルの共通のモジュールをライブラリ化しようと思っています。

これは [ActiveX DLL] 又は、[ActiveXコントロール] のどちらでも実現できると思うんですが、どちらで作成した方が良いのでしょうか?

それぞれのメリット、デミリットを教えて下さい。

Aベストアンサー

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定義)を
As Object
として、CreateObject("DLL定義")のように行うと、引数が一緒ならEXEはリコンパイルしないでもいいです。実例として、エクセルを参照設定して[as Excel]と宣言していたら、その参照設定に対応したExcelしか操作できませんが、[As Object]と[CreateObject("Excel.Application")]とすると、EXCEL95~XPまで扱えます。
不便なのは、タイプライブラリが未設定になるので、Excelの各プロパティ/メソッドを知らないといけないし、Excel固有の定数が宣言もされてないので、自分で定数値を調べなければいけません。でもバージョンの違いを気にしないでいけるのは、非常に便利です。


速さのことを言ったら、当然DLLが早いです。
OCXはプロパティにRight/Leftなどを持っています。変えて言うと実体を持っていると言うことです。非表示にしていても実体をもっています。DLLはインスタンスは生成されますが、OCXだって生成されるので、表示しないで使用するなら、OCXの意味があまりありません。


んで、私(個人)の考えとしては、、、
※オリジナルボタンなどの、画面上必要ならOCX
  理由:画面に必要だから
※画面に表示を行う必要がなくても、配布する気ならOCX
  理由:配布先のユーザが扱いやすい
※そうじゃなければDLL
  理由:OCXにする理由が見つからないから


余談です。
私はいつもCommonコントロールは使用しません。
  理由:簡単なAPIでも実現できるのに、機能が少ないCommonコントロールを追加して、EXEの容量を大きくしたくないから

混乱させますw

私も最近まで知らなかったのですが、任意のタイミングでOCXもインスタンスの生成が可能みたいです。
WinSockを張らずにPGを書き上げ、WinSockコントロールを使用する方法がわたしの利用しているメーリングリストに出ておりました。
その結末は、「あまり公開はされてはいないけど、ほとんどのコントロールはEXEにしてからOCXとして取り込むことができる」ということです。


ActiveXDLLも参照設定をしなければ、DLLバージョンが違っても大丈夫です。
ただし宣言が
As HogeHoge←(DLLの定...続きを読む

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 カウントダウンタイマーの作り方

1か月前からVBの勉強を始めたものです。

下記のように、カウントダウンタイマーを作成したいですが
やり方がわからないです。

1 From構成:
  textBox1(時刻指定用),label1(カウントダウン表示用)、Button1(スタート用)

2 使用:
  textBox1に "**:**"形で指定したい時間と分を入力して、Button1を押したら、label1内に今の時刻からのカウントダウンタイマーを表示される

3 カウントダウンが0になったら、何とかの形で知らせてくれる。
 msgboxでもかまいません。

ネットでも調べましたが、自分のニーズに合わせるものを見つかりませんでした。~@~

どうぞ、よろしくお願い致します。

Aベストアンサー

Dim dTime As DateTime

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
dTime = TextBox1.Text
Timer1.Interval = 1000
Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

dTime = dTime.AddSeconds(-1)

TextBox2.Text = dTime

If dTime = "0:0:0" Then
Timer1.Enabled = False
MessageBox.Show("終了")

End If

End Sub


こんなんでどうでしょうか?

Dim dTime As DateTime

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
dTime = TextBox1.Text
Timer1.Interval = 1000
Timer1.Enabled = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

dTime = dTime.AddSeconds(-1)

TextBox2.Text = dTime

If dTime = "0:0:0" Then
...続きを読む


人気Q&Aランキング