Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
Здравствуйте, помогите пожалуйста, пишу курсовую.

Суть в том, что я нажатием на кнопку динамически создаю панель(имитация панели управления), загвоздка в том, что я не могу понять как с помощью мышки реализовать её перетаскивание, при этом запоминая координаты, при отпускании левой кнопки мыши, а при нажатии на правую происходит её удаление.

К сообщению приложен файл. Размер - 132Kb


Сообщение было отредактировано: 19 мар 20, 11:27
18 мар 20, 20:39    [22101782]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31138

это всё есть в FAQ-ах

Posted via ActualForum NNTP Server 1.5

19 мар 20, 11:33    [22101994]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
Dasha123123> как с помощью мышки реализовать её перетаскивание

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

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

https://sql.ru/forum/972534
https://sql.ru/forum/1304139
https://sql.ru/forum/1098054

Posted via ActualForum NNTP Server 1.5

19 мар 20, 11:40    [22102007]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
DimaBr
Member

Откуда:
Сообщений: 11555
У вас набор кнопок на одной панели.
Вы хотите перетаскивать их на другую панель и там выстраивать в нужном порядке ?
19 мар 20, 11:41    [22102010]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
DimaBr,
Нажав на одну из кнопок, у меня на розовой панели создаются новые панели, которые я хочу выстаивать определенным образом. Встроенные функции для перетаскивания не работают, так как этих панелей ещё не существует. Я пробовала и OnMouseDown и DragDrop.
19 мар 20, 16:32    [22102340]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
DimaBr
Member

Откуда:
Сообщений: 11555
Dasha123123
Встроенные функции для перетаскивания не работают, так как этих панелей ещё не существует.

Нет никаких встроенных функций для перетаскивания
19 мар 20, 17:17    [22102443]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
DimaBr, хорошо, встроенные процедуры!
19 мар 20, 18:27    [22102503]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
Процедур тоже нет.

У панели можно менять свойства Left и Top. Там указаны координаты в пикселях левого верхнего угла панели.
При их изменении панель будет смещатся.
А вот как вы будете менять свойства Left и Top это уже ваше дело.

Сообщение было отредактировано: 19 мар 20, 18:34
19 мар 20, 18:34    [22102507]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31138

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

предлагаю начать с кнопок.
(отрабатывать OnKeyDown)

Posted via ActualForum NNTP Server 1.5

19 мар 20, 18:43    [22102510]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61137
Предлагаю прочитать по указанным ссылкам.
Там есть и объяснения, и готовые код и даже
готовые компоненты.

Posted via ActualForum NNTP Server 1.5

19 мар 20, 18:49    [22102514]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
Панели, которые обведены красным я создаю динамически нажатием на любую кнопку.
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 для оформления кода, пожалуйста.


Сообщение было отредактировано: 19 мар 20, 20:05
19 мар 20, 19:19    [22102535]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31138

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

начни перетаскивать кнопками.

Posted via ActualForum NNTP Server 1.5

19 мар 20, 19:21    [22102537]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
Мимопроходящий, я понимаю, что так проще. Но эта программа предназначена для детей начальной школы, а может и младше. Я не думаю, что для них мучаться с кнопками это норм,наоборот хотели уйти от этого.
19 мар 20, 19:29    [22102542]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
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;
19 мар 20, 19:51    [22102555]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Zmeelov2
Member

Откуда:
Сообщений: 624
Dasha123123
Мимопроходящий, я понимаю, что так проще. Но эта программа предназначена для детей начальной школы, а может и младше. Я не думаю, что для них мучаться с кнопками это норм,наоборот хотели уйти от этого.
Никто не предлагает делать управление только на кнопках. Управление кнопками нужно на период отладки. Смотрите : любое перетаскивание есть положительное/отрицательное изменение вертикального/горизонтального положения. Отладьте все граничные случаи изменения позиций с кнопок, потом переходите к ловле мыши. Потом, ближе к релизу, сможете скрыть или удалить кнопки
20 мар 20, 11:03    [22102766]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, Спасибо большое!!!! А как сделать её удаление?
20 мар 20, 13:45    [22102931]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
Dasha123123,

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

А вот как вы собираетесь делать сам вызов удаления - это уже ваше дело.
20 мар 20, 13:57    [22102942]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, Я уже сделала, спасибо вам большое*
20 мар 20, 14:01    [22102945]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, только остался один вопрос, как к ним обращаться, чтобы отсортировать по у?
20 мар 20, 17:23    [22103096]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
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

Сообщение было отредактировано: 20 мар 20, 17:31
20 мар 20, 17:29    [22103108]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, Я вот при создании панелей, добавила создание на ней Image и добавляю картинку, но при этом перестает работать перемещение. Что нужно исправить в процедурах перетаскивания?

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;
21 мар 20, 15:40    [22103562]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
Т.к. TImage лежит на панели и закрывает ее собой, то события мышки происходят уже не на панели а на TImage.

Прикручивайте обработку событий к TImage, аналогично тому как это сделано для TPanel.

Сообщение было отредактировано: 21 мар 20, 16:02
21 мар 20, 16:02    [22103571]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, это я понимаю, но не получается.(((
21 мар 20, 16:25    [22103580]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
rgreat
Member

Откуда:
Сообщений: 5705
Dasha123123,

Судя по размеру и расположению вашего TImage относительно размеров панели на которой вы пытаетесь его уместить я вообще не понимаю что вы хотели сделать.
21 мар 20, 16:29    [22103582]     Ответить | Цитировать Сообщить модератору
 Re: Перетаскивание панелей.  [new]
Dasha123123
Member

Откуда:
Сообщений: 11
rgreat, да они оба размером 50*50 просто забыла поменять
21 мар 20, 16:33    [22103590]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить