この記事では、ActiveX コントロールの開発に関連する高度なトピックについて説明します。 これらには次のものが含まれます。
Von Bedeutung
ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 ActiveX に代わる最新のテクノロジの詳細については、「 ActiveX コントロール」を参照してください。
ActiveX コントロールでのデータベース クラスの使用
ActiveX コントロール クラスはクラス ライブラリの一部であるため、標準 MFC アプリケーションでデータベース クラスを使用して MFC データベース クラスを使用する ActiveX コントロールを開発する場合と同じプロシージャとルールを適用できます。
MFC データベース クラスの概要については、「MFC データベース クラス (DAO および ODBC)」を参照してください。 この記事では、MFC ODBC クラスと MFC DAO クラスの両方について説明し、どちらかの詳細を説明します。
注
DAO は、Office 2013 でサポートされています。 DAO 3.6 は最終バージョンであり、古いと見なされます。 Visual C++ 環境とウィザードは DAO をサポートしていません (ただし、DAO クラスは含まれており、引き続き使用できます)。 新しいプロジェクトには 、OLE DB テンプレート または ODBC および MFC を使用することをお勧めします。 DAO は、既存のアプリケーションの保守にのみ使用する必要があります。
パラメーター化されたプロパティの実装
パラメーター化されたプロパティ (プロパティ配列とも呼ばれます) は、同種の値のコレクションをコントロールの 1 つのプロパティとして公開するためのメソッドです。 たとえば、パラメーター化されたプロパティを使用して、配列またはディクショナリをプロパティとして公開できます。 Visual Basic では、このようなプロパティは配列表記を使用してアクセスされます。
x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array
プロパティの追加ウィザードを使用して、パラメーター化されたプロパティを実装します。 プロパティの追加ウィザードでは、上記の表記または標準の方法でコントロール ユーザーがプロパティにアクセスできるようにする Get/Set 関数のペアを追加することで、プロパティを実装します。
メソッドやプロパティと同様に、パラメーター化されたプロパティにも、許可されるパラメーターの数に制限があります。 パラメーター化されたプロパティの場合、制限は 15 個のパラメーターです (プロパティ値を格納するために 1 つのパラメーターが予約されています)。
次のプロシージャは、整数の 2 次元配列としてアクセスできる Array と呼ばれるパラメーター化されたプロパティを追加します。
プロパティの追加ウィザードを使用してパラメーター化されたプロパティを追加するには
コントロールのプロジェクトを読み込みます。
クラス ビューで、コントロールのライブラリ ノードを展開します。
コントロールのインターフェイス ノード (ライブラリ ノードの 2 番目のノード) を右クリックして、ショートカット メニューを開きます。
ショートカット メニューの [ 追加 ] をクリックし、[ プロパティの追加] をクリックします。
[ プロパティ名] ボックスに「
Array
」と入力します。[ プロパティの種類 ] ボックスで、
short
を選択します。[実装の種類] で、[Get/Set メソッド] をクリックします。
[ 関数の取得 ] ボックスと [ 関数の設定 ] ボックスに、Get 関数と Set 関数の一意の名前を入力するか、既定の名前をそのまま使用します。
パラメーター名コントロールとパラメーター型コントロールを使用して、行 (short 型) と呼ばれるパラメーターを追加します。
column (type short) という 2 つ目のパラメーターを追加します。
[完了] をクリックします。
プロパティの追加ウィザードによって行われた変更
カスタム プロパティを追加すると、プロパティの追加ウィザードによってコントロール クラス ヘッダー (.H) と実装 (.CPP) ファイル。
次の行がコントロール クラスに追加されます。H ファイル:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
このコードでは、 GetArray
と SetArray
という 2 つの関数を宣言します。これにより、ユーザーはプロパティにアクセスするときに特定の行と列を要求できます。
さらに、プロパティの追加ウィザードでは、コントロール クラスの実装 (.CPP) ファイル:
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
最後に、 GetArray
関数と SetArray
関数の実装が 、CPP ファイル。 ほとんどの場合、プロパティの値を返すように Get 関数を変更します。 通常、Set 関数には、プロパティが変更される前または後に実行する必要があるコードが含まれます。
このプロパティを便利にするには、パラメーター化されたプロパティの値を格納するために、 short
型のコントロール クラスで 2 次元配列メンバー変数を宣言できます。 次に、パラメーターで示されているように適切な行と列に格納されている値を返すように Get 関数を変更し、Set 関数を変更して、行と列のパラメーターによって参照される値を更新できます。
ActiveX コントロールでのエラーの処理
コントロールでエラー状態が発生した場合は、コントロール コンテナーにエラーを報告することが必要な場合があります。 エラーが発生した状況に応じて、エラーを報告する方法は 2 つあります。 プロパティの Get 関数または Set 関数内、または OLE オートメーション メソッドの実装内でエラーが発生した場合、コントロールは COleControl::ThrowError を呼び出す必要があります。これは、エラーが発生したことをコントロール ユーザーに通知します。 他の時点でエラーが発生した場合、コントロールは COleControl::FireError を呼び出す必要があります。これによって、ストック エラー イベントが発生します。
発生したエラーの種類を示すには、コントロールがエラー コードを渡して ThrowError
または FireError
する必要があります。 エラー コードは、32 ビット値を持つ OLE 状態コードです。 可能な場合は、OLECTL で定義されている標準のコード セットからエラー コードを選択します。H ヘッダー ファイル。 次の表は、これらのコードをまとめたものです。
ActiveX コントロールのエラー コード
エラー | 説明 |
---|---|
CTL_E_ILLEGALFUNCTIONCALL | 無効な関数呼び出し |
CTL_E_OVERFLOW | オーバーフロー |
CTL_E_OUTOFMEMORY | メモリ不足 |
CTL_E_DIVISIONBYZERO | 0 で除算しました |
CTL_E_OUTOFSTRINGSPACE | 文字列領域が不足しています |
CTL_E_OUTOFSTACKSPACE | スタック領域が不足しています |
CTL_E_BADFILENAMEORNUMBER | ファイル名または番号が正しくありません |
CTL_E_FILENOTFOUND | ファイルが見つかりません |
CTL_E_BADFILEMODE | ファイル モードが正しくありません |
CTL_E_FILEALREADYOPEN | ファイルは既に開いています |
CTL_E_DEVICEIOERROR | デバイス I/O エラー |
CTL_E_FILEALREADYEXISTS | ファイルは既に存在します |
CTL_E_BADRECORDLENGTH | レコードの長さが正しくありません |
CTL_E_DISKFULL | ディスクがいっぱい |
CTL_E_BADRECORDNUMBER | レコード番号が正しくありません |
CTL_E_BADFILENAME | ファイル名が正しくありません |
CTL_E_TOOMANYFILES | ファイルが多すぎます |
CTL_E_DEVICEUNAVAILABLE | デバイスを使用できない |
CTL_E_PERMISSIONDENIED | アクセス許可が拒否されました |
CTL_E_DISKNOTREADY | ディスクの準備ができていない |
CTL_E_PATHFILEACCESSERROR | パス/ファイル アクセス エラー |
CTL_E_PATHNOTFOUND | パスが見つかりません |
CTL_E_INVALIDPATTERNSTRING | 無効なパターン文字列 |
CTL_E_INVALIDUSEOFNULL | NULL の使用が無効です |
CTL_E_INVALIDFILEFORMAT | ファイル形式が無効です |
CTL_E_INVALIDPROPERTYVALUE | 無効なプロパティ値 |
CTL_E_INVALIDPROPERTYARRAYINDEX | プロパティ配列インデックスが無効です |
CTL_E_SETNOTSUPPORTEDATRUNTIME | 実行時にサポートされない設定 |
CTL_E_SETNOTSUPPORTED | Set not supported (読み取り専用プロパティ) |
CTL_E_NEEDPROPERTYARRAYINDEX | プロパティ配列インデックスが必要です |
CTL_E_SETNOTPERMITTED | Set は使用できません |
CTL_E_GETNOTSUPPORTEDATRUNTIME | 実行時にサポートされない |
CTL_E_GETNOTSUPPORTED | Get はサポートされていません (書き込み専用プロパティ) |
CTL_E_PROPERTYNOTFOUND | プロパティが見つかりません |
CTL_E_INVALIDCLIPBOARDFORMAT | クリップボードの形式が無効です |
CTL_E_INVALIDPICTURE | 無効な画像 |
CTL_E_PRINTERERROR | プリンター エラー |
CTL_E_CANTSAVEFILETOTEMP | ファイルを TEMP に保存できない |
CTL_E_SEARCHTEXTNOTFOUND | 検索テキストが見つかりません |
CTL_E_REPLACEMENTSTOOLONG | 置換が長すぎます |
必要に応じて、CUSTOM_CTL_SCODE マクロを使用して、標準コードの 1 つでカバーされていない条件のカスタム エラー コードを定義します。 このマクロのパラメーターは、1000 ~ 32767 の範囲の整数にする必要があります。 例えば次が挙げられます。
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
既存の VBX コントロールを置き換える ActiveX コントロールを作成する場合は、エラー コードに互換性があることを確認するために VBX コントロールが使用するのと同じ数値で ActiveX コントロールのエラー コードを定義します。
コントロールでの特殊なキーの処理
場合によっては、特定のキーストロークの組み合わせを特別な方法で処理したい場合があります。たとえば、Enter キーが複数行のテキスト ボックス コントロールで押されたときに新しい行を挿入したり、方向キー ID が押されたときに編集コントロールのグループ間を移動したりします。
ActiveX コントロールの基本クラスが COleControl
されている場合は、 CWnd::P reTranslateMessage をオーバーライドして、コンテナーがメッセージを処理する前にメッセージを処理できます。 この手法を使用する場合は、PreTranslateMessage
のオーバーライドでメッセージを処理する場合は常に TRUE を返します。
次のコード例は、方向キーに関連するすべてのメッセージを処理する方法を示しています。
BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
BOOL bHandleNow = FALSE;
switch (pMsg->message)
{
case WM_KEYDOWN:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
{
OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
}
break;
}
return bHandleNow;
}
ActiveX コントロールのキーボード インターフェイスの処理の詳細については、ActiveX SDK のドキュメントを参照してください。
実行時に非表示になっているダイアログ コントロールへのアクセス
ユーザー インターフェイスがなく、実行時に表示されないダイアログ コントロールを作成できます。 実行時に非表示の ActiveX コントロールをダイアログ ボックスに追加し、 CWnd::GetDlgItem を 使用してコントロールにアクセスすると、コントロールは正しく機能しません。 代わりに、次のいずれかの手法を使用して、コントロールを表すオブジェクトを取得する必要があります。
メンバー変数の追加ウィザードを使用して、 コントロール変数 を選択し、コントロールの ID を選択します。 メンバー変数名を入力し、コントロールのラッパー クラスを [コントロールの種類] として選択します。
-又は-
ローカル変数とサブクラスをダイアログ項目として宣言します。 次のようなコードを挿入します (
CMyCtrl
はラッパー クラス、IDC_MYCTRL1はコントロールの ID です)。CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();