TTMSFMXGrid - trackbar edit

To overcome the borders issue, you could return a custom cell which then creates the TTrackBar:


type
  TTrackBarCell = class(TTMSFMXGridCell)
  private
    FTrackBar: TTrackBar;
    FOnChange: TNotifyEvent;
  protected
    procedure TrackBarChanged(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property TrackBar: TTrackBar read FTrackBar;
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  TMSFMXGrid1.Options.Rendering.Mode := rmAddAsRealCell;
end;

{ TTrackBarCell }

constructor TTrackBarCell.Create(AOwner: TComponent);
begin
  inherited;
  FTrackBar := TTrackBar.Create(Self);
  FTrackBar.Align := TAlignLayout.Client;
  FTrackBar.Margins.Left := 3;
  FTrackBar.Margins.Top := 3;
  FTrackBar.Margins.Right := 3;
  FTrackBar.Margins.Bottom := 3;
  FTrackBar.Parent := Self;
  FTrackBar.Stored := False;
  FTrackBar.OnChange := TrackBarChanged;
end;

procedure TTrackBarCell.TrackBarChanged(Sender: TObject);
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TForm1.TMSFMXGrid1GetCellClass(Sender: TObject; ACol, ARow: Integer;
  var CellClassType: TFmxObjectClass);
begin
  if (ACol = 1) and (ARow > 0) then
    CellClassType := TTrackBarCell;
end;

procedure TForm1.TMSFMXGrid1GetCellProperties(Sender: TObject; ACol,
  ARow: Integer; Cell: TFmxObject);
begin
  if (ACol = 1) and (ARow > 0) then
    (Cell as TTrackBarCell).OnChange := TrackBarChanged;
end;

procedure TForm1.TrackBarChanged(Sender: TObject);
var
  cl: TCell;
begin
  cl := TMSFMXGrid1.GetCellByObject(Sender as TFMXObject);
  TMSFMXGrid1.Cells[cl.Col + 1, cl.Row] := FloatToStr((Sender as TTrackBarCell).TrackBar.Value);
end;