こんばんは。先日「実行後にコントロールを自由に移動したい」
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200410/04100008.txt
と質問したものです。その節は大変助かりました。
そこでDRAG息子さんが提示してくださったコードの動作が一度では頭に入ってこず、つたない頭で唸っておりました。
先ほどようやく何をやっているのか理解することができたので、いろいろと実験していたらまたぶち当たりました><
DRAG息子さんのコードは、移動したいコントロールがドロップされた先がフォームの場合はそのまま移動し、ドロップ先が別のコントロールだった場合はそのドロップ元とドロップ先コントロールを比較して同一だった場合ドロップ元コントロールの座標を基準に相対移動し、もし違った場合ドロップ先コントロールの座標を基準に絶対移動する、と理解しました。(間違っていたら指摘して下さい…)
しかしフォームに同一コントロールを複数配置した場合うまく動作しないことが分かりました。
これが例えばラベルコントロールを複数配置した場合はうまくいきます。しかし試してみた限りピクチャーボックスコントロールとコマンドボタンコントロールではうまくいきませんでした。
どうしてだろうと思って調べてみたらオブジェクト式(?)の返す値が、ラベルコントロールではちゃんとLabel1,Label2,…となるのに、ピクチャーボックスでは、0,0,0…となり、コマンドボタンでは、False,False,…となってしまい、それが原因でオブジェクトの比較部分がおかしくなりうまく動作していないようなのです。
何か良い解決手段はないでしょうか?
長文失礼致しました!ここまで読んでくださってありがとうございます!
読み返してみると意味不明な文章でした…すみません。
フォームにピクチャーボックスを二つ配置したとき、
Debug.Print Picture1 & "," & Picture2
としたら、0,0とイミディエイトに表示されます。
二つは違うものなのにどうして同じ値が返ってくるのでしょうか?
これがラベルだったら、
Label1,Label2
となり問題ないのですが。
よろしくお願いします。
一部のオブジェクトは、「既定のメンバ」という物を持っています。
VB6のコントロールの場合、それは「_Defaultプロパティ」という物です。
F2 キーで表示される オブジェクトブラウザ を見ると、まれに、
アイコンの左上に 水色の球の付いたメンバが付いている事がありますが、
それが、既定のプロパティ/メソッドと呼ばれる物です。
http://www.microsoft.com/japan/developer/library/vb98/vamsciconsusedinobjectbrowser.htm
例えばLabelコントロールの場合、既定のプロパティは、
Captionプロパティに相当しています。
Dim S1 As String
Dim S2 As String
Dim S3 As String
S1 = Label1.Caption
S3 = Label1.[_Default]
S2 = Label1
同様に、TextBoxならTextプロパティ、CommandButtonならValueプロパティが
既定のプロパティから返される事になります。
そしてPictureBoxの場合、既定のプロパティはPictureプロパティです。
Dim P0 As PictureBox
Dim P1 As Picture
Dim P2 As Picture
Set P0 = Picture1
Set P1 = Picture1.Picture
Set P2 = Picture1
そして、Pictureプロパティが返す「Pictureオブジェクト」もまた、
既定のメンバを持っています。それは「Handleプロパティ」です。
(空の画像の場合、Handleプロパティからは 0 という数値が返されます)
> Debug.Print Picture1 & "," & Picture2
この場合、
1. 「Picture1」は PictureBox型のオブジェクトだが、
PictureBox型を文字列で表現する事はできないので、
ここで、既定のプロパティが検索される。
2. 既定のプロパティからは、Picture型の値が返されるが、これもやはり
文字列で表現できないので、さらに既定のプロパティが使われる。
3. 既定のプロパティから、OLE_HANDLE型(Long型相当)の値が返される。
数値は文字列で表現できる。
4. Picture2についても同様に判定される。
という事で、結果的には
Debug.Print CStr(Picture1.Picture.Handle) & "," & CStr(Picture2.Picture.Handle)
のように判断される事になります。
魔界の仮面弁士さま、大変丁寧な解説ありがとうございます。
こういう仕組みだったんですね。すっきりしました。
コントロールの判別にはhWndプロパティを使うことにしました。これなら重なることはないと思いますし。
どうもありがとうございました!
ツイート | ![]() |