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;