Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#8

AW: TGrid in FM mit Daten füllen

  Alt 21. Jan 2014, 16:42
Hallo,

Zitat:
Eine Spalte, die am linken Rand stehen bleibt, wenn das Gitter gescrollt wird.
Habe ich befürchtet. Eine einfach Möglichkeit (Property entsprechend setzen o. ä.), um die erste(n) Spalten fixed zu bekommen habe ich noch nicht gefunden (auch noch nicht intensiv danach gesucht).

Ich kenne Deine Problemstellung nicht; wenn es sich eher um eine Standarddarstellung (kein rotierendes Grid o. ä.) handelt, dann könntest Du die fixe Spalte(n) doch mit einem zweiten Grid erschlagen, das entsprechend über dem anderen Grid liegt.

Dann muss Du nur noch das Selektieren bzw. Scrollen synchronisieren und die Höhe des "fixen" Grids anpassen, wenn der horizontale Scrollbalken ein bzw. ausgeblendet wird.

Das ganze könntest Du so machen (nur mal kurz skizziert):
  • 2x TGrid aufs Form
  • Grid1: die erste Spalte ein TColumn, gefolgt von den Spalten, die Du zur Darstellung Deines Inhalts benötigst
  • Grid2: keine Spalten
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.StdCtrls, FMX.Grid, FMX.Layouts, FMX.Header;

type
  THeaderCell = class (FMX.Header.THeader)
  private
    procedure InternalResize (Sender : TObject);
  protected
    procedure SetData (const Value: TValue); override;
  public
    constructor Create (Owner : TComponent); override;
  end;

  THeaderColumn = class (FMX.Grid.TColumn)
  protected
    function CreateCellControl : TStyledControl; override;
  end;

  // Für den Zugriff auf die Scrollbars
  TGrid = class (FMX.Grid.TGrid)
  end;

  TForm1 = class(TForm)
    Grid1: TGrid;
    Column1: TColumn;
    ImageColumn1: TImageColumn;
    StringColumn1: TStringColumn;
    Grid2: TGrid;
    StyleBook1: TStyleBook;
    procedure FormCreate(Sender: TObject);
    procedure Grid1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
    procedure Grid1SelChanged(Sender: TObject);
    procedure Grid2SelChanged(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure SyncVScrollBarValue (Sender : TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure THeaderCell.InternalResize (Sender : TObject);
begin
  Items [0].Width := Width + 1
end;

procedure THeaderCell.SetData (const Value : TValue);
begin
  Items [0].Text := Value.AsString
end;

constructor THeaderCell.Create (Owner : TComponent);
var
  i : THeaderItem;
begin
  inherited Create (Owner);

  i := THeaderItem.Create (Self);
  i.Enabled := False;
  AddObject (i);

  OnResize := InternalResize
end;

function THeaderColumn.CreateCellControl : TStyledControl;
begin
  Result := THeaderCell.Create (Self)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Grid1.OnVScrollChange := SyncVScrollBarValue;

  Grid2.AddObject (THeaderColumn.Create (Self));
  Grid2.Position.X := Grid1.Position.X;
  Grid2.Position.Y := Grid1.Position.Y;

  Column1.Enabled := False;
  Column1.Width := Grid2.Width - 5
end;

procedure TForm1.Grid1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin
  if Grid1.HScrollBar.Visible then
    Grid2.Height := Grid1.Height - Grid1.HScrollBar.Height - 2
  else
    Grid2.Height := Grid1.Height
end;

procedure TForm1.Grid1SelChanged(Sender: TObject);
begin
  Grid2.Selected := Grid1.Selected
end;

procedure TForm1.Grid2SelChanged(Sender: TObject);
begin
  Grid1.Selected := Grid2.Selected
end;

procedure TForm1.SyncVScrollBarValue(Sender: TObject);
begin
  Grid2.VScrollBar.Value := Grid1.VScrollBar.Value
end;

end.
Sicherlich nicht der Weisheit letzter Schluss (soll auch nur grob den Weg skizzieren). Letztlich wäre da eine eigene Klasse zu bauen (ich habe mir aber die FMX Klassen noch nicht so genau angesehen).

Vielleicht hilft 's weiter oder ein Kollege hat 'ne bessere Idee.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat