- PR -

ActiveXコントロールを動的に参照し、プロパティーの変更・メソッドの起動をするには?

1
投稿者投稿内容
kshr
常連さん
会議室デビュー日: 2004/04/20
投稿数: 28
お住まい・勤務地: 滋賀
投稿日時: 2005-03-02 17:08
まずはじめに・・・VB6の質問です。
VB6に関する質問はここではしない方がいいのでしょうが、他に妥当な会議室が見つからなかった為、ここへ質問させて頂きましたm(__)m

ActiveXコントロールを自作し参照設定を行った場合には
Formからプロパティーの取得や設定・メソッドの起動(?)ができます。
しかし、OCXを動的に参照した場合の記述方法がわかりません。

開発環境
WindowsXP Pro
VisualBasic 6.0(SP6)

例えば・・プロパティー1個、メソッド1個のコントロールを作成
〆OCX情報
・ライブラリ名:Project1
・クラス名  :UserControl
・プロパティー:PaperName
・メソッド  :DataBind

〆標準Exeを新規作成し、Form1のクリックイベントなどへ記述
Dim CtlObj as Object

Set CtlObj = Controls.Add(Project1.UserControl, "UCon")

With CtlObj
.Top = 50
.Left = 50
.Height = 250
.Width = 250
.PaperName = "文字列をセット" ← ここで実行時エラー'438'になります。
.DataBind ← もちろんここでもエラー【オブジェクトとは、このプロパティー又はメソッドをサポートしていません。】
End With

ご教授よろしくお願いいたします。

[ メッセージ編集済み 編集者: kshr 編集日時 2005-03-02 17:11 ]
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-03-02 17:36
できるかどうかは自信がありませんが・・・
その1
Object 型の代わりに VBControlExtender 型にしてみる
その2
with はあきらめて CallByName で設定する

のどちらかでだめですか?
kshr
常連さん
会議室デビュー日: 2004/04/20
投稿数: 28
お住まい・勤務地: 滋賀
投稿日時: 2005-03-02 17:49
ご返答ありがとうございます。

VBControlExtender型でも同様でした。

CallByNameについては知りませんでした。
これから調べてみます。
CallByNameはObjectなら使えるもの?
VBControlExtenderでも使用できるもの?
ま、一度調べてみます。
ありがとうございました。

[ メッセージ編集済み 編集者: kshr 編集日時 2005-03-02 18:00 ]
kshr
常連さん
会議室デビュー日: 2004/04/20
投稿数: 28
お住まい・勤務地: 滋賀
投稿日時: 2005-03-02 19:45
引用:

パテ太さんの書き込み (2005-03-02 17:36) より:
できるかどうかは自信がありませんが・・・
その1
Object 型の代わりに VBControlExtender 型にしてみる
その2
with はあきらめて CallByName で設定する

のどちらかでだめですか?



Debug.Print CallByName(CtlObj, "PaperName", VbGet)
としても、同じエラーコード'438'が表示されました。。。

Dim CtlObj as Object

Dim CtlObj as VBControlExtender
の両パターンで試しました。

kshr
常連さん
会議室デビュー日: 2004/04/20
投稿数: 28
お住まい・勤務地: 滋賀
投稿日時: 2005-03-03 09:12
解決いたしました。
ご報告まで。

Dim CtlObj as Object
Dim CtlObj as VBControlExtender
のどちらかを使用し外部OCXを参照した場合に

CtlObj.object.PaperName = "文字列をセット"
で値のセット、値の取得ができるようになりました。
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-03-03 10:30
お役にはたてませんでしたが
解決されたそうなので
ここからは蛇足なんですけど・・・
引用:

kshrさんの書き込み (2005-03-02 19:45) より:
Debug.Print CallByName(CtlObj, "PaperName", VbGet)
としても、同じエラーコード'438'が表示されました。。。

Dim CtlObj as Object

Dim CtlObj as VBControlExtender
の両パターンで試しました。


CallByName は IDispatch(IDispatchEx かも) 経由で呼ばれると思ってたので
失敗するとは思えないのですが・・・?

私の環境(WinXP Pro VB6 SP5)では動作するのですが・・・。
・・・不思議です。

プロジェクトプロパティの
「使用しない ActiveX コントロールについての情報を削除する」
にチェックが入ってたりしませんか?
1

スキルアップ/キャリアアップ(JOB@IT)