Drag & drop в visual basic


Drag & drop

This part of the Mono Visual Basic Winforms tutorial will be dedicated to the drag & drop operations.

In computer graphical user interfaces, drag-and-drop is the action of (or support for the action of) clicking on a virtual object and dragging it to a different location or onto another virtual object. In general, it can be used to invoke many kinds of actions, or create various types of associations between two abstract objects. (Wikipedia)

Drag and drop functionality is one of the most visible aspects of the graphical user interface. Drag and drop operation enables you to do complex things intuitively.

Dragging a button

In the first example, we will do the drag & drop operation on the button control. The example does the job outside the drag & drop protocol.

The code example puts a regular button control on the form container. By clicking on the button surface and simultaneously dragging it with a mouse we can relocate the button.

There are some supporting variables in our example. The isDragging variable tells us, whether we are in the process of dragging an object. The oldX and oldY variables store the x, y coordinates just before the dragging process begins.

We plug in three different mouse handlers for our button. They implement three different stages of the drag & drop process. The process begins, when we click on the button. This is handled by the OnMouseDown method. The second part is the movement. This is when we move the object to a new position. It is handled in the OnMouseMove method. The final part is when the process stops. It happens when we release the mouse button. The appropriate task is delegated to the OnMouseUp method.

The OnMouseDown method implements the first part of the process. It sets three necessary variables.

In the OnMouseMove method, we relocate the button. We calculate the difference between the stored x, y coordinates and the new coordinates of the mouse pointer. The difference is added to the Top and Left properties of the button, thus moving it to a new position.

Figure: Dragging a button

Dragging Text

In the previous example, we did drag & drop on the control. Next we will do a drag & drop operation on the textual data. Here we will use the drag & drop protocol provided by the Winforms library.

Drag & drop operation is a standardized communication protocol in Winforms. We have two basic objects. The drag source and the drop target .

We have two controls on the form. A button and a text box. We will drag text from the text box and drop it on the button.

We set the AllowDrop property to true. Dropping is not enabled by default.

Again, the drag & drop process is divided into three steps. We have three methods for each particular step.

The DragEnter event is launched when the mouse pointer enters the area of the drop target control. The Effect property must be set. The DragDropEffects of the drag source and drop target must be equal. Otherwise the operation will not work.

Finally we have the OnDragDrop method. Here we get the data from the event object and set it to the button Text property.

In the OnMouseDown method we initialize the drap & drop process. We initiate the process with the DoDragDrop method. The DragDropEffects.Copy parameter specifies the type of the operation. Esentially, we can either copy the text or move it during the drag & drop operation.

Figure: Drag & drop of text

Dragging Image

In our last example, we will drag & drop image on the form.

In our example we have a PictureBox and we draw a gray rectangle. If we drop the picture inside the rectangle, the color of the rectangle changes to gold.

The brsh variable holds the brush of the rectangle. It is a gray color by default.

The LoadImage method loads a bitmap for the PictureBox control.

In the OnMouseUp method, we determine the brush of the rectangle. If the bounds of the picture box are inside the rectangle, the brush is of gold color; gray otherwise.

We must call the Refresh method to activate the new brush color.

Figure: Drag & drop image

This chapter was dedicated to drag & drop operations using the Mono Winforms library with the Visual Basic language.

Программирование игр в Visual Basic на уроках информатики

При изучении наук примеры полезнее, чем правила. Иссак Ньютон.

Предлагаемые вниманию коллег практические работы по программированию игр целесообразно использовать после изучения следующих тем: «Создание массива управляющих элементов», «Обработка массивов», «Графические возможности Visual Basic». После непосредственного изучения темы «Обработка событий мыши. Технология Drag-and-Drop» мы выполняем несколько практических работ по программированию несложных игр, основная цель которых – обобщение, систематизация и закрепление на практике изученного ранее материала.


При объяснении нового материала удобно использовать распечатки с изложением теории и примерами, либо методические пособия для каждого студента (мы используем оба варианта).

Приведённые практические работы рассчитаны на 3 занятия по 2 часа.

Обработка событий мыши. Технология Drag-and-Drop.

Для перетаскивания различных объектов при помощи мыши используется технология Drag-and-Drop (перетащить и бросить). Перемещаемый элемент называется источником (source), а объект, в котором он будет после этого находиться, носит название адресата (target). Объект становится адресатом в том случае, когда при завершении операции перетаскивания указатель мыши находится в его границах.

Для перемещения объекта необходимо наличие в программе соответствующих процедур. К элементу управления может применяться описанная технология только в том случае, если он не имеет фокус в этот момент. Для запрещения получения фокуса элементом необходимо для него задать свойство TabStop = False.

Свойства, события и методы технологии Drag-and-Drop.

Название Описание
DragDrop Событие, возникающее по окончании операции перетаскивания элемента.
DragOver Событие, которое выполняется в случае, когда элемент находится над объектом-адресатом (при этом операция перетаскивания еще не завершена).
DragMode Свойство устанавливает режим перетаскивания элемента:
  • Manual (ручной);
  • Automatic (автоматический).
Draglcon Свойство задаёт изображение элемента при его перетаскивании.
Drag Метод, используемый для начала и окончания операции перетаскивания (перед этим необходимо установить DragMode = 0).

Если установлен ручной режим перемещения (DragMode = 0), то в этом случае операция может быть выполнена только при помощи метода Drag. При автоматическом режиме возможно перетаскивание элемента без использования Drag.

Событие DragDrop, возникающее при завершении операции, имеет следующие параметры:

  • DragDrop (Source As Control, X As Single, Y As Single), где Source As Control — ссылка на элемент-источник;
  • X As Single, Y As Single — координаты точки объекта-адресата, в которой отпускается кнопка мыши по окончании операции.

Метод Drag имеет один параметр — Action, определяющий то или иное состояние выполняемого перетаскивания. В таблице приведены значения параметра Action метода Drag:

Константа Значение Описание
vbCancel Отмена операции
vbBeginDrag 1 Начало перетаскивания
vbEndDrag 2 Окончание операции

Пример 1: Имитация действия Корзины путём перетаскивания в неё объекта. Восстановление объекта происходит при двойном щелчке по корзине.

В качестве корзины и объекта будем использовать элементы управления Image. В качестве рисунков пустой и полной корзины можно использовать файлы с расширением.ICO, в качестве объекта для перемещения – рисунок мяча. Соответствующие рисунки нужно скопировать в папку с данным проектом. При запуске приложения корзина изображена пустой, затем в Image будет загружен рисунок с изображением полной корзины методом LoadPicture .

На форме разместить метку Label1 (Положи мяч в корзину), кнопку Command1 (Выход), 2 элемента управления Image (в один поместить изображение мяча, в другой – пустой корзины).

  • Mx, My – координаты перемещаемого объекта;
  • P – переменная логического типа, определяющая, пустая корзина или полная.

Dim Mx, My As Single, P As Boolean

Private Sub Form_Load() ‘загрузка формы

P = False ‘признак пустой корзины

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbLeftButton Then ‘если нажата левая кнопка мыши

Call Image1.Drag(vbBeginDrag) ‘начало перетаскивания

Private Sub Image2_DragDrop(Source As Control, X As Single, Y As Single) ‘завершение перетаскивания объекта в корзину

Source.Visible = False ‘мяч стал невидим

P = True ‘признак полной корзины

Image2.Picture = LoadPicture(«LEO4.ICO») ‘рисунок полной корзины

Label1.Caption = «Достань мяч из корзины. » ‘изменили надпись в метке

Private Sub Image2_DblClick() ‘извлечение объекта из корзины

Image1.Visible = True ‘мяч стал видимым

P = False ‘признак пустой корзины


Image2.Picture = LoadPicture(«LEO3.ICO») ‘загрузить рисунок пустой корзины

Label1.Caption = «Положи мяч в корзину!» ‘изменить надпись в метке

‘Завершение перетаскивания объекта на форме с учётом поправки (необязательная процедура)

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)

SourceMove (X — Mx), (Y — My)

При автоматическом перетаскивании элемента по форме при завершении операции его левый верхний угол будет находиться в той точке, где располагался указатель при отпускании кнопки мыши, независимо от того, где он находился на элементе в начале перетаскивания. Для того, чтобы конечное расположение совпадало с контуром, который отображается по умолчанию при перетаскивании (или с изображением, установленным в свойстве DragIcon), необходимо ввести поправку. После установления ручного режима становится возможным определение координат точки, в которой находился указатель в начале перетаскивания путём обработки события MouseDown для соответствующего элемента, что позволяет откорректировать параметры метода Move. [1]

  1. Добавьте в проект изображения ещё двух объектов, которые также можно перемещать в корзину и возвращать на место.
  2. Измените проект таким образом, чтобы объекты можно было перемещать в любое место на форме (т.е. приёмником становится сама форма).

Практическая работа 1

Илон Маск рекомендует:  Reset - Процедура Delphi

Предварительная подготовка к работе (может быть выполнена дома): в любом графическом редакторе разбить произвольный рисунок на 4 части и сохранить в разных файлах (Ris1.bmp, Ris2.bmp, Ris3.bmp, Ris4.bmp). Например, в Paint можно использовать команду ПРАВКА – Копировать в файл. Не изменяйте пропорций рисунков. Создайте ещё один рисунок Ris5.bmp – квадрат с однотонной заливкой (будем использовать его в качестве фона, когда необходимо скрыть предыдущие рисунки).

Задание. Разработать проект «Пазлы». Исходный рисунок разбит на 4 части. Необходимо сложить его на пустом поле, разбитом на 4 части. Исходный вид формы показан на рисунке .

Интерфейс проекта. На форме разместить следующие элементы управления:

  • метка Label1 (Собери картинку по образцу!);
  • 4 командные кнопки: Command1 (Выход), Command12 (Проверка), Command3 (Сброс), Command4 (Справка);
  • поле Image1 – поместить исходный рисунок для образца;
  • поля Image2 и Image3 — создать как массивы из 4-х элементов каждый (с индексами 0, 1, 2, 3), установить у каждого свойство Strech = True. В поле Image2 необходимо будет собрать рисунок. Первоначально там загружен пустой фон, поэтому в свойстве Picture полей Image2 нужно указать путь к фоновому рисунку Ris5.bmp. В свойстве Picture полей Image3 указать путь к рисункам (Ris1.bmp, Ris2.bmp, Ris3.bmp, Ris4.bmp). Файлы с рисунками скопируйте предварительно в папку с вашим проектом, тогда не нужно будет указывать полный путь к файлам, достаточно указать имя файла;
  • метка Label2 – для вывода справки (установите свойство Visible= True, чтобы при запуске проекта метка была невидима);
  • таймер Timer1 – первоначально таймер выключен. Он будет включаться по кнопке «Справка» и через заданный интервал времени скрывать текст, который выведен в метке Label2 (установите свойства таймера Interval = 8000, Enabled = False).

Dim Mx, My As Single, Path As String, k, i, j, t As Integer, A(0 To 3) As Integer

‘Массив А — для хранения номеров перемещённых картинок;

‘Mx, My – координаты объекта при перемещении; Path – путь к файлу с рисунком;

‘k — количество верных ответов; t — номер рисунка, который нужно вернуть на место

Private Sub Form_Load() ‘загрузка формы

A(i) = -1 ‘заполнение массива -1 – признак того, что соответствующие поля Image2 пустые

Private Sub Command1_Click() ‘Выход

Private Sub Command2_Click() ‘Проверка

k = 0 ‘количество верных ответов

If Image2(i).Index = A(i) Then k = k + 1 ‘индекс в массиве рисунков должен совпадать с номером рисунка

Label1.Caption = «Игра завершена. Верных ответов — » & Str(k)

Label1.Caption = «Попробуй еще раз. Верных ответов — » & Str(k)

Private Sub Command3_Click() ‘Сброс

Image3(i).Visible = True ‘восстанавливаем все рисунки

Image2(i).Picture = LoadPicture(«Ris5.bmp») ‘загружаем пустой фон

A(i) = -1 ‘в массив заносим -1 — признак пустого поля

Label1.Caption = «Собери картинку»

Private Sub Command4_Click() ‘Справка

Label2.Visible = True ‘метка становится видимой и появляется текст справки


Label2.Caption = «Перемещайте картинки при нажатой левой кнопке мыши в нужные клетки. При двойном щелчке по картинке она вернётся на прежнее место!»

Timer1.Enabled = True ‘включаем таймер

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) ‘Поправка

SourceMove (X — Mx), (Y — My)

Private Sub Image2_DblClick(Index As Integer) ‘Возвратить картинку на место по двойному щелчку по рисунку

Image2(Index).Picture = LoadPicture(«Ris5.bmp») ‘загружаем пустой фон

t = A(Index) ‘запоминаем номер рисунка, который нужно вернуть на место

Image3(t).Visible = True ‘делаем рисунок с номером t видимым

Private Sub Image2_DragDrop(Index As Integer, Source As Control, X As Single, Y As Single) ‘завершение перетаскивания

j = Index: A(j) = Val(Mid$(Path, 4, 1)) — 1 ‘запомнить номер перемещённого рисунка в массиве А

Private Sub Image3_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbLeftButton Then

Call Image3(Index).Drag(vbBeginDrag) ‘начало перетаскивания рисунка

i = Index ‘запоминаем индекс поля в Image3, из которого перемещаем рисунок

If i = 0 Then Path = «Ris1.bmp» ‘путь к рисунку

If i = 1 Then Path = «Ris2.bmp»

If i = 2 Then Path = «Ris3.bmp»

If i = 3 Then Path = «Ris4.bmp»

Private Sub Timer1_Timer() ‘Таймер

Label2.Visible = False ‘скрыть текст справки

  1. Добавьте в проект 2 новые формы. На первой (заставка) разместите переключатели (Option) для выбора уровня сложности игры. При выборе 1-го уровня загружается соответствующая форма (рисунок разбит на 4 части).
  2. Реализуйте 2-й уровень сложности игры на третьей форме. Исходный рисунок разбит на 9 частей.

Практическая работа 2

Проект «Расположить объекты в хронологическом порядке».

В данной задаче мы работаем с массивами меток. Перемещаемыми объектами здесь являются метки с надписями. При первоначальной загрузке должны быть доступны только кнопки «Пуск» и «Выход». После нажатия на «Пуск» становятся доступны все кнопки. По кнопке «Проверка» выводится количество правильных ответов. Кнопки должны быть снабжены всплывающими подсказками. Исходный вид формы приведён на рисунке .

Рассмотренные в данных работах методы обработки событий мыши при перемещении объектов мы используем в дальнейшем при создании тестовых и игровых программ («Пятнашки», «Морской бой», «Электронные кроссворды», «Переводчик», «Интеллектуальный марафон», «Эрудит», «Тесты на внимание», «Информатика в играх и задачах» и других). Несомненно, что выполнение таких заданий способствует не только развитию творческих и умственных способностей учащихся, но и повышает интерес к самому процессу программирования. В процессе работы над проектами возникает множество предложений по усовершенствованию программы и вопросов, для решения которых имеющихся знаний уже недостаточно. Таким образом поддерживается непрерывная связь теории с практикой, постоянно вводятся новые элементы познания.

С некоторыми проектами можно познакомиться на сайте ПОРТФОЛИО 2006/2007 г. («Информатика в играх и задачах», «Компьютерный тест Умник»), 2007/08 г. («Электронные кроссворды по информатике», проект «Компьютерная графика»).

  1. Глушаков С.В.,Мельников В.В., Сурядный А.С Программирование в среде Windows: Учебный курс. – Харьков: Фолио, 2001

Drag & drop в visual basic

Приветствую участников!
В прилагаемом примере элемент списка из ListBox1 методом Drag and drop
переносится в один из текстовых полей. В то же время данный элемент сохраняется в
в ListBox1.
Вопрос: что надо изменить, чтобы после переноса элемента он удалялся из исходного
ListBox1 . или хотябы менял цвет или вроде того.

В том же примере, как добиться, чтобы в textBox можно было вставить только один элемент, а не как в примере.

Приветствую участников!
В прилагаемом примере элемент списка из ListBox1 методом Drag and drop
переносится в один из текстовых полей. В то же время данный элемент сохраняется в
в ListBox1.
Вопрос: что надо изменить, чтобы после переноса элемента он удалялся из исходного
ListBox1 . или хотябы менял цвет или вроде того.

В том же примере, как добиться, чтобы в textBox можно было вставить только один элемент, а не как в примере. Мур


Сообщение Приветствую участников!
В прилагаемом примере элемент списка из ListBox1 методом Drag and drop
переносится в один из текстовых полей. В то же время данный элемент сохраняется в
в ListBox1.
Вопрос: что надо изменить, чтобы после переноса элемента он удалялся из исходного
ListBox1 . или хотябы менял цвет или вроде того.

В том же примере, как добиться, чтобы в textBox можно было вставить только один элемент, а не как в примере. Автор — Мур
Дата добавления — 22.01.2014 в 12:22

nilem Дата: Среда, 22.01.2014, 14:20 | Сообщение № 2

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Dim arr

Private Sub UserForm_Initialize()
arr = Application.Transpose(Range(«A1», Cells(Rows.Count, 1).End(xlUp)))
Me.ListBox1.RowSource = «»
Me.ListBox1.List = arr
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
Dim MyDataObject As DataObject
Dim Msg As String
Dim Effect As Integer
If Button = 1 Then
Set MyDataObject = New DataObject
MyDataObject.SetText ListBox1.Value
Effect = MyDataObject.StartDrag(fmDropEffectMove) ‘fmDropEffectCopy
arr = Filter(arr, ListBox1.Value, False, vbTextCompare)
Me.ListBox1.List = arr
If Effect = 0 Then MsgBox (Msg)
End If
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Dim arr

Private Sub UserForm_Initialize()
arr = Application.Transpose(Range(«A1», Cells(Rows.Count, 1).End(xlUp)))
Me.ListBox1.RowSource = «»
Me.ListBox1.List = arr
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
Dim MyDataObject As DataObject
Dim Msg As String
Dim Effect As Integer
If Button = 1 Then
Set MyDataObject = New DataObject
MyDataObject.SetText ListBox1.Value
Effect = MyDataObject.StartDrag(fmDropEffectMove) ‘fmDropEffectCopy
arr = Filter(arr, ListBox1.Value, False, vbTextCompare)
Me.ListBox1.List = arr
If Effect = 0 Then MsgBox (Msg)
End If
End Sub

Яндекс.Деньги 4100159601573

Ответить

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit
Dim arr

Private Sub UserForm_Initialize()
arr = Application.Transpose(Range(«A1», Cells(Rows.Count, 1).End(xlUp)))
Me.ListBox1.RowSource = «»
Me.ListBox1.List = arr
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
Dim MyDataObject As DataObject
Dim Msg As String
Dim Effect As Integer
If Button = 1 Then
Set MyDataObject = New DataObject
MyDataObject.SetText ListBox1.Value
Effect = MyDataObject.StartDrag(fmDropEffectMove) ‘fmDropEffectCopy
arr = Filter(arr, ListBox1.Value, False, vbTextCompare)
Me.ListBox1.List = arr
If Effect = 0 Then MsgBox (Msg)
End If
End Sub

Мур Дата: Среда, 22.01.2014, 15:26 | Сообщение № 3

Большое спасибо! попробовал Ваш код, все работает. буду использовать его.

Скажите, как запретить ввод в textbox второго значения.

Большое спасибо! попробовал Ваш код, все работает. буду использовать его.

Скажите, как запретить ввод в textbox второго значения. Мур

Сообщение Большое спасибо! попробовал Ваш код, все работает. буду использовать его.

Скажите, как запретить ввод в textbox второго значения. Автор — Мур
Дата добавления — 22.01.2014 в 15:26

nilem Дата: Среда, 22.01.2014, 17:53 | Сообщение № 4

Яндекс.Деньги 4100159601573

Ответить

Мур Дата: Четверг, 23.01.2014, 09:58 | Сообщение № 5
Мур Дата: Четверг, 23.01.2014, 17:51 | Сообщение № 6
SkyPro Дата: Четверг, 23.01.2014, 18:04 | Сообщение № 7

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private mobjFromList As MSForms.ListBox
Private mlFrom As Long

Private Sub UserForm_Initialize()
Dim L As Long
For L = 0 To 50
Me.ListBox1.AddItem «Item » & L
Next
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)

Dim objData As DataObject
Dim lEffect As Long

Const lLEFTMOUSEBUTTON As Long = 1

If Button = lLEFTMOUSEBUTTON Then
Set objData = New DataObject
Set mobjFromList = Me.ListBox1
objData.SetText Me.ListBox1.Text
mlFrom = Me.ListBox1.ListIndex
lEffect = objData.StartDrag
End If
End Sub

Private Sub ListBox1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, _
ByVal Data As MSForms.DataObject, _
ByVal X As Single, _
ByVal Y As Single, _
ByVal DragState As MSForms.fmDragState, _
ByVal Effect As MSForms.ReturnEffect, _
ByVal Shift As Integer)

Cancel = True
Effect = fmDropEffectMove
End Sub


Private Sub ListBox1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, _
ByVal Action As MSForms.fmAction, _
ByVal Data As MSForms.DataObject, _
ByVal X As Single, _
ByVal Y As Single, _
ByVal Effect As MSForms.ReturnEffect, _
ByVal Shift As Integer)

Dim lTo As Long

With Me.ListBox1
lTo = .TopIndex + Int(Y * 0.85 / .Font.Size)
If lTo >= .ListCount Then lTo = .ListCount
Cancel = True
Effect = fmDropEffectMove
.AddItem Data.GetText, lTo
If mobjFromList = Me.ListBox1 And lTo = .ListCount Then lTo = .ListCount
Cancel = True
Effect = fmDropEffectMove
.AddItem Data.GetText, lTo
If mobjFromList = Me.ListBox2 And lTo

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private mobjFromList As MSForms.ListBox
Private mlFrom As Long

Private Sub UserForm_Initialize()
Dim L As Long
For L = 0 To 50
Me.ListBox1.AddItem «Item » & L
Next
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)

Dim objData As DataObject
Dim lEffect As Long

Const lLEFTMOUSEBUTTON As Long = 1

If Button = lLEFTMOUSEBUTTON Then
Set objData = New DataObject
Set mobjFromList = Me.ListBox1
objData.SetText Me.ListBox1.Text
mlFrom = Me.ListBox1.ListIndex
lEffect = objData.StartDrag
End If
End Sub

Private Sub ListBox1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, _
ByVal Data As MSForms.DataObject, _
ByVal X As Single, _
ByVal Y As Single, _
ByVal DragState As MSForms.fmDragState, _
ByVal Effect As MSForms.ReturnEffect, _
ByVal Shift As Integer)

Cancel = True
Effect = fmDropEffectMove
End Sub

Private Sub ListBox1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, _
ByVal Action As MSForms.fmAction, _
ByVal Data As MSForms.DataObject, _
ByVal X As Single, _
ByVal Y As Single, _
ByVal Effect As MSForms.ReturnEffect, _
ByVal Shift As Integer)

Dim lTo As Long

With Me.ListBox1
lTo = .TopIndex + Int(Y * 0.85 / .Font.Size)
If lTo >= .ListCount Then lTo = .ListCount
Cancel = True
Effect = fmDropEffectMove
.AddItem Data.GetText, lTo
If mobjFromList = Me.ListBox1 And lTo = .ListCount Then lTo = .ListCount
Cancel = True
Effect = fmDropEffectMove
.AddItem Data.GetText, lTo
If mobjFromList = Me.ListBox2 And lTo SkyPro

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private mobjFromList As MSForms.ListBox
Private mlFrom As Long

Private Sub UserForm_Initialize()
Dim L As Long
For L = 0 To 50
Me.ListBox1.AddItem «Item » & L
Next
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)

Dim objData As DataObject
Dim lEffect As Long

Const lLEFTMOUSEBUTTON As Long = 1

If Button = lLEFTMOUSEBUTTON Then
Set objData = New DataObject
Set mobjFromList = Me.ListBox1
objData.SetText Me.ListBox1.Text
mlFrom = Me.ListBox1.ListIndex
lEffect = objData.StartDrag
End If
End Sub

Private Sub ListBox1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, _
ByVal Data As MSForms.DataObject, _
ByVal X As Single, _
ByVal Y As Single, _
ByVal DragState As MSForms.fmDragState, _
ByVal Effect As MSForms.ReturnEffect, _
ByVal Shift As Integer)

Cancel = True
Effect = fmDropEffectMove
End Sub

Drag-drop in vb.net

I am new in visual basic and I followed one article to write this code to drag and drop images.

But I want to add an if statement to control drag-drop, so if picture 1 goes to picture box 2, it will give a message that it’s in the wrong place.

1 Answer 1

You could try altering your PBs_DragDrop code to check which PictureBox is being dropped to like this

Not the answer you’re looking for? Browse other questions tagged vb.net drag-and-drop draggable or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.11.35402


Drag & drop в visual basic

Если вам интересен язык VisualC++, то вы можете подписаться на рассылку Статей по Visual C++.

Приглашаем авторов статей к сотрудничеству с сайтом. Для того чтобы разместить на сайте статью надо заполнить форму или связаться с нами по E-Mail

Предлагаем владельцам сайтов добавить сабя в каталог на нашем сайте.

Новые статьи на сайте

1. Загрузка файлов из Интернета
Описываются методы класса WebClient. В частности на примере загрузки картинки и текстового файла из Интернета.
2. Как получить текушее время?
Описывается метод для получения текущего времени.
3. Как убрать значок выполняемого приложения из строки состояния Windows
В статье расказывается как убрать значёк программы из строки состояния Windows. В Visual Basic.NET это очень просто.
4. Алгоритм Кнута-Морриса-Пратта
При построении конечного автомата для поиска подстроки в тексте легко построить переходы из начального состояния в конечное принимающее состояние: эти переходы помечены символами подстроки.
5. Задание фонового рисунка его прорисовкой
Фоновый рисунок можно создать, выведя его в контекст графического устройства формы, т. е. обработав событие Paint или реализовав метод OnPaintBackground.
6. Двойная буферизация
Для пердотвращения мерцания при перерисовке изображения используют двойную буферизацию. Она обеспечивает построение изображения сначало в памяти.
7. Переопределение событий
При расширении функциональных возможностей компонентов часто возникает необходимость переопределить события так, чтобы при их генерации происходилоне только выбрасывание соответствующего объекта.
8. Создание многопоточного приложения в VB.NET
В Visual Basic 6 разработка многопоточных приложений была утомительной задачей — создание новых потоков порождало многочисленные ошибки. В VB.NET картина полностью изменилась, сейчас Вы имеете простоту и мощность Java во время работы с потоками.

Свежие компьютерные новости

24.12.2005 Продолжится рост рынка ноутбуков
24.12.2005 «Яндекс» будет показывать контекстную рекламу на обычных сайтах
24.12.2005 Евросоюз угрожает Microsoft новыми штрафами
23.12.2005 IDC предсказывает снижение темпов роста рынка ПК
23.12.2005 Полуторакилограммовый субноутбук Asus U5A
23.12.2005 Кадр дня: Концепт-компьютеры на базе Windows
23.12.2005 Nokia представила SDK для разработки игр
23.12.2005 На Mail.Ru открылась автомобильная барахолка
23.12.2005 Intel и BMW подписали партнёрское соглашение
23.12.2005 Бритни Спирс возглавила рейтинг запросов Yahoo

Операция Drag and Drop для элементов управления ListView

Следующий пример демонстрирует то, как для элементов управления ListView можно программировать операции Drag and Drop. В форме имеются два списка ListView. Один из них заполнен и состоит из двух столбцов, в то время как другой пуст. Использую операции Drag and Drop, можно буксировать элементы из первого списка во второй, заполняя его. Для реализации этого проекта достаточно в код сгенерированный мастером проекта, добавить инструкции:

Исходник к статье вы можете скачать здесь.

Книги с Озона

Visual Basic .NET. Библия пользователя

Visual Basic .NET — результат самых решительных изменений, когда-либо сделанных в популярном языке Visual Basic. Эта книга, написанная командой экспертов Visual Basic .NET, поможет вам овладеть всеми нюансами платформы .NЕТ, будь вы ветеран Visual Basic 6 или разработчик на АSР, или даже просто новичок в программировании. Начав с обзора новых объектно-ориентированных свойств, авторы познакомят вас с основами языка Visual Basic, со средой разработки Visual Studio .NET, технологиями АDО.NЕТ и ХМL и объяснят на примерах, как создавать формы Windows, приложения АSР.NЕТ и Web-сервисы.

Microsoft Visual Basic .NET 2003. Русская версия. Шаг за шагом (+ CD-ROM)

Visual Basic .NET 2003 — это профессиональная среда для разработки приложений, а практическое руководство из серии «Шаг за шагом» — быстрый путь к ее освоению.
Настоящее руководство с помощью пошаговых упражнений, примеров кода, подсказок по оптимизации и советов из реального мира проведет вас от основ программирования к высокоэффективной работе в Visual Basic .NET 2003. Эта книга содержит все, что требуется для перехода к созданию программного обеспечения, использующего .NET!
Вы освоите элементы управления из Toolbox, новые инструменты для отладки и структурные обработчики ошибок и научитесь создавать неотразимый интерфейс пользователя, изучите методы из библиотек классов .NET Framework 1.1, сможете управлять данными в программах с помощью коллекций, массивов и методик обработки строк, автоматизировать приложения Microsoft Office и управлять процессами, управлять формами Windows, создавать графику и анимационные эффекты. Вы научитесь составлять код для принтеров и диалоговые окна для печати, управлять базами данных Access, создавать собственные приложения баз данных, отображать документы HTML с помощью Microsoft Internet Explorer, использовать веб-формы для создания интерфейсов Интернет. Все файлы упражнений и примеры кода на Visual Basic .NET 2003 имеются на прилагаемом к книге CD-ROM.

Вопрос по Visual Basic 6.0, а именно по Drag&Drop

Я написал код на Visual Basic 6.0:

Dim ind As Integer ‘Объявляю переменную для хранения индекса нажатой картинки

‘Picture2 у меня испульзуется как «буфер обмена»

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Picture1(ind).Picture = Picture2.Picture ‘ После отпускания мыши на формe возвращаю картинку обратно
Picture2.Picture = LoadPicture() ‘Очищаю «буфер обмена»
End Sub

Private Sub Picture1_DragDrop(Index As Integer, Source As Control, X As Single, Y As Single)
ind = Index ‘Ложу в переменную индекс нажатой картинки
Picture1(Index).Picture = Picture2.Picture ‘ После отпускания мыши на PictureBox’e ложу в него картинку из «буфера обмена»
Picture2.Picture = LoadPicture() ‘Очищаю «буфер обмена»
End Sub

Private Sub Picture1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
ind = Index ‘Ложу в переменную индекс нажатой картинки
Picture1(Index).Drag ‘Начинаю перетаскивать картинку
Picture2.Picture = Picture1(Index).Picture ‘Ложу эту картику в «буфер обмена»
Picture1(Index).Picture = LoadPicture() ‘Очищаю место картики
End Sub

В коде я предусмотрел ситуацию если выкинуть картинку не в PictureBox, а на форму, так же я увидел если выкинуть картинку за форму то она пропадет. Подскажите, как это можно исправить?

Не понятно сама концепция будующей программы — ЧТО И КУДА НАДО ПЕРЕТЯГИВАТЬ ?
Вот примерчик
На форме массив из четырех Picture1 (0,1,2,3).
Перетаскивание (на самом деле — копирование) производится в Picture2

Вроде как не требуются никакие буферы обмена.. .
Главное не забыть у всех Picture1 поставить режим перетаскивания на ‘Автоматический»
А Может я не так все понял?

Visual Basic 6 — Example Three For Drag & Drop Operation

4. Example3 for Drag & Drop Type Question

4.1 Brief Description of Example3

Example 3 is slightly different from Example2.

This example (project) contains Drag & Drop for fill in the blanks type questions.

Also it explains how to display the blank spaces in middle of the question

Here control for answer option is created in the design view as control array (i.e. minimum no. of option given are 12)

These options are dragged and dropped on the required places


Fig9 Design view of the form for Drag & Drop fills in the blanks type questions

In the question two or more blank spaces may contain the same answer.Same answer is stored in the database for this

Observe the below table structure, here AnsSrNo 1 & 2 has the same answer

While giving Answer option to candidate only one option is given

That means duplicate Answer column is omitted.

For this small function is written which checks for duplicate answer colums

For more details of coding you can download below zip file (dragdropdemo2.zip) Which gives you the clear idea of the entire project

AnsSrNo Answer AnsRnd AnsSel Qid
1 Pattern 10 1
2 Pattern 12 1
3 Compile 1 1
4 [a][x]+ 8 1
5 Matcher 4 1
6 p 6 1
7 axxaxaxxax 3 1
8 m 2 1
9 group() 5 1
10 start 11 1
11 pattern 7 1
12 matcher 9 1

For example the question stored in the database may be looks as shown below

Note: *(star) in the question is for fill in blanks where candidate can drop the correct answer.

To retrieve the question field from table, a query is executed

For this first create a connection object and open the connection using ‘Open’ method

Next create recordset object where you can pass SQL statement to get the required records from particular table.

For Example to retrieve the Question field from table following query is written

Select Question from table name;

The above query displays all the records of the Question field from specified table.

After retrieving the question field we can bind the value of this field to required control or any variable.

In this project a procedure named displaythequestion is written. In this procedure value of the Question field is assigned to a String variable.

Procedure is written such a way that fist it extracts question, stored in the string variable. And based on the no. of question, control for question is created and question string is displayed in it.

Next it extracts the special character (**) from the question, stored in the string variable and depending on the no. of special character, control for the same is created.

Another procedure ‘displaythestring’ called inside the ‘displaythequestion’ procedure

Which combines the question with blanks and displays the whole question.

The method or technique used for dragging the control from source to destination is same as Example1. i.e. event procedure used to drag & drop control from source to destination is same.

Extra feature added in this example is Drag Over event of target object

This event is explained below

When we drag a source to a target when the mouse pointer is over the taget its backcolor is set to source backcolor with state=0 and when source is dropped to target its color is set back to the original color with state=1

Fig 10 Screen shot for Drag & Drop question Control before dragging to the target

Fig11 Screen shot for Drag & Drop type question control after being dragged to the target

Fig10 shows how control for question, fill in blanks and answer option is displayed

Fig11 is the Screen after the control is dragged and dropped in fill in blanks (i.e. in place of Placeholder)

4.2 Database Design

Fieldname Data Type
Qid Number
Qname Memo
AnsSrNo Number
Answer Memo
AnsRnd Number

AnsRnd Number used to display the answer option randomly to candidateQid Number


4.3 downloadable Zip file

5. References

5.1 Msdn Library Visual Studio6.0
5.2 Visual Basic 6 Programming Black Book Steven Holzner

Drag & Drop в VB/ASP Использование элементов управления, созданных во время выполнения

Это моя первая публикация в Stackoverflow, но я читал много вопросов и ответов в течение нескольких месяцев! Теперь я застрял, и мне отчаянно нужна помощь.

Фоновая информация: Сайт находится в http://www.mobiuspc.com, и этот раздел является кнопкой «Конфигуратор» в моей навигации по верхней строке.
Все написано в последнем вкусе VB.NET и ASP 3.5, и у меня есть сервер SQL2005, доступный с моим хостом.

Вот нижняя ‘грязная моя дилемма:
Во время pageload я получаю список всех частей в моей части таблицы. Затем я создаю объект изображения и 2 объекта метки для каждой записи и помещаю их в свой элемент fancy control. Отлично работает до сих пор, я могу получить гигантский список фотографий и текста, которые соответствуют тому, как мне это нравится (на данный момент). Теперь — мне действительно нужен способ заставить посетителя перетащить комбинацию изображений/ярлыков/ярлыков с аккордеона на панель (или что-нибудь действительно) с правой стороны, которая в настоящее время невидима. Как только перетаскиваемая вещь попадает в цель капли, я бы хотел, чтобы она запускала функцию или суб, которые я пишу в VB.

Из того, что я видел о jquery, видимо, есть способ сделать элемент на моей веб-странице перетаскиваемым, droppable или тем, что у вас есть. Пример кода для него — я не совсем понимаю, поэтому образец quickie был бы замечательным. Я быстро учащийся и могу применить его оттуда в моем проекте. Что еще более важно, как мне получить объекты, созданные во время выполнения, для перетаскивания, и запустить мое событие, которое я написал на единственном языке, который я знаю?

Вот как я создаю свои объекты времени выполнения as-is:

Затем страница загружается всем трио моего объекта image/label/label. Многие из них. Производительность не является проблемой на данный момент, я просто хочу, чтобы моя идея работала. Идея снова, однажды я каким-то волшебным образом «перетащил» один из моих созданных объектов в dropzone, а затем отпустил мышь, чтобы она фактически упала, что-то вроде этого будет выполнено (псевдокод):

Помощь любого рода была бы очень признательна! Если это вообще возможно, я хочу свести к минимуму мое взаимодействие с не-VB/ASP. Если я могу как-то просто пощекотать магическое свойство на объекте из моего окна кодирования vb, это было бы лучше.

Visual Basic 6 — Example Three For Drag & Drop Operation

4. Example3 for Drag & Drop Type Question

4.1 Brief Description of Example3

Example 3 is slightly different from Example2.

