- ベストアンサー
ActiveXコントロールでフォームを参照するには?
VB6SP5を使用してActiveXコントロールを勉強中です。 ActiveXコントロールを作成(OCX化)して、そのコントロールを別のプロジェクトのフォームで使用しようと思っています。 このコントロールの機能は、使用するフォーム上の「ラベル」や「テキストBOX」の情報(Caption、サイズ、位置、色 etc...)を取得して、いろいろと処理を行いたいのですが、取得方法がわかりません。 一応、次のようにコントロールのメソッドの引数でフォームを受け取ろうとしたのですが、下記のコンパイルエラーが出てダメでした。 Public Sub ABC( ByRef frmMain As Form ) : End Sub --- コンパイルエラー!! ------------------------------------------- "プライベート オブジェクトモジュールを、 パブリック オブジェクトモジュール内で、 パブリック プロシージャの引数または戻り値、 パブリック データメンバ、またはパブリックのユーザー定義型のフィールドとして、 使用することはできません。" ------------------------------------------------------------------ ところが、"As Form" を "As Object" にすると、上手くいきました。 Public Sub ABC( ByRef frmMain As Object ) : End Sub この違いは何なんでしょうか? この使い方は正しいのでしょうか? もし、別の方法があれば、教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あにぃーの反論、さすがにレアな情報ひっぱってきますねー かなりヘビーっす。 まーそれはそれとして、、、 http://www.microsoft.com/japan/developer/library/vbenlr98/vamsgCantPassPrivateObject.htm の内容は以前に確認しております。 その中で >作成したプライベート クラスをクライアントへ渡す必要がある場合は、その Instancing プロパティを Private 以外の値に設定してください。 とあります。 要は回避方法があるということです。 しかもObject型で受けることにより、セットされるタイミングでその使用される領域とクラス名で、VB側がフォームやコントロール類であることを理解します。 受けることができないのであれば、セットすることすらできません。 ましてやオリジナルのコントロールであるならば、なおの事問題はありません。 私自身、張るだけで各コントロールのサイズを変更するActiveXを公開した事があります。 特別な操作を出さない限り、URLの様なエラーは出ないと思います。 (だって今までそれで出たことないから。。。) それでObject変数にセットしてできることは、全てSendMessage系の事なので結果は同じです。 もしAs Objectで宣言した変数にセットして症状が出た場合は、 >ウインドウハンドル、FindWindow(Ex), SendMessage 辺りでやるしかないでは これだけではなく、グローバルメモリ領域に本体の方が書き込んで、それを利用する必要があります。 だから出なければ結果オーライ。 と言う発言をしました。←言い訳っぽい?
その他の回答 (2)
- todo36
- ベストアンサー率58% (728/1234)
>As Objectは、オブジェクトとして扱えるもの全てに対応しているので、それでよいと思います。 いや、駄目だと思います。 プロパティおよびメソッドで使用できるデータ型 http://www.microsoft.com/developer/library/vbcon98/vbcondatatypesusedinpropertiesmethods.htm エラー98 http://www.microsoft.com/japan/developer/library/vbenlr98/vamsgCantPassPrivateObject.htm ”このエラーが検出されない場合もあるので注意してください。”だと。 ウインドウハンドル、FindWindow(Ex), SendMessage 辺りでやるしかないでは。
お礼
あらがとうございます。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
以前に似たような件で、お話いたしました。(それが完全に正しいかは、依然不明) As Objectは、オブジェクトとして扱えるもの全てに対応しているので、それでよいと思います。 ただし、Witheventsが使用できないですが、、、
お礼
お返事ありがとうございました。
お礼
ありがとうございます。 とりあえず、As Objectで作成してみます。