Visual Studio .NET で ActiveX コントロールとWindows フォームを使用する

 

クレイグ・ユートリー
CIO ブリーフィング

2001 年 11 月

概要:このドキュメントでは、Microsoft Visual Studio .NET のWindows フォームで Microsoft ActiveX コントロールを使用する方法について説明します。 (11ページ印刷)

目標

  • ActiveX コントロールとWindows フォーム コントロールが定義されている
  • Windows フォームでの ActiveX コントロールの動作
  • ActiveX コントロールを使用してプロジェクトをアップグレードする方法について説明します

前提条件

このドキュメントを最大限に活用するには、次のことが当てはまります。

  • ActiveX コントロールとは何かを理解している
  • Visual Basic 6.0 コントロールと ActiveX コントロールを使用してWindows フォームを構築しました
  • 同じコンピューターに Visual Basic 6.0 と Visual Basic .NET の両方がある (心配する必要はありません。同じコンピューター上でうまく共存します)

内容

ActiveX コントロールとWindows フォーム コントロール
Windows フォームでの ActiveX コントロールの使用
ActiveX コントロールを含むプロジェクトのアップグレード
まとめ

ActiveX コントロールとWindows フォーム コントロール

Microsoft Visual Studio® .NET のリリースにより、Microsoft® は Microsoft Windows® アプリケーションをビルドするための新しいテクノロジを導入しました。 この新しいテクノロジの 1 つは、Windows フォーム と呼ばれる新しいフォーム パッケージであり、Microsoft .NET ランタイムで実行されるすべての言語で共有されます。 Windows フォームは、Microsoft Visual Basic® 開発者が使用するフォームとは異なりますが、一見すると同じように見える場合があります。 このドキュメントでは、これらの変更について説明します。

新しいWindows フォームエンジンと共に、新しいコントロールのセットが付属しています。 これらのコントロールは、以前のバージョンの Visual Basic では使用されていた Microsoft ActiveX® に基づいていません。 代わりに、これらのコントロールは、Microsoft .NET Framework と System.Windows.Forms.Control クラスを使用して構築されます。

任意の種類のユーザー インターフェイスを含む Visual Basic アプリケーションを記述している場合は、フォームに ActiveX コントロールがいくつか存在することがほぼ保証されます。 既存のアプリケーションを Visual Basic から Visual Basic .NET に移行する場合は、ActiveX コントロールに何が起こるか興味があるかもしれません。 さらに、同等のWindows フォーム コントロールを持たないコントロールを処理する方法についても興味があります。

このドキュメントでは、Windows フォームで ActiveX コントロールを使用する方法について説明します。 すべての ActiveX コントロールをWindows フォームで使用できるわけではありません。 Windows フォームに配置された ActiveX コントロールは、表示されるとおり、Windows フォーム コントロールに共通する新しいプロパティを自動的に取得します。 また、アップグレード プロセスが ActiveX コントロールに与える影響について説明します。

Windows フォーム コントロールの違い

多くの場合、長年にわたって ActiveX コントロールを使用してきました。 ActiveX コントロールは、Windows プラットフォームに限定されている COM 上に構築されています。 Windows フォーム コントロールは.NET Frameworkの一部であり、.NET Frameworkが別のオペレーティング システムに移植された場合、Windows フォーム コントロールも使用できるようになると考えたくなるかもしれません。 Windows フォーム Win32 API に大きく依存しているため、これは当てはまれません。 結局のところ、Windows プラットフォームを最大限に活用するように設計されたフォームです。

Windows フォーム コントロールには、 DockAnchor など、Visual Basic 6.0 フォーム エンジンで使用できなかった特定の機能があります。 これらの新しいプロパティは、表示されていたほぼすべての ActiveX コントロールで Top プロパティと Left プロパティが使用できたのと同様に、ほぼすべてのWindows フォーム コントロールで使用できます。

Windows フォーム コントロールは、ActiveX コントロールが Visual Basic 6.0 のオブジェクトであったのと同様に、オブジェクトです。 これで、.NET Frameworkによって提供される継承により、Visual Basic .NET を含む .NET をサポートする任意の言語で、これらのコントロールから真に継承することができます。 つまり、これまで不可能だった方法でコントロールを真にサブクラス化できます。 実際、独自のコントロールを設計する場合、このクラスによって提供される基本サービスを取得するために 、System.Windows.Forms.Control から継承する可能性があります。

Windows フォームでの ActiveX コントロールの使用

良いニュースは、ほとんどの ActiveX コントロールは問題なくWindows フォームで使用できることです。 この動作を確認するには、Visual Studio .NET を開き、Visual Basic .NET で AxTest1 という名前の新しい Windows アプリケーションを作成します。

プロジェクトを開くと、Form1 という名前のフォームが自動的にWindows フォーム Designerに読み込まれます。 左側の [ツールボックス] タブにカーソルを置くと、[ツールボックス] が開き、Windows フォーム コントロールのホストが表示されます。 もちろん、これらは ActiveX コントロールではありません。そのため、独自の ActiveX コントロールをツールボックスに追加する必要があります。 図 1 に示すように、[ツールボックス] を右クリックして [ ツールボックス のカスタマイズ] を選択し、[ ツールボックスのカスタマイズ ] ダイアログ ボックスを開きます。

図 1. [ツールボックスのカスタマイズ] ウィンドウは、ActiveX コントロールをツールボックスに追加する方法です

この例では、Visual Basic 6.0 に付属のコントロールを含めます。 それを置き換える Windows フォーム コントロールがありますが、テスト ケースとしてマシンに既に存在するものを使用するのが理想的です。 下にスクロールし、図 1 に示すように Microsoft DBList Control バージョン 6.0 を選択します。 [OK] をクリックします。

図 2 に示すように、DBList コントロールがツールボックスに追加されました。 ツールボックスに、これが ActiveX コントロールであることを示す情報がないことに注意してください。 Visual Basic 6.0 と同様に、コントロールをフォームに追加できるようになりました。

図 2. ActiveX コントロール DBList がツールボックスに追加されました

ダブルクリックするか、フォームにドラッグして、フォームにコントロールを追加します。 フォーム上にコントロールが配置されると、Visual Basic 6.0 で表示される内容とは異なるいくつかの点に気付くでしょう。

まず、名前が異なります。 Visual Basic 6.0 フォームにコントロールを追加した場合、名前は DBList1 になります。 Visual Basic .NET では、コントロールに指定された名前は AxDBList1 です。 Visual Basic .NET では、Windows フォームに追加する ActiveX コントロールの前に "Ax" プレフィックスが配置されます。 これは、ActiveX コントロールを簡単に見つける方法です。

次に、プロパティ ウィンドウを見て、AxDBList1 のプロパティを調べます。 このコントロールのプロパティには、Visual Basic 6.0 と Visual Basic .NET の違いがいくつかあります。 完全な一覧ではありませんが、Visual Basic 6.0 で同じコントロールに対して表示されない、Visual Basic .NET に表示されるプロパティの一部を次に示します。

  • アクセシビリティ対応の説明
  • アクセス可能な名前
  • アンカー
  • Dock

不足しているプロパティもあります。 ドラッグ アンド ドロップは、Windows フォームとまったく異なる方法で動作するため、Visual Basic .NET に示されているプロパティに DragIconDragMode が見つかりません。 また、Visual Basic .NET には Custom プロパティが表示されないことに気付くでしょう。 コントロールのカスタム プロパティ シートを開くには、図 3 に示すように、[プロパティ] ボックスの一覧の [ ActiveX – プロパティ ] リンクをクリックする必要があります。

図 3: [ActiveX - プロパティ] リンクをクリックして ActiveX コントロールのカスタム プロパティ ページにアクセスする

新しいプロパティの使用

上の一覧で確認したように、コントロールに新しいプロパティがいくつか含まれているように見えます。 たとえば、Visual Basic 6.0 にはない Anchor プロパティと Dock プロパティが作成されました。 ActiveX コントロールに含まれていない場合、これらのプロパティはどのように追加されましたか?

ActiveX コントロールには、 LeftRightVisible などのエクステンダー プロパティと呼ばれる共通プロパティがありました。 Windows フォーム エンジンは、ActiveX エクステンダー プロパティを独自のプロパティ セットに置き換えます。 これを実現するには、各 ActiveX コントロールのWindows フォーム ラッパーを作成します。 このラッパーは、ActiveX エクステンダー プロパティと新しいWindows フォーム プロパティを結合します。

Windows フォームには、エクステンダー プロパティと継承されたプロパティの両方があります。 DockAnchor などの一部の新しいプロパティは、実際には基本の System.Windows.Forms.Control クラスから継承されます。 エクステンダー プロパティは、基底クラスではなく、ホストによって提供されます。 Windows フォーム エクステンダー プロパティの例としては、 ToolTipProvider コントロールを追加した場合にのみ表示される ToolTip プロパティがあります。

これが複雑に思える場合、良いニュースは、開発者としてかなり透明に見えるということです。 既に説明したように、プロパティ ページをプルするには、プロパティ リストの下部にあるリンクをクリックするだけで済みます。 それ以外の場合、プロパティはプロパティ ウィンドウに表示され、元は ActiveX エクステンダー プロパティか、Windows フォームエクステンダー プロパティか継承プロパティかに関係なく使用します。

Dock プロパティを見てみましょう。 これは、Visual Basic 6.0 の DBList コントロールで使用できなかったプロパティです。 Dock プロパティの下向き矢印をクリックすると、小さなウィンドウが表示され、コントロールをドッキングする場所を選択できます。 図 4 では、開発者はコントロールをフォームの右側にドッキングすることを選択しました。 この操作を行うと、アプリケーションを実行すると、AxDBList1 がフォームの右側にドッキングされます。 フォームのサイズが変更されると、コントロールのサイズが自動的に変更され、移動します。 すべてのコードを自分で記述する必要がないため、これは非常に時間の短縮です。 図 5 は、フォーム サイズの変化に合わせてコントロールのサイズが自動的に変更され、ドッキングされた状態を維持する方法を示しています。

図 4: Windows フォーム、Dock プロパティなどの新しいプロパティを ActiveX コントロールで使用できるようにします

図 5: Dock プロパティを使用すると、ActiveX コントロールは自動的に拡大または縮小され、ドッキング先の画面領域にロックされた状態を維持します。

Windows フォームで動作しない ActiveX コントロール

良いニュースは、ほとんどの ActiveX コントロールがWindows フォームで正常に動作するということです。 ほとんどの 場合、 すべてを意味するわけではありません。 Windows フォームで動作しないコントロールの中には、Visual Basic 6.0 で非常に基本的に見えるコントロールの一部があります。たとえば、Line コントロールと Shape コントロールです。 Visual Basic 6.0 では、"ウィンドウレス" コントロールと呼ばれるこのようなコントロールを使用できます。 Visual Basic .NET では、ウィンドウなしのコントロールは使用できません。また、ウィンドウなしのコントロールもウィンドウ化されます。 ただし、通常ウィンドウなしのコントロールをウィンドウ化するプロセスでは、予期しない結果が発生する可能性があります。 このため、[ ] コントロールと [図形] コントロールは使用されなくなります。 存在しない Line コントロールの最適な解決策は、GDI+ ライブラリを使用するか、 Height プロパティが 1 ピクセルに設定され、 BorderStyle プロパティが FixedSingle に設定されたラベルを使用することです。 Shape コントロールの代わりに、GDI+ ライブラリを使用できます。

Windows フォームで動作しないその他の ActiveX コントロールには、UpDown コントロール、ssTab コントロール、およびクール バーがあります。 UpDown コントロール (Microsoft Windows Common Controls に含まれる – 2) は、スクロール バーが "buddy" コントロール (テキスト ボックス) にリンクできないため、使用できません。 ssTab コントロール (Microsoft Tabbed Dialog Control) は、他の ActiveX コントロールやWindows フォーム コントロールをWindows フォームに含めることはできません。 これらの ActiveX コントロールが .NET で動作しないことを読んでも心配しないでください。ほとんどの場合、TabControl などのWindows フォームにネイティブな代替コントロールがあります。

Windows フォームで使用できない Line、ShapessTabUpDown などのコントロールを使用すると、プロジェクトを Visual Basic 6.0 から Visual Basic .NET にアップグレードするときに問題が発生します。 これらのアップグレードの問題については、次のセクションで確認します。

ActiveX コントロールを含むプロジェクトのアップグレード

既存の Visual Basic 6.0 プロジェクトの数が多いため、多くのユーザーが Visual Basic 6.0 アプリケーションを Visual Basic .NET に移行することが避けられません。 この移行に役立つアップグレード ウィザードが Visual Basic .NET に含まれていることをお勧めします。 アップグレード ウィザードは非常に優れているものの、プロセスの 1 つの手順にすぎません。 アップグレード ウィザードを使用して ActiveX コントロールを含むアプリケーションをアップグレードするとどうなるかを見てみましょう。

既定では、アップグレード ウィザードは ActiveX コントロールを同等のWindows フォーム コントロールにアップグレードしようとします。 これを確認するには、単純なプロジェクトを作成してアップグレードしましょう。

シンプルな Visual Basic 6.0 アプリケーションのアップグレード

Visual Basic 6.0 で、新しい Standard exe を作成します。 フォームで、ラベル、テキスト ボックス、ボタンを追加します。 フォームに線を描画します。 次に、 Shape コントロールを追加し、そのプロパティを変更して、単色の円にします。 フォームが実際にどう見えるかは、それほど重要ではありません。 図 6 の例を確認できます。

図 6: アップグレードしようとしている単純な Visual Basic 6.0 アプリケーション

プロジェクトを SimpleUpgrade.vbp として保存し、Visual Basic .NET を開きます。 Visual Basic .NET で、プロジェクトを開きます。 [ プロジェクトを開く ] ダイアログで、SimpleUpgrade.vbp を保存したディレクトリに移動します。 .vbp ファイルを表示するには、ドロップダウン リスト ボックス [ファイル] を Visual Basic Project Files に変更する必要があります。 Visual Basic .NET で SimpleUpgrade.vbp を開き、Visual Basic アップグレード ウィザードを自動的に開始します。

アップグレード ウィザードでは、プロジェクト名 (ウィザードの手順 3) を除き、すべての既定値をそのままにします。 アップグレードが完了したら、結果のプロジェクトを調べます。

[ソリューション エクスプローラー] ウィンドウを見ると、_UpgradeReport.htmという名前のファイルが表示されます。 このファイルをダブルクリックすると、アップグレード中に 2 つのエラーが発生したことがわかります。 Shape コントロールも Shape1.Shape プロパティもアップグレードされませんでした。 以前は、 Shape コマンドと Line コマンドの両方が Visual Basic .NET から削除されましたが、Line に関するエラーが発生していません。 その理由を確認するには、フォームをダブルクリックしてDesignerで開きます。

フォームは Visual Basic 6.0 と似ていますが、図 7 に示すように、円は四角形になりました。 線は同じように見えますが、1 回クリックすると、実際には線ではないことに気が付きます。 線をクリックした後、プロパティ ウィンドウを確認します。Line コントロールの名前は Line1 であっても、コントロールは実際にはラベルであることがわかります。 技術的には、 System.Windows.Forms.Label です。 ラベルの Height プロパティが 1 ピクセルに設定され、 BorderStyle プロパティが FixedSingle に設定されているだけです。 さらに、 Shape コントロールが使用された黄色の四角形も Label です。 ボタンまたはテキスト ボックスを調べると、両方とも System.Windows.Forms クラスから取得されていることがわかります。つまり、コントロールがWindows フォーム コントロールにアップグレードされたことを意味します。

図 7: Visual Basic .NET でのアップグレード後の単純な Visual Basic 6.0 フォーム

より複雑な Visual Basic 6.0 アプリケーションのアップグレード

Visual Basic 6.0 に戻るし、新しい Standard exe を作成します。 ラベルを追加し、1 つのテキスト ボックスを追加します。 テキスト ボックスをコピーして貼り付け、[ はい ] をクリックしてコントロール配列を作成します。 フォームに 1 つのラベルと 2 つのテキスト ボックスが追加されましたが、テキスト ボックスはコントロール配列の一部です。

[ラベル] で、DragMode プロパティを 1 – Automatic に変更し、テキスト ボックス Text1(0) をダブルクリックしてコード ウィンドウを表示します。 次のように Text1(0) DragDrop イベント ハンドラーを変更します。

Private Sub Text1_DragDrop(Index As Integer, _
   Source As Control, X As Single, Y As Single)
    Text1(0).Text = Label1.Caption
End Sub

このコードは Text1(0) を変更します。 Label1 をドラッグして Text1(0) にドロップすると、ラベル内の任意の文字列にテキストが表示されます。

次に、コード ウィンドウの [プロシージャ] ドロップダウン ボックスから [イベント プロシージャの 変更 ] を選択します。 このイベント プロシージャに次のコードを追加します。

Private Sub Text1_Change(Index As Integer)
    Text1(1).Text = Now
End Sub

テキスト ボックス Text1Change イベント プロシージャにコード行を追加すると、このテキスト ボックスの Text プロパティのデータが変更されるたびに、Change イベントが発生します。 ラベル コントロールをいずれかのテキスト ボックスにドラッグすると、ラベル内のキャプションが Text1(0) に配置されます。Text プロパティ。 同時に、 Text1 (0) が原因で Change イベントが発生 します。Text プロパティが変更されました。 Change イベント内のコードが起動し、現在の日付と時刻が Text1(1) に入力されます。Text プロパティ。

プロジェクトを MoreComplexUpgrade.vbp として保存し、Visual Basic .NET を開きます。 プロジェクトをアップグレードし、_UpgradeReport.htm ファイルを調べます。 図 8 に示すように、1 つのエラーと 1 つの警告が表示されます。

図 8: ドラッグ アンド ドロップ イベントをアップグレードするときに発生したエラー

ご覧のように、Visual Basic .NET では、アプリケーションのドラッグ アンド ドロップ部分のアップグレードに苦労しました。

フォームを見ると、Visual Basic 6.0 フォームと Visual Basic .NET フォームの他のいくつかの違いに気付くでしょう。 コンポーネント トレイ (フォームの下の小さなウィンドウ) には、 Text1ToolTip1 の 2 つのコントロールが表示されます。 Visual Basic .NET では、Visual Basic 6.0 のようにコントロール配列が処理されないため、 Microsoft.VisualBasic.Compatibility.Visual Basic 6.0.TextBoxArray 型のコンポーネント トレイにコントロールが作成されます。 互換性レイヤーは、Visual Basic から Visual Basic .NET への移行をよりスムーズにするのに役立ちます。 ネイティブ Windows フォーム コントロールを使用するよりも互換性レイヤーを通過する方が遅いため、可能な場合は使用しないでください。

コンポーネント トレイに ToolTip1 が表示されるのは、Windows フォーム コントロールに ToolTip プロパティはなく、代わりに拡張可能なプロパティ エクステンダー アーキテクチャを使用するためです。 これは、必要に応じてすべてのコントロールのヒントを提供する追加のコントロールです。 エクステンダー プロバイダーのもう 1 つの例として、ヘルプ関連のプロパティをコントロールに追加する HelpProvider があります。

TextBoxes の名前を調べると、名前が変更されていることがわかります。 1 つ目は Text1_0 と呼ばれ、2 つ目は Text1_1 と呼ばれます。 Visual Basic .NET のコントロール配列は、異なるオブジェクト名と異なるメソッドを使用して処理されます。

まとめ

これで、Windows フォーム アプリケーションで ActiveX コントロールを使用する方法を確認しました。 良い知らせは、ほとんどの作業が正常に動作するということです。 一部の Visual Basic コントロールは、さまざまな理由で機能しません。 混乱を避けるために、可能な限りWindows フォームコントロールを使用することをお勧めします。 次の点に留意してください。

  • コントロール配列は、コード内のさまざまなコントロール名とメソッドによって処理されます。
  • ActiveX コントロールのカスタム プロパティ ページにアクセスするには、[プロパティ] リストの下のリンクを使用します。
  • ActiveX コントロールは、Anchor や Dock などのWindows フォーム コントロールのプロパティを自動的に取得します
  • 図形などのコントロールは、Visual Basic .NET の Label コントロールにアップグレードされます。
  • ドラッグ アンド ドロップ操作は Visual Basic .NET では動作が大きく異なります。そのためのコードはアップグレードされません。 ドラッグ アンド ドロップを大量に使用すると、アップグレード後に手動で変更することになります。

著者について

Craig Utley は、Microsoft 開発に重点を置いたコンサルティングおよびトレーニング会社である CIOBriefings LLC の社長です。 最初に発表されて以来、.NET に関する作業と執筆を続けています。 最近、Craig は .NET for Sams Publishing と Volant Training について書いています。

情報伝達グループについて

情報通信グループ(www.informant.com)は、情報技術分野を中心とした多様なメディア企業です。 ソフトウェア開発出版物、カンファレンス、カタログ発行、Webサイトを専門とするICGは、1990年に設立されました。 米国と英国にオフィスを構え、ICGは、質の高い技術情報に対するITプロフェッショナルの意欲を満たし、尊敬されるメディアおよびマーケティングコンテンツインテグレーターを務めてきました。

Copyright © 2001 Informant Communications Group and Microsoft Corporation

技術編集: PDSA, Inc.