AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TGrid in FM mit Daten füllen

Ein Thema von Peter-Pascal · begonnen am 18. Jan 2014 · letzter Beitrag vom 27. Jan 2014
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz