- PR -

OCXコントロールのインスタンス化について

1
投稿者投稿内容
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2006-05-16 11:13
いつも参考にさせて頂いております。

VB6のOCXコントロールをVB.NET2003で使用しようと思っています。
そのOCXコントロールとは、SATO社製のMultiLABELISTのOCXコントロールです。

クラスを作成し、その中でNewでインスタンス化しても
InvalidActiveXStateExceptionが発生します。
この説明を見ると、インスタンス化がうまくいっていないようです。
ただし、画面に貼り付けたコントロールを使用すると問題なく動きます。

インスタンス化は以下の様に行っています。
Private WithEvents MultiLblCtrlObj As New AxMLMECONTROLLib.AxMLmeControl

その後、何かしらのメソッド、プロパティにアクセスすると、上記例外が発生します。

OCXコントロールのクラス内でのインスタンス化方法をご教授お願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-16 11:29
引用:

kosekiさんの書き込み (2006-05-16 11:13) より:

OCXコントロールのクラス内でのインスタンス化方法をご教授お願いします。


その SATO 社さんは「動作保証」をしているのでしょうか?
不都合があっても、何もおかしくはありません。

たとえば、同じ COM である MSFlexGrid あたりでは不具合が生じます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-05-16 11:42
引用:

クラスを作成し、その中でNewでインスタンス化しても
InvalidActiveXStateExceptionが発生します。
この説明を見ると、インスタンス化がうまくいっていないようです。
ただし、画面に貼り付けたコントロールを使用すると問題なく動きます。

インスタンス化は以下の様に行っています。
Private WithEvents MultiLblCtrlObj As New AxMLMECONTROLLib.AxMLmeControl

その後、何かしらのメソッド、プロパティにアクセスすると、上記例外が発生します。



そういうもんです。

本来、「フォームに貼り付けないと動作しない(くてもよい)」のが OCX というものです。
例外的に new しただけで動くものもありますが、それはそのコントロールが「たまたまそういう造り」をしているからです。

フォームを表示したくないとしても、非表示のフォーなどを用意しないと動かないものは動かないです。

ASP.NET 等、バックエンドでの利用を考えているならあきらめて代替案を考えた方がいいです。
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2006-05-16 11:43
じゃんぬねっとさん、ご回答ありがとうございます。

SATO社のページには「動作保証」については書かれていませんが、
VB.NETでのサンプル等が置かれています。

画面にこのOCXコントロールを貼り付けた場合は問題なく使用できます。
ということは、画面の自動生成されたソースをマネすれば良いのでしょうか?
以下、MLmeControlという名前で画面に貼り付けた時のソースです。
しかし、新しいクラスの場合、resources変数はどうしたら良いでしょうか?

Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(SamplePrintML))
Me.MLmeControl = New AxMLMECONTROLLib.AxMLmeControl
CType(Me.MLmeControl, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'MLmeControl
'
Me.MLmeControl.Enabled = True
Me.MLmeControl.Location = New System.Drawing.Point(180, 92)
Me.MLmeControl.Name = "MLmeControl"
Me.MLmeControl.OcxState = CType(resources.GetObject("MLmeControl.OcxState"), System.Windows.Forms.AxHost.State)
Me.MLmeControl.Size = New System.Drawing.Size(28, 28)
Me.MLmeControl.TabIndex = 0

よろしくお願い致します。
koseki
ベテラン
会議室デビュー日: 2002/08/01
投稿数: 93
投稿日時: 2006-05-16 11:45
渋木宏明(ひどり)さん、ご回答ありがとうございます。

画面に貼り付けないと駄目なコントロールもあるのですね。
諦めるしかなさそうですね。

ありがとうございました。
1

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