Search code examples
delphifiremonkeydelphi-10-seattledelphi-10.1-berlin

Delphi TTrackBar doesn't have on complete event


Delphi TTrackBar has two event for tracking changes:

  1. OnChange

  2. OnTracking

But both of them do the same thing. For example:

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  ShowMessage(TrackBar1.Value.ToString);
end;

On any small change it shows 10 message.

How can I detect last change on mobile phones? Change must happens after all tracking?


Solution

  • Those two events only do the same thing when Tracking is enabled (by default). Disabling the Tracking will make it so that OnChange is only fired after user is finished.

    Here's a brief demo to show what I mean:

    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.StdCtrls,
      FMX.Controls.Presentation;
    
    type
      TForm1 = class(TForm)
        TrackBar1: TTrackBar;
        lblChange: TLabel;
        lblTrack: TLabel;
        procedure TrackBar1Change(Sender: TObject);
        procedure TrackBar1Tracking(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        FChangeCount: Integer;
        FTrackCount: Integer;
      public
        procedure DoUpdate;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm1.DoUpdate;
    begin
      lblChange.Text:= 'Changes:  '+IntToStr(FChangeCount);
      lblTrack.Text:= 'Tracking: '+IntToStr(FTrackCount);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FChangeCount:= 0;
      FTrackCount:= 0;
      DoUpdate;
    end;
    
    procedure TForm1.TrackBar1Change(Sender: TObject);
    begin
      Inc(FChangeCount);
      DoUpdate;
    end;
    
    procedure TForm1.TrackBar1Tracking(Sender: TObject);
    begin
      Inc(FTrackCount);
      DoUpdate;
    end;
    
    end.
    

    And then the FMX file:

    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 480
      ClientWidth = 640
      FormFactor.Width = 320
      FormFactor.Height = 480
      FormFactor.Devices = [Desktop]
      OnCreate = FormCreate
      DesignerMasterStyle = 0
      object TrackBar1: TTrackBar
        CanParentFocus = True
        Orientation = Horizontal
        Position.X = 112.000000000000000000
        Position.Y = 96.000000000000000000
        Size.Width = 217.000000000000000000
        Size.Height = 19.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 0
        Tracking = False
        OnChange = TrackBar1Change
        OnTracking = TrackBar1Tracking
      end
      object lblChange: TLabel
        Position.X = 112.000000000000000000
        Position.Y = 152.000000000000000000
        Text = 'lblChange'
      end
      object lblTrack: TLabel
        Position.X = 112.000000000000000000
        Position.Y = 200.000000000000000000
        Text = 'lblTrack'
      end
    end