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

Использование события `OnChanging` для предотвращения смены вкладки в `TTabControl` FireMonkey в Delphi через FireMonkey

Delphi , Компоненты и Классы , Вкладки и Страницы

Использование события OnChanging для предотвращения смены вкладки в TTabControl FireMonkey в Delphi

Вопрос, заданный пользователем, касается возможности использования события OnChanging, аналогичного тому, что присутствует в компоненте TPageControl VCL, для предотвращения смены вкладки в компоненте TTabControl FireMonkey в среде разработки Delphi. Это может быть полезно, например, для предотвращения потери данных при попытке переключения на другую вкладку без сохранения изменений.

Описание проблемы

В компоненте TPageControl VCL есть событие OnChanging, которое позволяет программно контролировать процесс смены вкладки. Например, можно вывести сообщение с вопросом о подтверждении действий перед сменой вкладки. Однако в TTabControl FireMonkey такого события нет, и пользователь ищет способ его воспроизведения.

Подход к решению

Для воспроизведения аналогичного поведения в TTabControl FireMonkey можно использовать переопределение метода MouseDown в классе TTabItem, что позволит обрабатывать события нажатия на вкладку. Также необходимо переопределить свойство TabIndex для TTabControl, чтобы контролировать смену активной вкладки.

Реализация

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TTabItem = class(FMX.TabControl.TTabItem)
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
  end;

  TTabControl = class(FMX.TabControl.TTabControl)
    function GetTabIndex: Integer;
    public
    procedure SetTabIndexv2(const Value: Integer);
    property TabIndex: Integer read GetTabIndex write SetTabIndexv2 default -1;
  end;

  TForm1 = class(TForm)
    tbc1: TTabControl;
    tbtm1, tbtm2: TTabItem;
    btn1: TButton;
    lblTab1, lblTab2: TLabel;
    procedure btn1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TTabItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  if (self.TabControl.ActiveTab <> self) and
     ((Button = TMouseButton.mbLeft) or (ssDouble in Shift)) then begin
    // Здесь код для подтверждения смены вкладки, например, диалоговое окно
    MessageDlg('[Tab Item] do you want to do this?', mtInformation,
      [mbYes, mbNo], 0, procedure (const AResult: TModalResult)
    begin
      case AResult of
        mrYes: self.TabControl.ActiveTab := self;
        mrNo:  // Ничего не делаем
      end;
    end);
  end else begin
    inherited;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if tbc1.TabIndex = 0 then
    tbc1.TabIndex := 1
  else
    tbc1.TabIndex := 0;
end;

{ TTabControl }

function TTabControl.GetTabIndex: Integer;
begin
  result := FMX.TabControl.TTabControl(Self).TabIndex;
end;

procedure TTabControl.SetTabIndexv2(const Value: Integer);
begin
  if self.TabIndex <> Value then begin
    // Здесь код для подтверждения смены вкладки, аналогично обработке в TTabItem
    MessageDlg('[tabcontrol] do you want to do this?', mtInformation,
      [mbYes, mbNo], 0, procedure (const AResult: TModalResult)
    begin
      case AResult of
        mrYes: begin
                 FMX.TabControl.TTabControl(Self).TabIndex := Value;
                 // Обновляем активную вкладку
               end;
        mrNo:  // Ничего не делаем
      end;
    end);
  end;
end;

end.

Используемый подход подтвержден

В коде выше представлен пример использования переопределения методов для создания аналога события OnChanging в TTabControl FireMonkey. Этот подход успешно работает как минимум на Windows и Android, но не был протестирован на iOS.

Альтернативные подходы

Если есть предложения по улучшению представленного кода, пользователи могут поделиться ими для общего улучшения решения.


В статье был рассмотрен вопрос о воспроизведении поведения события OnChanging для компонента TTabControl FireMonkey, аналогичного тому, что используется в TPageControl VCL. Предложено решение с использованием переопределения методов, что позволяет контролировать процесс смены вкладки. Код приведен для демонстрации и может быть доработан в соответствии с конкретными требованиями разработчика.

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

Вопрос связан с реализацией механизма предотвращения смены вкладки в компоненте `TTabControl` FireMonkey в Delphi, используя подход аналогичный событию `OnChanging` из VCL.


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

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




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


:: Главная :: Вкладки и Страницы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-22 14:44:11/0.0036051273345947/0