63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Реализовать перетаскивание чего либо

22.05.2014, 13:32. Показов 2051. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
как можно реализовать перетаскивание чего либо с панели (например) на форму? т.е. как в норм приложениях бывает на панельке лежат какие то ... ну там не знаю в общем что то лежит, например геометрические фигуры, квадрат круг... взял мышкой, перетащил на image, отпустил, на image остался квадрат допустим... или картинки какие то перетаскивать... в общем интересует сам процесс анимации переноса... я могу только предположить что надо сделать по картинке которую перетаскиваешь курсор и его подставлять, но это такой гемор... может можно как то это просто сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2014, 13:32
Ответы с готовыми решениями:

Как сделать какое-либо действие сразу после запуска программы, без нажатия чего-либо
Как сделать какое-либо действие сразу после запуска программы, без нажатия чего-либо?

Как реализовать отпускание? (реализую перетаскивание геом.фигуры на канве)
Захват происходит по событию onDown,перетаскивание Onmove, отпускание при событии onUp. как...

С помощью чего реализовать импорт?
Надо реализовать импорт большого количества(несколько тысяч строк) данных из Excel в MS SQL....

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

17
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
22.05.2014, 14:56 2
вариант 1)
при перетаскивании показывается только курсор с прилепленным прямоугольничком - реализуется автоматически после вызова component1.BeginDrag()
вариант 2)
создается Drag объект там хранится и перерерисовывается Bitmap и тащится целая картинка
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 15:13  [ТС] 3
не совсем понял чем отличается второй вариант от первого, но первый наверное подходит... только можно пример как это сделать?
0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
22.05.2014, 15:15 4
http://www.delphimaster.ru/articles/dragndrop/
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 15:54  [ТС] 5
krapotkin, там только про перетаскивание текста
0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
22.05.2014, 16:12 6
Секрет в том, что на самом деле ничего не перетаскивается вообще!
Просто запускается режим drag'n'drop
и в конце возникает событие OnDrop,
где указано откуда начали тащить и где закончили.
А уже пользуясь этой информацией, программист решает что нужно сделать -
скопировать текст, поменять координаты компонента, или открыть новое окно...
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 16:26  [ТС] 7
и в конце возникает событие OnDrop,
где указано откуда начали тащить и где закончили.
как в событии может быть что то указано это же событие? где конкретно там это указано и еще я хочу чтоб именно при перетаскивании к курсору "прилипал" перетаскиваемый объект (кстати что это за объект? если тащить изображения мне использовать TImage для каждого изображения?)
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,248
22.05.2014, 16:41 8
OnDragDrop
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 18:20  [ТС] 9
northener, там все на инглише =(
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
22.05.2014, 18:54 10
Цитата Сообщение от GetHelp Посмотреть сообщение
чего либо с панели (например) на форму?
+ еще вариант - имплементировать форме интерфейс IDropTarget (форма является приемником драг-н-дропа), но
Цитата Сообщение от GetHelp Посмотреть сообщение
там все на инглише =(
если поискать, то Заметки про Drag&Drop в Delphi.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 19:07  [ТС] 11
cotseec, первая ссыль на иглише, я его не понимаю... вторая ссыль большая статья, но толком для себя ничего не нашел... короче я определился что конкретно мне нужно: сразу отметаю всякие переносы файлов на форму, переносы текста из компонента в компонент... и возможно даже отметаю переносы компонентов, т.к. ну допустим я буду тащить TImage, он прямоугольный, а рисунок допустим тот же круг, я хочу чтобы за курсором тащился сам рисунок как он есть, а не прямоугольный имейдж, да и image будет тащиться меняя свои координаты на форме насколько я понял, а мне надо чтобы он как бы прилипал к курсору, ну неужели вы ни разу такого не видели? в крупных приложениях так часто бывает... ну вот к примеру откройте пасьянс солитер и попробуйте перетащить карту со стола в дом, вот как то так мне и надо перетаскивать...
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
22.05.2014, 19:55 12
как то так? Project1.zip (создается случайное количество "картинок" при старте программы, картинки можно перетасиквать)
код без проверок и прочего
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
unit Unit1;
 
interface
 
uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms,
  ExtCtrls, Messages, Math;
 
type
  TImage = class (ExtCtrls.TImage)
  private
    FDrag: BOOL;
    dX, dY: integer;
  public
    constructor Create(AOwner:TComponent); override;
    procedure WMLButtonUp(var Message: TWMLButtonUp);  message WM_LBUTTONUP;
    procedure WMLButtonDown(var Message: TWMLButtonDown); reintroduce; message WM_LBUTTONDOWN;
    procedure WMMouseMove(var Message: TWMMouseMove); reintroduce; message WM_MOUSEMOVE;
  end;
 
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TImage }
 
constructor TImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
 
  Randomize;
  Canvas.TextOut(5, 5, Format('Picture №%d', [RandomRange(12345, 98765)]));
  FDrag := false;
end;
 
procedure TImage.WMLButtonDown(var Message: TWMLButtonDown);
begin
  inherited;
  
  FDrag := true;
 
  dX := Mouse.CursorPos.X;
  dY := Mouse.CursorPos.Y;
end;
 
procedure TImage.WMLButtonUp(var Message: TWMLButtonUp);
begin
  inherited;
 
  FDrag := false;
end;
 
procedure TImage.WMMouseMove(var Message: TWMMouseMove);
begin
  inherited;
 
  if FDrag then
  begin
    Left := Left + (Mouse.CursorPos.X - dX);
    Top := Top + (Mouse.CursorPos.Y - dY);
    dX := Mouse.CursorPos.X;
    dY := Mouse.CursorPos.Y;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i, Count: integer;
begin
  Randomize;
 
  Count := RandomRange(5, 30);
  for i := 0 to Count - 1 do
    with TImage.Create(Self) do
    begin
      Parent := Self;
      Top := Random(Self.Height) + 1;
      Left := Random(Self.Width) + 1;
 
    end;
end;
 
end.
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 20:37  [ТС] 13
cotseec, вот ! это уже похоже на то что нужно, а можно как то устранить эффект мерцания картинок при перетаскивании? и еще как все таки быть если я хочу чтобы перемещалась картинка не стандартной формы? круг, треугольник и т.п.? честно говоря у меня есть желание написать редактор блок-схем, там как раз надо будет перетаскивать фигурки с панели на лист (допустим image) и хочется чтобы перетаскивались именно фигурки как они есть, если это круг то к курсору чтобы прилипал именно круг, а не квадратный image с нарисованным кругом...
0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
22.05.2014, 20:47 14
можно я опять залезу с дегтем?

для редактора блок-схем этот вариант плохо подходит. VCL не для этого предназначен.
все, что связано с графикой, нужно просто рисовать на PaintBox
там никакой системный drag'n'drop тоже не покатит.
Будет контроль перемещений мыши и нажатий клавиш...
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
22.05.2014, 22:29 15
Цитата Сообщение от krapotkin Посмотреть сообщение
VCL не для этого предназначен.
все, что связано с графикой, нужно просто рисовать на PaintBox
Редактор блок схем все рисуется на канве MDI окна (по сути TImage - часть окна) + буферизация

Цитата Сообщение от GetHelp Посмотреть сообщение
а можно как то устранить эффект мерцания картинок при перетаскивании? и еще как все таки быть если я хочу чтобы перемещалась картинка не стандартной формы? круг, треугольник и т.п.?
по поводу мерцания - я привел всего лишь пример, для исключения мерцания используйте буферизацию.
для "нестандартных" картинок, варианты:
1 у TImage есть свойство Transparent
2 TShape
3 свои классы, например, от TGraphicControl
4 OpenGL, DirectDraw, GDI, GDI++
0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
22.05.2014, 22:38 16
Цитата Сообщение от cotseec Посмотреть сообщение
на канве MDI окна
Это, собственно, почти ничем не отличается от PaintBox. Имеется в виду рисование на Canvas против создания визуальных компонентов.

1.TImage.Transparent - до сих пор реализует дремучий вариант с TransparentColor
2.TShape - ограниченное количество фигур
3. TGraphicControl - т.к. все равно рисовать нужно самостоятельно, то все сводится к замечательному варианту 4.
Цитата Сообщение от cotseec Посмотреть сообщение
OpenGL, DirectDraw, GDI, GDI++
хотя, конечно, хозяин-барин
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
22.05.2014, 23:09  [ТС] 17
cotseec,

1. мне не нужны готовые решения, я хочу все написать сам...
2. что такое буферизация?
3. а Transpanent это тема.. можно попробовать...
4. TShape фигур мало... да и не удобно это... блок-схемы они же длинные могут быть, да еще стрелки нужны, надписи и т.п.
5. для написания своих классов я увы плоховато знаю делфи... сейчас больше на си пишу, просто в си интерфейс реализовать это гемор... токо через винапи... а c# я не знаю вообще... (надо бы заняться изучением так то...)
6. OpenGL тоже не знаю, но давно планирую заняться изучением... но это уже если буду в OpenGL то только в си... остальное названное вообще впервые слышу =)

в общем видимо правда придется все это реализовывать либо через Canvas, либо через OpenGL...

Не по теме:

никак не пойму как тут цитировать?

0
5775 / 4519 / 1429
Регистрация: 14.04.2014
Сообщений: 20,136
Записей в блоге: 20
23.05.2014, 08:35 18
Рисование любым способом подразумевает набор первичных примитивов, из которых строится рисунок.
Canvas очень сильно повторяет WinAPI и довольно скуден.
Для красоты-красоты лучше использовать GDI+ или OpenGL.
и то и другое в паре со словом Delphi в поиске прямо на первых строчках. В большом количестве

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
никак не пойму как тут цитировать?
выделяешь мышью, рядом появляется кнопка "Цитировать"

0
23.05.2014, 08:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2014, 08:35
Помогаю со студенческими работами здесь

Бронирование чего либо , как реализовать ?
Всем привет! Пишу клиент -серверное приложение (библиотека) , надо реализовать бронирование книг ,...

C vs C++: Есть-ли что-либо в С++, чего нельзя реализовать в Си, и наоборот?
Я тут прочёл одну статейку о языках программирования, и там одна персона яростно пыталась доказать,...

нужно реализовать решение данных задач либо в C++, либо в Delphi
нужно реализовать решение данных задач либо в C++, либо в Delphi

Как реализовать перетаскивание текста?
Технология "Хватай и беги" типа Drag and Drop Как реализовать перетаскивание части текста из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru