powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перетаскивание панелей.
26 сообщений из 26, показаны все 2 страниц
Перетаскивание панелей.
    #39938908
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите пожалуйста, пишу курсовую.

Суть в том, что я нажатием на кнопку динамически создаю панель(имитация панели управления), загвоздка в том, что я не могу понять как с помощью мышки реализовать её перетаскивание, при этом запоминая координаты, при отпускании левой кнопки мыши, а при нажатии на правую происходит её удаление.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939016
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это всё есть в FAQ-ах
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939020
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123> как с помощью мышки реализовать её перетаскивание

Как пробовала и не получилось?

В архивах форума полно примеров, да
и компоненты готовые есть для этого.

https://sql.ru/forum/972534
https://sql.ru/forum/1304139
https://sql.ru/forum/1098054
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939022
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас набор кнопок на одной панели.
Вы хотите перетаскивать их на другую панель и там выстраивать в нужном порядке ?
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939195
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,
Нажав на одну из кнопок, у меня на розовой панели создаются новые панели, которые я хочу выстаивать определенным образом. Встроенные функции для перетаскивания не работают, так как этих панелей ещё не существует. Я пробовала и OnMouseDown и DragDrop.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939247
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123
Встроенные функции для перетаскивания не работают, так как этих панелей ещё не существует.

Нет никаких встроенных функций для перетаскивания
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939278
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, хорошо, встроенные процедуры!
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939281
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедур тоже нет.

У панели можно менять свойства Left и Top. Там указаны координаты в пикселях левого верхнего угла панели.
При их изменении панель будет смещатся.
А вот как вы будете менять свойства Left и Top это уже ваше дело.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939284
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.03.2020 18:34, rgreat пишет:
>
> У панели можно менять свойства Left и Top. Там указаны координаты в пикселях левого верхнего угла панели.
> При их изменении панель будет смещатся.
> А вот как вы будете менять свойства Left и Top это уже ваше дело.
>

предлагаю начать с кнопок.
(отрабатывать OnKeyDown)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939287
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю прочитать по указанным ссылкам.
Там есть и объяснения, и готовые код и даже
готовые компоненты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939300
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панели, которые обведены красным я создаю динамически нажатием на любую кнопку.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure newPanel();
var npanel:TPanel;
begin
inc(countPanel);
npanel:= TPanel.Create(Form1);
  npanel.Parent :=Form1.Panel2;
  npanel.Height :=40;
  npanel.Width:=40;
  npanel.left:= 125 ;
  npanel.Top:= 250;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
newPanel();
   Form1.ActiveControl:=panels[countPanel];
 //Panel16.Caption:=inttostr(countPanel);
end;


и вот эти созданные панели мне нудно перетаскивать мышкой, чтобы выстроить цепочку.

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939302
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
19.03.2020 19:19, Dasha123123 пишет:
> и вот эти созданные панели мне нудно перетаскивать мышкой, чтобы выстроить цепочку.

начни перетаскивать кнопками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939305
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий, я понимаю, что так проще. Но эта программа предназначена для детей начальной школы, а может и младше. Я не думаю, что для них мучаться с кнопками это норм,наоборот хотели уйти от этого.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939309
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
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.
type
  TMyPanel = class(TPanel)
  public
    X0,Y0  : integer;
    InMove : boolean;
  end;

procedure TForm15.NewPanel;
var
  npanel: TMyPanel;
begin
  npanel:=TMyPanel.Create(Form15);
  npanel.Parent:=Form15.Panel1;
  npanel.Height:=40;
  npanel.Width:=40;
  npanel.left:=125;
  npanel.Top:=250;
  npanel.OnMouseDown:=MyMouseDown;
  npanel.OnMouseMove:=MyMouseMove;
  npanel.OnMouseUp:=MyMouseUp;
end;

procedure TForm15.MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Panel: TMyPanel;
begin
  Panel:=TMyPanel(Sender);
  Panel.InMove:=True;
  Panel.X0:=X;
  Panel.Y0:=Y;
end;

procedure TForm15.MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  Panel : TMyPanel;
begin
  Panel:=TMyPanel(Sender);
  if Panel.InMove then begin
    Panel.Top:=Panel.Top+Y-Panel.Y0;
    Panel.Left:=Panel.Left+X-Panel.X0;
    Panel1.repaint;
  end;
end;

procedure TForm15.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Panel : TMyPanel;
begin
  Panel:=TMyPanel(Sender);
  Panel.InMove:=False;
end;

procedure TForm15.Button1Click(Sender: TObject);
begin
  newPanel;
end;
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939435
Zmeelov2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123
Мимопроходящий, я понимаю, что так проще. Но эта программа предназначена для детей начальной школы, а может и младше. Я не думаю, что для них мучаться с кнопками это норм,наоборот хотели уйти от этого.
Никто не предлагает делать управление только на кнопках. Управление кнопками нужно на период отладки. Смотрите : любое перетаскивание есть положительное/отрицательное изменение вертикального/горизонтального положения. Отладьте все граничные случаи изменения позиций с кнопок, потом переходите к ловле мыши. Потом, ближе к релизу, сможете скрыть или удалить кнопки
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939521
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, Спасибо большое!!!! А как сделать её удаление?
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939529
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123,

Саму панель удалять через Self.Free;

А вот как вы собираетесь делать сам вызов удаления - это уже ваше дело.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939532
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, Я уже сделала, спасибо вам большое*
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939641
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, только остался один вопрос, как к ним обращаться, чтобы отсортировать по у?
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939646
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123
rgreat, только остался один вопрос, как к ним обращаться, чтобы отсортировать по у?

Сделайте список панелей (массив или лист) и добавляйте в него панель при ее создании, удаляя из списка при удалении панели, соотвественно.

Кроме того у панели на которой вы создаете свои панельки есть свойство Components, где перечисленны все компоненты лежащие на ней.

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TComponent_Components.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TComponent_ComponentCount.html
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939876
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, Я вот при создании панелей, добавила создание на ней Image и добавляю картинку, но при этом перестает работать перемещение. Что нужно исправить в процедурах перетаскивания?

Код: pascal
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.
procedure TForm1.NewPanel(n:Integer);
var
  npanel: TMyPanel;
  nimage: TImage;
begin
  inc(countPanel);
  npanel:=TMyPanel.Create(Form1);
  npanel.Parent:=Form1.Panel2;
  npanel.Height:=60;
  npanel.Width:=60;
  npanel.left:=125;
  npanel.Top:=250;
  npanel.Caption:=inttostr(n);
  npanel.OnMouseDown:=MyMouseDown;
  npanel.OnMouseMove:=MyMouseMove;
  npanel.OnMouseUp:=MyMouseUp;
          panels[countPanel]:=npanel;

 nImage := TImage.Create(npanel);
nImage.Align := altop;
 nImage.Left := 125;
nImage.Top := 250;
nImage.Width := 50;
nImage.Height := 50;
 nImage.Picture.LoadFromFile(IntToStr(n)+'.bmp');
end;

procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
var
  Panel: TMyPanel;
begin
  Panel:=TMyPanel(Sender);
  Panel.InMove:=True;
  Panel.X0:=X;
  Panel.Y0:=Y;
if button = mbRight then  f:=true;
if button = mbleft then  f:=false;
end;

procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X: Integer; Y: Integer);
var
  Panel : TMyPanel;   i,k:integer;  nImage:TImage;
begin
  nImage:=TImage(Sender);
  if (Panel.InMove) and f then  begin
  Panel.Destroy ;
  for i := 1 to countPanel do
  if panels[i].InMove then k:=i;
  for i:=k to countPanel-1 do
      panels[i] := panels[i+1];
  dec(countPanel)
   end else
 if (Panel.InMove) and not(f) then
  begin
    Panel.Top:=Panel.Top+Y-Panel.Y0;

    Panel.Left:=Panel.Left+X-Panel.X0;
    Panel1.repaint;
  end;
end;

procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer);
var
  Panel : TMyPanel;
begin
  Panel:=TMyPanel(Sender);
  Panel.InMove:=False;

end;
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939879
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. TImage лежит на панели и закрывает ее собой, то события мышки происходят уже не на панели а на TImage.

Прикручивайте обработку событий к TImage, аналогично тому как это сделано для TPanel.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939883
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, это я понимаю, но не получается.(((
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939884
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dasha123123,

Судя по размеру и расположению вашего TImage относительно размеров панели на которой вы пытаетесь его уместить я вообще не понимаю что вы хотели сделать.
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939890
Dasha123123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, да они оба размером 50*50 просто забыла поменять
...
Рейтинг: 0 / 0
Перетаскивание панелей.
    #39939937
Код: pascal
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.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    function GetObject(Sender: TObject; x: TClass): TObject;
    procedure FormCreate(Sender: TObject);
    procedure PanelsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; x, Y: Integer);
    procedure PanelsOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; x, Y: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    Panels: TArray<TPanel>;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetObject(Sender: TObject; x: TClass): TObject;
begin
  while not(Sender is x) do
  begin
    Sender := TWinControl(Sender).Parent;
    if Sender = nil then
      exit(nil);
  end;
  Result := Sender;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SetLength(Panels, 0); // Не нуждается в вызове free
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  m: TImage;
begin
  SetLength(Panels, 10);

  for I := Low(Panels) to High(Panels) do
  begin
    Panels[I] := TPanel.Create(self); // (Form1.Components[i] is TPanel) as TPanel
    with Panels[I] do
    begin
      Parent := self; // Show to form

      OnMouseDown := PanelsMouseDown;
      OnMouseUp := PanelsOnMouseUp;

      m := TImage.Create(Panels[I]); // (Panels[I].Components[i] is TImage) as TImage
      with m do
      begin
        Parent := Panels[I]; // Show to panel
        Picture.LoadFromFile('Treetog-Junior-Camera.ico');
        AutoSize := true;

        OnMouseDown := PanelsMouseDown;
        OnMouseUp := PanelsOnMouseUp;
      end;

      Width := m.Width;
      Height := m.Height;

      Top := (m.Height * I);
    end;
  end;

  Height := High(Panels) * Panels[0].Height * 2;
end;

procedure TForm1.PanelsOnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; x, Y: Integer);
begin
  Sender := GetObject(Sender, TPanel);
  if Sender = nil then
    exit;

  TWinControl(Sender).Visible := true;

  Caption := x.ToString + ' : ' + Y.ToString;
end;

procedure TForm1.PanelsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; x, Y: Integer);
var
  t: TPoint;
begin
  Sender := GetObject(Sender, TPanel);
  if Sender = nil then
    exit;

  with TWinControl(Sender) do
  begin
    Visible := false;

    ReleaseCapture;

    Perform(WM_SYSCOMMAND, $F012, 0);

    t := Parent.ScreenToClient(Mouse.CursorPos);

    Perform(WM_LBUTTONUP, MK_CONTROL, MakeLong(t.x, t.Y));
  end;
end;

end.



З.ы. В удаление панелей нет необходимости. Их можно скрывать\отображать, на них можно перезагружать картинки.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перетаскивание панелей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]