Option Explicit On
Public Class Form1
Dim MouseX, MouseY As Single
Dim ImgFolder As Object
Dim vbBeginDrag As Object
Dim vbLeftButton As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: данная строка кода позволяет загрузить данные в таблицу "_ДЛЯ_ПРОГРАММЫ____БЛЯТЬ1DataSet.Основная". При необходимости она может быть перемещена или удалена.
Me.ОсновнаяTableAdapter.Fill(Me._ДЛЯ_ПРОГРАММЫ____БЛЯТЬ1DataSet.Основная)
End Sub
Private Sub ОсновнаяBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ОсновнаяBindingNavigatorSaveItem.Click
Me.Validate()
Me.ОсновнаяBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me._ДЛЯ_ПРОГРАММЫ____БЛЯТЬ1DataSet)
End Sub
Private Sub ОсновнаяDataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ОсновнаяDataGridView.CellContentClick
End Sub
Private Sub RectangleShape1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RectangleShape1.Click
End Sub
Private Sub PictureBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = vbLeftButton Then
Call ImgFolder.Drag(vbBeginDrag)
MouseX = X
MouseY = Y
End If
End Sub
Private Sub Form_DragDrop(ByVal Source As Control, ByVal X As Single, ByVal Y As Single)
Source.Move (X - MouseX), (Y - MouseY)
End Sub
End Class
подскажите пожалуйста как на форме создать объект(например прямоугольник) который можно передвигать мышью(новичок)
Долго рылся в инете но ничего конкретного не нашел..
Обрабатывать события нажатия кнопок и перемещения мышки и перерисовывать прямоугольник.
поконкретней бы...
Ну например я создал на форме PictureBox1 можно ли сделать так чтобы при запуске я мог таскать его мышью по форме?
При отпускании кнопки мыши на PictureBox1 сбросить флаг.
При перемещении мыши на PictureBox1, если выставлен флаг, изменить координаты PictureBox1 на разницу между текущими координатами курсора и запомненными.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DragExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Point DragStart = new Point(-1, -1);
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Control moving = sender as Control;
if (DragStart.X == -1)
{
DragStart = e.Location;
}
moving.Left += e.X - DragStart.X;
moving.Top += e.Y -DragStart.Y ;
}
else
{
DragStart.X = -1;
}
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DragExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Point DragStart = new Point(-1, -1);
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Control moving = sender as Control;
if (DragStart.X == -1)
{
DragStart = e.Location;
}
moving.Left += e.X - DragStart.X;
moving.Top += e.Y -DragStart.Y ;
}
else
{
DragStart.X = -1;
}
}
}
}
Флаг не нужен - кнопка мышки она же флаг.
Но надо запоминать где началось перетаскивание - и вычислять дельту.
Это потому, что виби. На нем мало примеров публикуют. Шарп-сообщество больше.
Код:
D129 сложновато чет для понимания для меня то что ты написал) куда ток их не пробовал вставлять, одни ошибки...
три дня в бейсике...
и нужна небольшая база по ним с полями готовность, даты нач\завершения работ, цех(добавил ее в VB через access) а вот как подцепить ее к объектам(квадратикам) и как сделать чтобы их можно было перемещать по изображению еще не разобрался.
мб не то для ее реализации я выбрал? или мб кто то подскажет что то уже готовое(сходное)?
На VB тут не очень много людей любит писать, но вообще примеров в интернете достаточно. Лучше, конечно, на C#/C++ перейти, какие-нибудь Qt и что там сейчас, MWF.
да я немного в школе с ним работал , потому в него и полез
С#/С++ мне увы вобще незнакомы так что попробую вс еже на бейске доделать
Три дня жалко. Бейсик, который вы учили в школе - так же отличается от виби дот нет, как и от C#. Так что очень советую.
Но ничего страшного.
Евент надо было использовать не клик, а MouseMove. Он самый полезный.
В винформах он есть и на бейсике.
:-) :-) :-)
Код:
Dim DragStart as Point
Private Sub pictureBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If (e.Button = MouseButtons.Left) Then
Dim moving As Control = TryCast(sender,Control)
If (Me.DragStart.X = -1) Then
Me.DragStart = e.Location
End If
moving.Left = (moving.Left + (e.X - Me.DragStart.X))
moving.Top = (moving.Top + (e.Y - Me.DragStart.Y))
Else
Me.DragStart.X = -1
End If
End Sub
Private Sub pictureBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If (e.Button = MouseButtons.Left) Then
Dim moving As Control = TryCast(sender,Control)
If (Me.DragStart.X = -1) Then
Me.DragStart = e.Location
End If
moving.Left = (moving.Left + (e.X - Me.DragStart.X))
moving.Top = (moving.Top + (e.Y - Me.DragStart.Y))
Else
Me.DragStart.X = -1
End If
End Sub
Буду настаивать, что вы должны разобраться в этом коде, а не сделать хардкодед для всех 30 товаров отдельные обработчики.
ок буду въезжать
"БЛЯТЬ" - ну это просто была далеко не первая попытка туда таблицу засунуть)
она кстати так и не заработала толком.. поля в которых в access'е я ставил выбор значений из другой вспомогательной таблицы и поля с датой не работают.. нет выдора календаря и значений, все перенеслось и таблицы и связи между ними и формат ячеек.. не работает..
Код:
Randomize()
For i As Integer = 0 To 1
Dim p As New Panel()
p.Width = 22
p.Height = 22
p.BackColor = Color.Blue
p.Left = Int(Me.Width - 640)
p.Top = Int(Me.Height - 590)
AddHandler p.MouseMove, AddressOf p_MouseMove
Me.Controls.Add(p)
Next
End Sub
Private Sub p_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Control.MouseButtons = Windows.Forms.MouseButtons.Left Then
CType(sender, Panel).Left = Control.MousePosition.X - Me.Left - CType(sender, Panel).Width
CType(sender, Panel).Top = Control.MousePosition.Y - Me.Top - CType(sender, Panel).Height
End If
End Sub
For i As Integer = 0 To 1
Dim p As New Panel()
p.Width = 22
p.Height = 22
p.BackColor = Color.Blue
p.Left = Int(Me.Width - 640)
p.Top = Int(Me.Height - 590)
AddHandler p.MouseMove, AddressOf p_MouseMove
Me.Controls.Add(p)
Next
End Sub
Private Sub p_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Control.MouseButtons = Windows.Forms.MouseButtons.Left Then
CType(sender, Panel).Left = Control.MousePosition.X - Me.Left - CType(sender, Panel).Width
CType(sender, Panel).Top = Control.MousePosition.Y - Me.Top - CType(sender, Panel).Height
End If
End Sub
Ну ничего невозможного -
Ваш цикл надо изменить, и использовать на данных запроса из базы (а не просто от 0 до 30)
бежать по строчкам, вытаскивать из них и координаты, и размеры и цвет, и давать панельке.
Маленький совет по оптимизации - CType(sender, Panel) - это кастинг, приведение типа, относительно тяжелая операция. Ее имеет смысл делать один раз на уровне функции, подобно моему примеру, да и код будет менее замусорен скобочками.
ок, направление понял щас попробую это все "переварить"
А как можно сохранить положение квадратиков оторые я раскидал по плану? таблица сохраняется а положение квадратиков нет..
Код:
Private Sub Panel_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Control.MouseButtons = Windows.Forms.MouseButtons.Left Then
CType(sender, Panel).Left = Control.MousePosition.X - Me.Left - CType(sender, Panel).Width
CType(sender, Panel).Top = Control.MousePosition.Y - Me.Top - CType(sender, Panel).Height
End If
End Sub
Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
AddHandler (Panel1.MouseMove), AddressOf Panel_MouseMove
Me.Controls.Add(Panel1)
End Sub
If Control.MouseButtons = Windows.Forms.MouseButtons.Left Then
CType(sender, Panel).Left = Control.MousePosition.X - Me.Left - CType(sender, Panel).Width
CType(sender, Panel).Top = Control.MousePosition.Y - Me.Top - CType(sender, Panel).Height
End If
End Sub
Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
AddHandler (Panel1.MouseMove), AddressOf Panel_MouseMove
Me.Controls.Add(Panel1)
End Sub
и как к строке можно подвязать объект после этого?
Private Sub Panel1_Paint
не тот эвент, который нужен когда панелька уже добавлена.
У вас она будет добавляться каждый раз при перерисовке самой панельки, а это логически неправильно - вы размножите то, что должно быть только в одном экземпляре. Этот эвент сугубо технический, его надо использовать если вы нарисовали графическую линию, и эта линия не является обьектом типа Control.
Сохранять положение панельки после перетаскивания - очень просто, надо просто сохранять положение обьека сразу после перетаскивания в базе.
:-)
Как вы будете это делать - зависит от ваших знаний и следовательно, дизайна программы - можно и просто запрос написать.
Вы все-таки почитайте учебник какой-нибудь, только не для чайников. Нереально в форуме выучить сразу все и с нуля.
Все то и не требуется мне, мб подскажите какой нибудь учебник на VB 2010? ато один зиборов повсюду...