MS Access Tips/Sample and VBA and Blog customize etc...

ドラッグできるコントロールクラス、ラベル、イメージ対応版

以前の記事 ドラッグできるラベルのクラス化 でラベルを移動できるようにしました。ラベル以外に例えばイメージコントロールも移動できるようにしてみたいと思います。

簡単なのは別にイメージコントロール用のクラスを作成することです。上記のクラスモジュールの Access.Label の部分を Access.Image に変更するだけです。しかし、ほとんど同じコードを2ヶ所に記述するのは一元管理というメリットを損ないます。ひとつのクラスモジュールで両方に対応できないでしょうか。

ドラッグできるコントロールクラス

難易度:

と前回のクラスモジュールでは、イベント付きのラベルを宣言していました。そこで、Label でも Image でも対応できるようにするには、そのどちらも代入できる Controlクラスで宣言すればいいかと思いますよね。ところが、VBAではControlクラスではWithEventsをつけて宣言できないようなんです。オブジェクト指向の他言語では上位クラスという概念でできるものが多いと思いますが、この辺りは VB のオブジェクト指向の中途半端なところでしょうか。

では、VBAでは無理なのかというとそうでもなく、なんとかする方法があります。とりあえずクラスモジュールのコードを提示します。

このクラスモジュールを clsDarggableControl と名前を付けて保存します。

4行目から6行目までを見てください。そこで、WithEvents付きのLabelとImage、WithEvents無しの Control を宣言しています。Bindメソッドで、外部からControlクラスの引数でオブジェクトを受け取り、タイプを調べて、LabelにセットするかImageにセットするか切り替えます。

39行目以降で、Labelのイベント、Imageのイベントをそれぞれ定義しています。両者の処理内容は共通になりますので、共通のプロシージャを19行目から37行目までに記述して、それをLabelのイベント、Imageのイベントから呼び出しています。

フォームモジュールから呼び出す場合は、Label と Image の違いを意識することなく今まで通りに呼び出せます。フォーム上に、ラベルが3つ Lbl0, Lbl1, Lbl2 とイメージコントロール Img1 が配置してあるとして下記のコードでそれぞれドラッグ移動できるようになります。

参考URL: VB 同じコードを2度書くな - クラスでのWithEventsによるイベントトラップ

サンプルファイルが下記からダウンロードできます。
FrmDragMoveCtlMulti_07.zip (Access 2007-2010 形式 - 86kb)
FrmDragMoveCtlMulti.zip (Access 2002-2003 形式 - 83kb)
FrmDragMoveCtlMulti_2k.zip (Access 2000 形式 - 80kb)


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/166-ddb28a70
該当の記事は見つかりませんでした。