コンニチワ
VBでフォームに配置したコントロールを
ドラック可能にして
フォーム上でドラック&ドロップを
検出してドラック前の位置から
ドロップ後の位置にコントロールを
移動させたいのですが
どうしてもずれたりして
上手く配置されません
どなたか同じようなことをやったことがある方
ベストなやり方
わかる方教えて下さい
よろしくお願いします

A 回答 (2件)

ちは。


Formにコントロールを張付けて以下のコードで実行すればOKです。
-----------------------------------------
Option Explicit

Dim Drg As Boolean'ドラッギングフラグ
Dim DrX As Single, DrY As Single'位置情報

Private Sub Image1_MouseDown(Button As Integer, ShiftState As Integer, x As Single, y As Single)
If Button = 1 Then
If Drg = False Then
Drg = True
DrX = x: DrY = y
Image1.ZOrder 0
End If
End If
End Sub

Private Sub Image1_MouseMove(Button As Integer, ShiftState As Integer, x As Single, y As Single)
Dim XX As Single, YY As Single

If Button = 1 Then
If Drg Then
XX = Image1.Left + x - DrX
YY = Image1.Top + y - DrY
Image1.Move XX, YY
End If
End If
End Sub

Private Sub Image1_MouseUp(Button As Integer, ShiftState As Integer, x As Single, y As Single)
Drg = False
End Sub
------------------------------------------------
じゃ、そゆことで。
    • good
    • 0

こんにちは。


最近 VB を触っていないのですが、ドラッグ開始のタイミングを MouseDown でおこなっているのなら、ドラッグ開始時点のコントロール内のマウス座標が得られるはずです。それを、ドロップ時の座標から引けばいいと思います。
(ドロップされたx座標-ドラッグ時のx座標, ドロップされたy座標-ドラッグ時のy座標) に動かせばいいのでは。

ただし、ドラッグ対象のコントロールと、ドロップされるコンテナの座標系が異なる場合には、適切な変換が必要だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qドラッグドロップ(AllowDrop)について

Form1にドラッグドロップ機能を導入しようと思い
AllowDropプロパティをTrueにしてDragDropイベントとDragEnterイベントを記述しました。
実際にデバックしてみるとうまく機能して安心したのですが
後で、bin/debug/AAA.exeを直接クリックしてみるとなぜか機能しません。
MyBase.LoadイベントにMyBase.AllowDrop=Trueと記述してみたいのですがダメでした。

何か設定が間違ってるのでしょうか?
ぜひご回答お願いします。


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  MyBase.AllowDrop = True
End Sub

Private Sub drag_drop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop

  Dim list As String() = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
  For Each a In list
     MsgBox(a)
  Next
End Sub

Private Sub drag_enter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
  e.Effect = DragDropEffects.Copy
End Sub

Form1にドラッグドロップ機能を導入しようと思い
AllowDropプロパティをTrueにしてDragDropイベントとDragEnterイベントを記述しました。
実際にデバックしてみるとうまく機能して安心したのですが
後で、bin/debug/AAA.exeを直接クリックしてみるとなぜか機能しません。
MyBase.LoadイベントにMyBase.AllowDrop=Trueと記述してみたいのですがダメでした。

何か設定が間違ってるのでしょうか?
ぜひご回答お願いします。


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) ...続きを読む

Aベストアンサー

投稿されたコードを試しましたが、特段問題がありません。
もちろん、EXE で試しても同様正常にメッセージボックスが表示されます。

新規プロジェクトで試して見ても動作しませんか?
動作しないようなら、すべてのイベントでメッセージボックスを表示するようにしてみてどのイベントが発生していないかを調べてみたらどうでしょうか?


因みに、私の環境は、VB2010 / Windows 7 32ビット

Q[VB6.0]フォーム上に配置したコントロールのフォントサイズが変えられない

はじめまして。
VB6.0のアプリケーションウィザードを使用してフォームをいくつか作りました。
ウィザード終了後、これらのフォーム上に配置されたラベルなどのfontプロパティ
を操作してフォントサイズを変えたいのです。フォームのデザイン上はフォントサ
イズを変えることが出来るのですが、実行すると、"コントロールのfontプロパティ
のfontサイズ"ではなく、"フォームのfontプロパティのfontサイズ"で統一されて
しまいます。つまり、コントロール毎の値は無視されて、フォームの値で統一され
てしまうのです。
exe形式にコンパイルしても同じでした。どこかしらのプロパティをいじるのだと
思うのですが、どなたかわかる方はいらっしゃいますか?
よろしくお願いします。
(環境)Windows98SE+VB6.0+SP5.0

Aベストアンサー

原因はわからないので根本的な解決にはならないのですが
フォームの起動時等(Form_Activate等)で
ラベルのプロパティをセットしてみてはいかがですか?

Label1.FontSize = ??

QファイルをドラッグドロップでTextBooxにファイル名を出したい

下記のサンプルコードをWEBサイトで見つけたので
ListBox1というところをTextBox1と直して
テキストボックスにファイルのフルパスが出るように
したかったのですが、Listbox1だと正常なのですが、
TextBox1に変更すると動作しなくなってしまいます。
最後の部分の
ListBox1.Items.AddRange(e.Data.GetData(DataFormats.FileDrop))は
TextBox1.Text=e.Data.GetData(DataFormats.FileDrop)
に変更してあります。

正常に動作するにはどこを直したらよいか教えて頂きたいです。
宜しくお願いします。m(__)m
---------------------------------------------------
Private Sub ListBox1_DragEnter(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs) _
Handles ListBox1.DragEnter
'関連連づけの確認をしています。
'この場合、ドラッグアンドドロップの形式であるかどうか?
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
'ドロップ効果を取得
e.Effect = DragDropEffects.Copy
Else
'ドロップ効果を破棄
e.Effect = DragDropEffects.None
End If
End Sub



Private Sub ListBox1_DragDrop(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs) _
Handles ListBox1.DragDrop
'DragEnterイベントで、取得した情報を追加
ListBox1.Items.AddRange(e.Data.GetData(DataFormats.FileDrop))
End Sub

下記のサンプルコードをWEBサイトで見つけたので
ListBox1というところをTextBox1と直して
テキストボックスにファイルのフルパスが出るように
したかったのですが、Listbox1だと正常なのですが、
TextBox1に変更すると動作しなくなってしまいます。
最後の部分の
ListBox1.Items.AddRange(e.Data.GetData(DataFormats.FileDrop))は
TextBox1.Text=e.Data.GetData(DataFormats.FileDrop)
に変更してあります。

正常に動作するにはどこを直したらよいか教えて頂きたいです。
宜しくお願いします。m(...続きを読む

Aベストアンサー

VB.NETですよね。
まず、
TextBox1.AllowDrop = True
になってますか?
あとは、
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
TextBox1.Text = e.Data.GetData(DataFormats.FileDrop)(0) 'String[]になる
End Sub
Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
e.Effect = DragDropEffects.Copy
Else
e.Effect = DragDropEffects.None
End If
End Sub
でいけるはずですが

VB.NETですよね。
まず、
TextBox1.AllowDrop = True
になってますか?
あとは、
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
TextBox1.Text = e.Data.GetData(DataFormats.FileDrop)(0) 'String[]になる
End Sub
Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
If (e.Data.GetDataPresent(Da...続きを読む

Qフォームサイズ変更時のコントロール位置について

OS:WindowsXP Pro SP2
VB:6.0 SP6

はじめまして。
VBで開発を行っているのですが
フォームのサイズ変更をした時、コントロールの位置に困っています。
最大化した時などは端にコントロールが寄ってしまい見た目が大変悪いです。
フォームサイズの変更時にコントロールも任意の位置に移動する方法はどのようにすれば良いのでしょうか?
ご存知の方ご教示宜しくお願いいたします。

Aベストアンサー

VBAにはアンカーなどがついていないのでその都度再配置しかないです。
具体的にはformのresizeイベントに、フォームの幅や高さなどから割合を出してボタンのLeftやTopを指定します。

Qドラッグアンドドロップでファイルを読み込む方法を教えて下さい。

一応いま手元にあるのはVB.NET2003なのですが、
これを使って複数のファイルから指定した行の内容をコピーして出力するプログラムを作りたいと考えています。
そのためには
1.ファイルをドラッグアンドドロップしてファイルの内容を読み込む
2.読み込んだ内容を順番に出力する機能が必要になります。

それでドラッグアンドドロップによりファイルを読み込む記述を探しているのですが、
http://www.atmarkit.co.jp/fdotnet/dotnettips/676dragdrop/dragdrop.html
ここにあるように、
1.フォームのAllowDropプロパティをTrueに設定する
2.フォームのDragEnterイベント・ハンドラを記述する
3.フォームのDragDropイベント・ハンドラを記述する
ということを順番に行えば良いわけですが、1番はもちろん分かりますが、2番と3番がどうして良いのか分かりません。
本屋で一通りVBの本を見てみたのですが、どの本にもドラッグアンドドロップについて書かれてある本はありませんでした。
検索などすると、確かにDragEnter、DragDropに関する記述は見つかるのですが、難しくてどうしても理解出来ません。

どなたか易しく教えて頂けないでしょうか?
よろしくお願い致します。

一応いま手元にあるのはVB.NET2003なのですが、
これを使って複数のファイルから指定した行の内容をコピーして出力するプログラムを作りたいと考えています。
そのためには
1.ファイルをドラッグアンドドロップしてファイルの内容を読み込む
2.読み込んだ内容を順番に出力する機能が必要になります。

それでドラッグアンドドロップによりファイルを読み込む記述を探しているのですが、
http://www.atmarkit.co.jp/fdotnet/dotnettips/676dragdrop/dragdrop.html
ここにあるように、
1.フォームのA...続きを読む

Aベストアンサー

この辺りが参考になるかと

[ファイルをドラッグアンドドロップする ]
http://anetm.com/dev/tools/vbdotnet/112236.htm
[ドラッグアンドドロップでファイルを関連付けでオープンする]
http://anetm.com/dev/tools/vbdotnet/112285.htm
[ドラッグアンドドロップでEXCELシートの一覧を取得する]
http://anetm.com/dev/tools/vbdotnet/112288.htm

Qタブコントロールを含んだフォームのスクロール位置

フォームの中にタブコントロールを入れ、その中にさらにフォームを入れ込んであります。

タブをクリックすると、タブ内のフォームの中のサブフォームにフォーカスが行ってしまうので
メインフォームの中にある「見積番号」のフィールドにフォーカスが行くように
下記のVBAを書いてみたのですが、うまくフォーカスが行きません。

何が原因なのでしょうか。

----------------------------
Private Sub パターン1_Click()
Forms!F_C_1_☆新規作成_パターン.SetFocus
Forms!F_C_1_☆新規作成_パターン!見積番号.SetFocus
End Sub

Aベストアンサー

>タブをクリックすると、タブ内のフォームの中のサブフォームにフォーカスが行ってしまうので
サブフォームの、プロパティのタブストップを「いいえ」にするだけで十分では?

QDragEnterイベントについて(VS2008、ドラッグ&ドロップ)

VisualStudio2008 C# で開発をしています。
ListViewにエクスプローラーからファイルをドラッグ&ドロップしようとしているのですが、うまくできません。
いろいろと調べて下記の3点を抑えればできるのかと思っていますが、思ったように動きません。

ListViewのAllowDrop=True;
DragEnterイベントでe.Effect = DragDropEffects.Copy;
DragDropイベントでDropした後の処理

きちんと記述しているつもりですが、DragEnterイベントが発生しません。
ちなみに、同じListViewの要素をドラッグ&ドロップするとDragEnterイベントは発生するので、あくまで外部(エクスプローラーなど)からドラッグされたものが受け付けないようです。

何が原因なのでしょうか?
ほかに設定などあるのでしょうか?

Aベストアンサー

ん~ CS2008の環境が無いので ・・・
VirtualPC2007 + Vista Ultimate +VB2008EE
といった環境で フォームにリストビューを貼り付け
Form_Loadで ListView1.AllowDrop=True
ListView1_DragEnterで e.Effect = DragDropEffects.Copy
としただけのフォームで確認しましたが

ドロップ禁止状態にはなりませんでした
DragEnterイベントも発生しております

ListViewにMouseDownイベントを追加して
MessageBox.Show( listBox1.AllowDrop.ToString() );
などで本当に Trueに設定されているのかを確認してみましょう

QVB6 クラスによるフォームコントロール操作。

お世話になってます。
初歩的な質問でしたら申し訳ありません。

現在 Visual Basic を学習しています。
データベース操作用のクラスを作り、
データベース処理の間、呼び出し元の任意のフォームに配置した
プログレスバーに経過を表示したいと思っています。

そこでこのようなプログラムを書きました。

■呼び出し元フォーム ----------------------------
Dim oDB As New AccessDB

Private Sub Button_Click()
  ' myProgressBar : Meに配置したプログレスバー
  oDB.CreateMDB("hoge.mdb", myProgressBar) ' (1)
End Sub

■データベース操作用クラス(AccessDB) ------------
Public Sub CreateMDB(strFile As String, pProgress As ProgressBar)
  pProgressBar.Max = 100

   処理

End Sub

myProgressBar と、DB操作クラスの引数で宣言される
pProgress はポインタとして渡せるのではないかという概念です。
しかし実行すると、(1)の呼び出しで構文エラーが出てしまいます。
このようにコントロールを渡す場合には、
どのようにすればよいのでしょうか。

お世話になってます。
初歩的な質問でしたら申し訳ありません。

現在 Visual Basic を学習しています。
データベース操作用のクラスを作り、
データベース処理の間、呼び出し元の任意のフォームに配置した
プログレスバーに経過を表示したいと思っています。

そこでこのようなプログラムを書きました。

■呼び出し元フォーム ----------------------------
Dim oDB As New AccessDB

Private Sub Button_Click()
  ' myProgressBar : Meに配置したプログレスバー
  oDB.CreateMDB("hoge.mdb"...続きを読む

Aベストアンサー

単に、
oDB.CreateMDB "hoge.mdb", myProgressBar
にすればいいかと思います。
()をつけると一般にfunction 呼びだしに解釈されます。
Call oDB.CreateMDB("hoge.mdb", myProgressBar)
の様に、頭にCallを付ければ()を付けても大丈夫です。

QVC++2005 windowsフォームアプリでドラッグ&ドロップを実現する方法

お世話になっております。
表題についていろいろ調べたのですがエラーの解決方法が見つからないため、質問させてください。
環境はVC++2005 CLD windowsフォームアプリケーション です。

貼り付けたリストボックスにtxtファイルをドラッグドロップして中身を取り出したいのですが、dragdrop関数内で、ファイルのパスを抜き出す部分でエラーが解決できません。

環境に合わせて下記のようなdragdrop関数を作成中です。
System::Void Form1::commandListBox_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
if(e ->Data ->GetDataPresent(DataFormats::FileDrop)){ // ファイルドロップのとき
std::string files[] = (std::string[])(e->Data->GetData(DataFormats::FileDrop));
}
}

最後の行はMSDNなどで書かれていた
string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
となっている部分を参考にしているつもりですが、この部分で下記のエラーがでます。

1>.\mySrc\tab0.cpp(45) : error C2440: '型キャスト' : 'System::Object ^' から 'std::string []' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。
1>.\mySrc\tab0.cpp(45) : error C2075: 'files' : 配列の初期化には中かっこ ({}) が必要です。



このエラーの解決方法か、ドラッグドロップしたファイルのパスを取得する方法をご教授頂ければ幸いでございます。

よろしくお願いいたします。

お世話になっております。
表題についていろいろ調べたのですがエラーの解決方法が見つからないため、質問させてください。
環境はVC++2005 CLD windowsフォームアプリケーション です。

貼り付けたリストボックスにtxtファイルをドラッグドロップして中身を取り出したいのですが、dragdrop関数内で、ファイルのパスを抜き出す部分でエラーが解決できません。

環境に合わせて下記のようなdragdrop関数を作成中です。
System::Void Form1::commandListBox_DragDrop(System::Object^ sender, System::Wi...続きを読む

Aベストアンサー

std::string[] を使うより cli::array<String^>^ を使う方が無難だと思います

array<String^>^arDrops = (array<String^>^)e->Data->GetData( DataFormats::FileDrop );
といった具合で取り出して
for( int n = 0; n < arDrops->Length; n++ ) {
  String ^sName = arDrops[n];
  // Dropされたファイルの個別の処理
}

といった具合でしょう

QVBAでフォームのコントロールの配置を変更したい

いつもお世話になっています。
VBAでフォームに配置した20個程度のコントロール(ラベル)をユーザーが自由に変更するにはどのようなプログラムを書けばよいのかわかりません。
配置は、エディタで固定して使わせるのではなく、ユーザーがフォーム上で自由にコンロトロールの配置を行ってレイアウトできるようにしたのですが、適当なイベントドリブンが見つかりません。
マウスダウンやマウスムーブなどのイベントを組み合わせることでできそうな気もするのですが1週間ほど悩んでも名案がうかびません。
目指すのは、「レイアウト変更」ボタンを押すと、変更モードになって、コントロールをドラッグしながら好きな位置へもっていけるというものです。
よろしくお願いします。

Aベストアンサー

どこかで見たような・・・。
hatena師匠のサイトでした。
http://hatenachips.blog34.fc2.com/blog-entry-159.html
実装したことはありませんが参考になるかと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング