Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация "Отрыва" Вкладок в Приложениях на Delphi: Создание Своей Версии Chrome Tab Drag-and-Drop

Delphi , Синтаксис , Drag and Drop

Реализация "Отрыва" Вкладок в Приложениях на Delphi

При разработке приложений на Delphi, иногда возникает необходимость реализации функционала перетаскивания элементов интерфейса, например вкладок, аналогичного тому, что используется в таких браузерах, как Chrome. Такой функционал позволяет пользователям перемещать вкладки по внутреннему интерфейсу приложения или же выводить их за пределы приложения для создания новых окон. В данной статье мы рассмотрим, как реализовать подобную функцию "отрыва" вкладок, используя примеры кода на Object Pascal.

Проблема

Пользователи вашего приложения должны иметь возможность перетаскивать вкладки, как в Chrome, чтобы перемещать их внутри приложения или создавать новые окна, выходя за его пределы. Это позволяет реализовать функционал "tear off" вкладок, который является удобным и интуитивно понятным для пользователей.

Решение

Для начала, необходимо поймать событие окончания перетаскивания (OnEndDrag), которое срабатывает даже если перетаскивание закончилось за пределами формы приложения. Это возможно благодаря захвату мыши во время перетаскивания.

procedure TForm1.PageControl1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  if Assigned(Target) then begin
    // Обычная обработка, например, поиск целевой вкладки, как в OnDragOver
    // и обмен позициями с перетаскиваемой вкладкой
  end else begin
    if not TDragFloatSheet.FCancelled then begin
      if not Assigned(FindVCLWindow(TDragFloatSheet.FDragPos)) then begin
        // Выпадение перетаскиваемой вкладки на позицию TDragFloatSheet.FDragPos
      end;
    end;
  end;
end;

Однако, такой подход не позволяет определить, было ли перетаскивание отменено нажатием клавиши Esc, а также установить курсор в режим "принято" за пределами формы, поскольку событие OnDragOver не будет вызвано.

Альтернативное решение

Для решения этих проблем можно изменить поведение операции перетаскивания, используя пользовательский объект перетаскивания. Ниже приведен пример такого объекта:

type
  TDragFloatSheet = class(TDragControlObjectEx)
  private
    class var
      FDragSheet: TTabSheet;
      FDragPos: TPoint;
      FCancelled: Boolean;
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;
procedure TDragFloatSheet.WndProc(var Msg: TMessage);
begin
  if (Msg.Msg = CN_KEYDOWN) and (Msg.WParam = VK_ESCAPE) then
    FCancelled := True;
  FDragPos := DragPos;
  inherited;
  if (Msg.Msg = WM_MOUSEMOVE) and
      (not Assigned(FindVCLWindow(SmallPointToPoint(TWMMouse(Msg).Pos)))) then
    Winapi.Windows.SetCursor(Screen.Cursors[GetDragCursor(True, 0, 0)]);
end;

Обратите внимание на обработку сообщений, которая позволяет отслеживать нажатие клавиши Esc и изменять курсор, когда указатель мыши находится вне формы.

Пример использования

procedure TForm1.PageControl1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  TDragFloatSheet.FDragSheet :=
      (Sender as TPageControl).Pages[TPageControl(Sender).IndexOfTabAt(X, Y)];
  PageControl1.BeginDrag(False);
end;
procedure TForm1.PageControl1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
begin
  DragObject := TDragFloatSheet.Create(Sender as TPageControl);
end;

Эти процедуры инициализируют процесс перетаскивания и создают объект перетаскивания, который можно настраивать под свои нужды.

Заключение

Для реализации "теар офф" вкладок в приложениях на Delphi, необходимо использовать возможности перетаскивания элементов, а также обрабатывать различные сценарии, такие как отмена перетаскивания и изменение курсора при наведении на область вне приложения. Приведенные примеры кода можно использовать в качестве основы для создания собственной реализации перетаскивания вкладок, аналогичной той, что используется в Chrome.

Создано по материалам из источника по ссылке.

В статье рассматривается реализация функции 'отрыва' вкладок в приложениях на Delphi, позволяющая пользователям перемещать вкладки внутри приложения или создавать новые окна, выходя за его пределы, с использованием примеров кода на Object Pasca


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Drag and Drop ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 09:05:42/0.0034890174865723/0