Использование события 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.