This example (project) contains Drag & Drop for fill in the blanks type questions.

Also it explains how to display the blank spaces in middle of the question

Here control for answer option is created in the design view as control array (i.e. minimum no. of option given are 12)

These options are dragged and dropped on the required places

Fig9 Design view of the form for Drag & Drop fills in the blanks type questions

In the question two or more blank spaces may contain the same answer.Same answer is stored in the database for this

Observe the below table structure, here AnsSrNo 1 & 2 has the same answer

While giving Answer option to candidate only one option is given

That means duplicate Answer column is omitted.

For this small function is written which checks for duplicate answer colums

For more details of coding you can download below zip file (dragdropdemo2.zip) Which gives you the clear idea of the entire project

AnsSrNo Answer AnsRnd AnsSel Qid
1 Pattern 10 1
2 Pattern 12 1
3 Compile 1 1
4 [a][x]+ 8 1
5 Matcher 4 1
6 p 6 1
7 axxaxaxxax 3 1
8 m 2 1
9 group() 5 1
10 start 11 1
11 pattern 7 1
12 matcher 9 1

For example the question stored in the database may be looks as shown below

Note: *(star) in the question is for fill in blanks where candidate can drop the correct answer.

To retrieve the question field from table, a query is executed

For this first create a connection object and open the connection using ‘Open’ method

Next create recordset object where you can pass SQL statement to get the required records from particular table.

For Example to retrieve the Question field from table following query is written


Select Question from table name;

The above query displays all the records of the Question field from specified table.

After retrieving the question field we can bind the value of this field to required control or any variable.

In this project a procedure named displaythequestion is written. In this procedure value of the Question field is assigned to a String variable.

Procedure is written such a way that fist it extracts question, stored in the string variable. And based on the no. of question, control for question is created and question string is displayed in it.

Next it extracts the special character (**) from the question, stored in the string variable and depending on the no. of special character, control for the same is created.

Another procedure ‘displaythestring’ called inside the ‘displaythequestion’ procedure

Which combines the question with blanks and displays the whole question.

The method or technique used for dragging the control from source to destination is same as Example1. i.e. event procedure used to drag & drop control from source to destination is same.

Extra feature added in this example is Drag Over event of target object

This event is explained below

When we drag a source to a target when the mouse pointer is over the taget its backcolor is set to source backcolor with state=0 and when source is dropped to target its color is set back to the original color with state=1

Fig 10 Screen shot for Drag & Drop question Control before dragging to the target

Fig11 Screen shot for Drag & Drop type question control after being dragged to the target

Fig10 shows how control for question, fill in blanks and answer option is displayed

Fig11 is the Screen after the control is dragged and dropped in fill in blanks (i.e. in place of Placeholder)

4.2 Database Design

Fieldname Data Type
Qid Number
Qname Memo
AnsSrNo Number
Answer Memo
AnsRnd Number

AnsRnd Number used to display the answer option randomly to candidateQid Number

4.3 downloadable Zip file

5. References

5.1 Msdn Library Visual Studio6.0
5.2 Visual Basic 6 Programming Black Book Steven Holzner

Drag & drop в visual basic

Всем доброго времени суток!

Задача такая: автоматизировать работу пользователя таким образом, чтобы он мог перетаскивать с помощью D&D файлы изображений в произвольные ячейки таблицы и эти изображения автоматически подстраивались под размеры ячейки и отображались в ней.

Решения интерфейсом стандартной панели вставки не участвуют в обсуждении :), макросы с окном типа «выбрать файл с картинкой» и потом разместить ее в текущей ячейке — так же не интересны.

Смысл — использовать именно D&D причем не среди элементов конкретной UserForm, а именно — из-за пределов окна Excel — например из открытого рядом проводника. Возможно ли обработать такое событие в принципе?! Как к нему привязаться — в списке предлагаемых событий Книги и Листа ничего похожего нет. При этом Excel обрабатывает D&D в какой-то степени — при перетаскивании файла в таблицу курсор меняется на «стрелку с плюсом», просто ничего не происходит.

Все ответы

Насколько я смог понять, нельзя перехватить событие Drag and Drop в VBA для Excel. Программа обрабатывает D&D сама, при этом пользователь к этому не допускается. Разговор о переносе файла из проводника в таблицу.

Появилась альтернатива: воспользоваться стандартным буфером обмена (clipboard). Но и тут оказывается не все просто. В VBA это объект DataObject, но на уровне языка это пара методов .GetText и .SetText — в моем случае они не дают никаких преимуществ, т.к. буфер содержит совсем не текст! К тому же тип его не известен — т.к. заполняется буфер вне проекта и вообще вне Excel.

Можно решить это все, используя WinAPI, но это снова совершенно новая для меня тема.

OpenClipboard(0) — вроде бы должна возвращать адрес буфера текущего приложения. Но в документации говорится про Null, а Null у меня выдает ошибку, работает только с 0.

Перечислил возможные форматы полученного буфера (для эксперимента, с помощью EnumClipboardFormats). Там следующие значения: 49161 (DataObject), 1, 49171 (Ole Private Data), 16, 7, 13.

А вот что дальше с этим всем делать — мне не понятно. Пробовал применять GetClipboardData() к 49161 и 49171 — возвращаются большие цифры, разные. Потом к ним применял GlobalLock() и GlobalSize() — пытался хоть получить размеры объектов, но получал 0-и. Ну и в принципе все. что дальше делать не понятно.

Илон Маск рекомендует:  Что такое код ovrimos_result_all
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL