Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/26: Рейтинг темы: голосов - 26, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22

Динамическое создание объекта + Drag&Drop

28.01.2013, 17:20. Показов 5437. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Такая вот задачка:
Мне нужно по щелчку на кнопку динамически создавать компонент (скажем типа Shape) - это я умею.
Так же нужно реализовать Drag&Drop. Для компонента который я сам устанавливаю на форме я так же могу этого добиться.
Вся загвоздка в том, чтобы создать этот компонент динамически и чтобы этот объект можно было тягать по форме.
Прошу знающих людей подсказать, как возможно это реализовать.

Добавлено через 2 часа 19 минут
Это возможно хоть? Есть смысл ковырять?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2013, 17:20
Ответы с готовыми решениями:

Drag&Drop WebBrowser
Добрый день господа! Поможите чем можите ))) Делаю для себя программу для упрощения размещения объявлений на досках. Изначально задача...

Drag&Drop и TShellListview
Всем привет. Есть исходный код drag & drop для TShellListView. Не получается перетащить файлы из проводника в этот компонент, из компонента...

Drag&Drop в Delphi
Народ привет!!!!! Подскажите пожалуйста, как в Delphi сделать перетаскивание компонента Label или Shape, можете отправить код, или дать...

21
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
29.01.2013, 07:42
А в чем проблема?
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 08:59  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
А в чем проблема?
Проблема следующая:
Я не знаю как создать динамический компонент, с таким свойством, чтобы его можно было двигать.
Вот когда сам перетащил его на форму, в обработчиках событий этого компонента прописал немного кода и все двигается.
А вот как при создании компонента сразу его таким сделать не знаю(
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
29.01.2013, 09:07
Я не понимаю.
Создать компонент вы можете.
Обращаться к компоненту - тоже.
По вашему посту, вы можете обращаться только к компоненту, созданному в design-time, но не в run-time.
Но я не вижу разницы, в чем проблема к обращении к run-time компоненту - он точно такой же.
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 09:54  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Я не понимаю.
Создать компонент вы можете.
Обращаться к компоненту - тоже.
По вашему посту, вы можете обращаться только к компоненту, созданному в design-time, но не в run-time.
Но я не вижу разницы, в чем проблема к обращении к run-time компоненту - он точно такой же.
Разница в том, что когда я работаю с компонентом в design-time, то я просто через инспектор объектов вешаю на события (Image1MouseMove,Down,Up) код, который позволяет мне реализовать Drag&Drop.
А куда вешать события объекта которого еще нет и возможно не будет? Что три события(процедуры) запихивать в тело конструктора объекта? Но я не представляю как....

Добавлено через 31 минуту
Вот код который я использую, для того чтобы реализовать Drag&Drop

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
var
  Form1: TForm1;
  x0,y0:integer;
  move:boolean;
...
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
image1.Left:=image1.Left+x-x0; // Изменяем позицию левого края
image1.Top:=image1.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
Можно пример на базе этого сделать, только чтобы этот компонент Image1 был создан в run-time
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
29.01.2013, 09:56
Цитата Сообщение от stasagent Посмотреть сообщение
А куда вешать события объекта которого еще нет и возможно не будет? Что три события(процедуры) запихивать в тело конструктора объекта? Но я не представляю как....
Теперь понятно.
Дык, надо было спросить - "как присвоить событие контролу, созданному динамически".
Очень просто.
1. Смотрите сигнатуру вашего нужного события.
Для этого в коде набираете нужный контрол и событие, типа, mycontrol.myevent, и на myevent кликаете с нажатым контролом. Вас выкинет куда-то типа Controls.pas, возможно, там придется пройтись поиском, но в результате увидите что-то вроде
Delphi
1
property OnDragDrop: TDragDropEvent;
где
Delphi
1
TDragDropEvent = procedure(Sender: TObject; ...) of object;
2. Написать процедуру у объекта с ровно такой сигнатурой.
типа
Delphi
1
2
3
4
procedure TMyForm.DoOnDragDrop (Sender: TObject;...)
begin
...
end;
3. присвоить ее вашему контролу. не ставить скобки!
Delphi
1
2
3
4
procedure TMyForm.MySuperPuperInitialization;
begin
mycontrol.myevent = DoOnDragDrop;
end;
Аст! Фсе!
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
29.01.2013, 12:19
Я делаю проще: кто мешает временно бросить на форму компонент, который потом будет создаваться в рантайме, назначить ему обработчик события, которое нужно будет назначать динамически, скопировать процедуру обработки события под другим именем, и удалить компонент со всеми его обработчиками событий? В итоге имеем правильно созданный самой IDE обработчик, останется только прописать его заголовок в секцию public/private или protected...
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 13:16  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Я делаю проще: кто мешает временно бросить на форму компонент, который потом будет создаваться в рантайме, назначить ему обработчик события, которое нужно будет назначать динамически, скопировать процедуру обработки события под другим именем, и удалить компонент со всеми его обработчиками событий? В итоге имеем правильно созданный самой IDE обработчик, останется только прописать его заголовок в секцию public/private или protected...
Интересная мысль)
А можно пример кода, просто чтобы наглядно было.
Компонент который является родителем для следующих его копий кстати можно и не удалять.

Добавлено через 59 секунд
Цитата Сообщение от dondublon Посмотреть сообщение
Дык, надо было спросить - "как присвоить событие контролу, созданному динамически".
Сори, если не понятно написал. Сейчас буду пробовать, главное на мысль натолкнул)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
29.01.2013, 13:46
Пример какого кода? Ну, скажем, тебе надо добавить OnMouseDown динамически. Что делаем? Кладем компонент TImage, и даблкликом по событию OnMouseDown создаем обработчик. Код принимает вид:
Кликните здесь для просмотра всего текста
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 
end;
 
end.

Сразу же копируем обработчик Image1MouseDown под другим именем, и добавляем прототип в класс формы:
Кликните здесь для просмотра всего текста
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer); // Вот прототип
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer); // Вот он, скопированный обработчик
begin
   //
end;
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 
end;
 
end.

, после чего сохраняем проект, пустой Image1MouseDown будет удален, и останется то, что нужно:
Кликните здесь для просмотра всего текста
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
  private
    { Private declarations }
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   //
end;
 
end.


При необходимости компонент Image1 с формы - удаляем. Всё, процедуру MyMouseDown можно присваивать обработчику OnMouseDown любого компонента. Дописываешь внутри этой процедуры код, который должен выполняться, но обращаешься не к конкретному элементу, а через Sender. Скажем, если ты уверен, что будет обрабатываться событие нажатия на TImage - то

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var img : TImage;
begin
   img := Sender as TImage; // Если будет другой компонент - то приводить надо к другому типу
   img.Left := img.Left + x - x0; // Изменяем позицию левого края
   img.Top := img.Top + y - y0; // Изменяем позицию верхнего края
end;
Вот и всё, собственно...
1
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 15:34  [ТС]
Спасибо вам громадное ребята!)))))

Добавлено через 1 час 7 минут
Вот в принципе все реализовал, только сейчас ругается среда.
У меня две формы (ну и два Unit соответственно).
Мне нужно, чтобы после нажатия на кнопку создать на второй форме, чтобы на первой форме появлялся компонент типа TImage.
Того, чтобы он появлялся на первой форме я добился
Delphi
1
Shape := TShape.Create(Form1); Shape.Parent := Form1;
Но после того как прикрутил возможность перемещать созданный мною динамический TImage, стало выбивать ошибку. Видимо не совсем все косячу с тем, где нужно присваивать события. Если все завязанно на одной форме, то все работает прекрасно, но вот введя вторую форму((( Такое ощущение, что мои события, которые я создал - не видны в соседнем Unit.
Посмотрите пожалуйста:
Это код Unit1, пустой практически. Тут только в разделе Uses я прописал Uses2.
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
type
    TForm1 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N6Click(Sender: TObject);
  private
    { Private declarations }
 
  public
    { Public declarations }
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses Unit2;
 
{$R *.dfm}
 
end.
А во втором уже собственно кнопка, которая создает на Form1 компонент типа Image и тут же прописаны обработчики событий _MouseDown, _MouseMove, _MouseUp
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
 procedure BitBtn2Click(Sender: TObject);
 
  private     //-------------------Тут декларирую процедуры
    { Private declarations }
    procedure _MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
    procedure _MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
    procedure _MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  public
 
  end;
 
var
  Form2: TForm2;
  x0,y0:integer;
  move:boolean;
  Image: TImage;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
//------------------------------Тут создаю обработчики нажатия кнопки на мыше
 procedure TForm1._MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm1._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Image.Left:=Image.Left+x-x0; // Изменяем позицию левого края
Image.Top:=Image.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm1._MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
 
//---------------------------------------------------
 
procedure TForm2.BitBtn2Click(Sender: TObject);    //тут собственно создаю сам объект на Form1
var Image: TImage;
begin
  Image := TImage.Create(Form1);
  Image.Parent := Form1;
  Image.Picture.LoadFromFile('refregiratot.jpg');
  Image.OnMouseDown :=_MouseDown;
  Image.OnMouseMove :=_MouseMove;
  Image.OnMouseUp :=_MouseUp;
 end;
 
end.
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
29.01.2013, 15:59
Цитата Сообщение от stasagent Посмотреть сообщение
Такое ощущение, что мои события, которые я создал - не видны в соседнем Unit.
А они и не должны быть там видны, исходя из правильной архитектуры приложения.
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 17:06  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
А они и не должны быть там видны, исходя из правильной архитектуры приложения.
Так а как же сделать так, чтобы можно было реализовать задачу?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
29.01.2013, 17:15
Цитата Сообщение от stasagent Посмотреть сообщение
Если все завязанно на одной форме, то все работает прекрасно
Знаешь, не очень верится. Потому что
Цитата Сообщение от stasagent Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
procedure TForm1._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Image.Left:=Image.Left+x-x0; // Изменяем позицию левого края
Image.Top:=Image.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
Что такое у тебя Image? Вообще-то, была такая ЛОКАЛЬНАЯ переменная в тот момент, когда ты создавал объект. к Глобальной переменной Image она не имеет (и не должна иметь) никакого отношения. Но ведь этой переменной нет после того, как ты вышел из BitBtn2Click. Я не просто же так сказал, что надо работать с объектами через Sender, наверное? Предыдущий мой пост перечитай, и сделай так, как там написано, будет работать...
1
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 18:12  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Знаешь, не очень верится. Потому что
Действительно работает, но только с компонентом типа TShape А вот изменяю создаваемый компонент на тип TImage - уже не работает. Ругается на строку
Delphi
1
Img.Picture.LoadFromFile('refregirator.jpg');
(картинка находится в папке)
Что не так с этой строчкой?

Добавлено через 4 минуты
Вот идеально рабочий код:
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  procedure _MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  procedure _MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
   procedure _MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
   x0,y0:integer;
  move:boolean;
  Img: TShape;
 
implementation
 
{$R *.dfm}
 
procedure TForm2._MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm2._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Img.Left:=Img.Left+x-x0; // Изменяем позицию левого края
Img.Top:=Img.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm2._MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
 
 
 
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  Img := TShape.Create(Form2);
  Img.Parent := Form2;
  Img.OnMouseDown :=_MouseDown;
  Img.OnMouseMove :=_MouseMove;
  Img.OnMouseUp :=_MouseUp;
 
end;
 
end.
Делаю Img типа Image, и добавляю строчку загрузки изображения
Delphi
1
Img.Picture.LoadFromFile('refregiratot.jpg');
по клику на батон - не работает((((
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
29.01.2013, 18:14
Цитата Сообщение от stasagent Посмотреть сообщение
Что не так с этой строчкой?
Не знаю, тебе виднее, что у тебя такое Img, есть ли вообще поддержка JPG-формата? ... Не забывай, твой код (с последними исправлениями) видишь только ты, я его не вижу...

Добавлено через 1 минуту
Цитата Сообщение от stasagent Посмотреть сообщение
Делаю Img типа Image
Вот привести НЕработающий код - нельзя было?
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 18:16  [ТС]
Ошибку выдает следующую: Unknown picture file extension (.jpg)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33185 / 21483 / 8231
Регистрация: 22.10.2011
Сообщений: 36,855
Записей в блоге: 12
29.01.2013, 18:18
Модуль Jpeg подключи.
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
29.01.2013, 20:43  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Не знаю, тебе виднее, что у тебя такое Img, есть ли вообще поддержка JPG-формата? ... Не забывай, твой код (с последними исправлениями) видишь только ты, я его не вижу...

Добавлено через 1 минуту
Вот привести НЕработающий код - нельзя было?
Сори, не работающий код:
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  procedure _MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  procedure _MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
   procedure _MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
   x0,y0:integer;
  move:boolean;
  Img: TImage;
 
implementation
 
{$R *.dfm}
 
procedure TForm2._MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm2._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Img.Left:=Img.Left+x-x0; // Изменяем позицию левого края
Img.Top:=Img.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm2._MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
 
 
 
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  Img := TImage.Create(Form2);
  Img.Parent := Form2;
  Img.Picture.LoadFromFile('refregiratot.jpg');
  Img.OnMouseDown :=_MouseDown;
  Img.OnMouseMove :=_MouseMove;
  Img.OnMouseUp :=_MouseUp;
 
end;
 
end.
Добавлено через 3 минуты
В МОДУЛЕ БЫЛА ПРОБЛЕМА!!!!!!)))))))))

Добавлено через 38 минут
Итак вот что у меня получилось:
Unit1 - собственно говоря на Form1 создаются мои изображения из Unit2. Так что Unit1 пустой.
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
end.

Unit2 - тут уже организовано динамическое создание компонентов на Form1.
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Jpeg;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  procedure _MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  procedure _MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
   procedure _MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
   x0,y0:integer;
  move:boolean;
  Img: TImage;
 
implementation
 
uses Unit1;
 
{$R *.dfm}
 
procedure TForm2._MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm2._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Img.Left:=Img.Left+x-x0; // Изменяем позицию левого края
Img.Top:=Img.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm2._MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
 
 
 
procedure TForm2.Button1Click(Sender: TObject);
begin
  Img := TImage.Create(Form1);
  Img.Parent := Form1;
  Img.Picture.LoadFromFile('refregirator.jpg');
  Img.OnMouseDown :=_MouseDown;
  Img.OnMouseMove :=_MouseMove;
  Img.OnMouseUp :=_MouseUp;
 
end;
 
end.
Вопрос такой, как на каждый щелчек по батон(Form2) - создавать новый объект типа TImage на Form1. Загвоздка в том, что нужно как-то присваивать имена новым компонентам. Может кто-то сталкивался с реализацией подобного?

Добавлено через 1 час 42 минуты
Компоненты создаются. Имена им присваиваются автоматически)))
0
Эксперт Python
 Аватар для dondublon
4648 / 2068 / 366
Регистрация: 17.03.2012
Сообщений: 10,168
Записей в блоге: 6
30.01.2013, 07:29
Цитата Сообщение от stasagent Посмотреть сообщение
Так а как же сделать так, чтобы можно было реализовать задачу?
Млин, настолько частый вопрос, что пора в FAQ выносить.

Обрати внимание - визуализаторы между собой не общаются.
Стрелками показывается, кто о ком знает. Там, где "или" - надо выбрать только одну стрелку.
Визуализатор может быть формой.
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 22
30.01.2013, 10:56  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Обрати внимание - визуализаторы между собой не общаются.
Ага, все, теперь ясно. Спасибо!

Добавлено через 1 час 58 минут
Помогите пожалуйста еще немного разобраться. Я перенес все теперь на одну форму (чтобы не путаться).
теперь у меня есть в низу изображение, по щелчку на которое создается картинка в верхнем левом углу, я ее мышкой перетаскиваю в сторону. Потом снова щелкаю мышкой по изображению и снова появляется картинка в верхнем левом углу (что мне собственно и нужно). Я ее так же могу перетащить в сторону. НО проблема в том, что я теперь не могу перетаскивать первую картинку. Даже если я щелкаю по первой картинке и хочу ее переместить - двигается вторая (хотя указатель мыши находится над первой картинкой).
Скажите пожалуйста умные люди как добиться того, чтобы они все перемещались?????
Привожу код:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Image1: TImage;
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
   procedure _MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
   procedure _MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
   procedure _MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  x0,y0:integer;
  move:boolean;
  Img: TImage;
implementation
 
{$R *.dfm}
 
 
procedure TForm1._MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
 
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;
 
procedure TForm1._MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if move then begin
Img.Left:=Img.Left+x-x0; // Изменяем позицию левого края
Img.Top:=Img.Top+y-y0; // Изменяем позицию верхнего края
end;
end;
 
procedure TForm1._MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
 
 
procedure TForm1.Image1Click(Sender: TObject);
begin
  Img := TImage.Create(Form1);
  Img.Parent := Form1;
  Img.Picture.LoadFromFile('refregirator.jpg');
  Img.OnMouseDown :=_MouseDown;
  Img.OnMouseMove :=_MouseMove;
  Img.OnMouseUp :=_MouseUp;
end;
 
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.01.2013, 10:56
Помогаю со студенческими работами здесь

Реализация программы с использованием Drag&Drop
Здравствуйте! Помогите пожалуйста с написанием программы с использованием технологии Drag&amp;Drop , программа должна составлять расписание...

Программа тестирования с технологией Drag & Drop
как можно сделать тест чтобы картинки перетаскивать на правильный ответ?

Смещение элемента после Drag&Drop (ListView)
Как-то по короче можно переделать? if PlayID=q then begin PlayID:=n; exit; end; if (q&lt;PlayID) and (PlayID&lt;N) then begin Dec(PlayID);...

Перехват мыши при Drag&Drop файлов на объект
допустим, требуется на объект, например на TreeView перетаскивать файлы (напр. из Explorer'а). для этого окно регистрируется через...

Как сделать drag&drop файлов из моей программы в другую?
Меня интересует два вопроса: 1. При перетаскивании файлов из внешнего приложения в мою программу я не могу отловить движение мышки над...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru