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
Antwort Antwort
Seite 1 von 3  1 23      
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#1

TGrid in FM mit Daten füllen

  Alt 18. Jan 2014, 20:07
Hallo,

ich suche verzweifelt, wie ich in einem TGrid bei FM die Daten in das Gitter bekomme.

In jedem TGrid müssen einzelne Column (Image,...) zugefügt werden. Jede TImageColumn verfügt über ein bis mehrere TImageCell. Ich finde nichts, wie ich an das TImageCell komme. Da nach Voreinstellung 100 Columm aufgebaut werden, müssen also 100 TImageCell's da sein. Aber wo? Und wie kann ich ein Bild zuweisen?

Vielen Dank.

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Volker Z.

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

AW: TGrid in FM mit Daten füllen

  Alt 19. Jan 2014, 00:08
Hallo,

Zitat:
ich suche verzweifelt, wie ich in einem TGrid bei FM die Daten in das Gitter bekomme. [...] Aber wo? Und wie kann ich ein Bild zuweisen?
Vielleicht hilft Dir TGrid.OnGetValue weiter.

Ein einfaches Beispiel (TGrid und TImage auf das Form klatschen, dem TGrid eine TImageColumn spendieren - erste Spalte - und ins TImage eine beliebige Grafik laden):
Delphi-Quellcode:
procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer; var Value: TValue);
begin
  if Col = 0 then
    Value := Image1.Bitmap
end;
Füllt Dir die Zeilen dann mit der der Grafik aus dem TImage

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TGrid in FM mit Daten füllen

  Alt 19. Jan 2014, 14:08
Hallo Volker,

danke für die Antwort. Das funktioniert.

Zur Laufzeit eine Möglichkeit. OnSetValue gibt es auch. Wobei ich nicht verstanden habe, wann die beiden Ereignisse aufgerufen werden und wie ich das Programm gesteuert gestalten soll, wenn sich während der Laufzeit die Inhalte ändern.

Gibt es denn keine Möglichkeit direkt auf TImageCell zuzugreifen? So in der Art ImageCell1.usw.? Wobei ich gerade sehe, dass TImageCell offensichtlich keine Create-Methode in Delphi hat, nur in C++. Was auch immer das bedeutet.

Und ich finde keine Möglichkeit zur Entwicklungszeit, dem Objekt Bilder zuzuweisen. Überall ist das vorhanden, nur hier nicht?

Ich denke, dass FM soweit ganz toll ist, aber bis man es verstanden hat dauert es.

Gruß Peter
Peter Niemeier

Geändert von Peter-Pascal (19. Jan 2014 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

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

AW: TGrid in FM mit Daten füllen

  Alt 20. Jan 2014, 00:32
Hallo,

Zitat:
Wobei ich nicht verstanden habe, wann die beiden Ereignisse aufgerufen werden [...]
GetValue immer dann, wenn sich das Grid (Darstellung des Inhalts irgendwie) ändert. Das heißt, wenn: die Spaltenbreite geändert wird, RowCount geändert wird, das Grid gescrollt wird etc., etc., [...]; kurz: recht häufig.
SetValue immer dann, wenn der Anwender den Zelleninhalt ändert.

Zitat:
[...] und wie ich das Programm gesteuert gestalten soll, wenn sich während der Laufzeit die Inhalte ändern
Vielleicht schaust Du Dir mal das Beispiel hier an. Neben TGrid.UpdateColumns gibt es noch TColumn.UpdateRow (ARow), um gezielt eine Zelle zu aktualisieren - d. h.: GetValue wird für die entsprechende Spalte/Zeile aufgerufen.

Zitat:
Gibt es denn keine Möglichkeit direkt auf TImageCell zuzugreifen? So in der Art ImageCell1.usw.? [...]
AFAIK nein. Du kannst zwar mit: ImageColumn1.Children [i].Data := Image1.Bitmap eine Grafik in die entsprechende Zelle quetschen, macht aber nicht viel Sinn (wie oben schon erwähnt sind die Grafikdaten weg, sobald gescrollt wird o. ä.)

Zitat:
Und ich finde keine Möglichkeit zur Entwicklungszeit, dem Objekt Bilder zuzuweisen. Überall ist das vorhanden, nur hier nicht?
Ist so aber auch nicht richtig. Ein VCL TDrawGrid bietet Dir diese Möglichkeit auch nicht.

Vielleicht hilft' s

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TGrid in FM mit Daten füllen

  Alt 20. Jan 2014, 09:49
Hallo Volker,

so ein Beispiel habe ich gesucht, wie Du es gezeigt hast. Warum ich es nicht gefunden habe, weiß ich nicht. Jetzt wird einiges klarer (insbesondere mit Deinen Erläuterungen) und mit UpdateColumn kann es zur Laufzeit gesteuert werden.

Weiß Du jetzt noch, wie ich FixedSpalten hinbekomme?

Danke und viele Grüße
Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Volker Z.

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

AW: TGrid in FM mit Daten füllen

  Alt 21. Jan 2014, 00:22
Hallo,

Zitat:
Weiß Du jetzt noch, wie ich FixedSpalten hinbekomme?
Was genau meinst Du den damit?
  • Spalten mit fixer (nicht veränderbarer Breite)
  • Eine FixedCol, die Ähnlichkeit mit der Headerzeile hat
  • Eine FixedCol à la (VCL) TStringGrid, die am linken Controlrand "stehen bleibt" beim horizontalen Scrollen
  • Etwas völlig anderes

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TGrid in FM mit Daten füllen

  Alt 21. Jan 2014, 10:10
Sorry, da habe ich mich nicht präzise genug ausgedrückt.

Eine Spalte, die am linken Rand stehen bleibt, wenn das Gitter gescrollt wird.
Peter Niemeier
  Mit Zitat antworten Zitat
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
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
197 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TGrid in FM mit Daten füllen

  Alt 21. Jan 2014, 21:58
Hallo Volker,

doch, doch, das hilft gewaltig weiter. Ganz besonders, was Du über das Synchronisieren der Scrollbalken geschrieben hast. Ich suche auch nach einer Möglichkeit die Scrollbalken insbesondere bei TListBox zu synchronisieren. Ich hoffe das klappt da auch.

Das werde ich beides mal ausprobieren.

Vielen Dank für Deine Mühe

Gruß Peter
Peter Niemeier

Geändert von Peter-Pascal (21. Jan 2014 um 22:01 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

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

AW: TGrid in FM mit Daten füllen

  Alt 22. Jan 2014, 00:23
Hallo,

Zitat:
doch, doch, das hilft gewaltig weiter. Ganz besonders, was Du über das Synchronisieren der Scrollbalken geschrieben hast.
Freut mich.

Zitat:
Ich suche auch nach einer Möglichkeit die Scrollbalken insbesondere bei TListBox zu synchronisieren. Ich hoffe das klappt da auch.
Ja, das sollte schon klappen (TListBox = class (FMX.ListBox.TListBox)end; vor der Deklaration des Forms).

Ich habe nur noch nicht verstanden, warum man bei Emba wohl glaubt die Scrollbars unbedingt vor den Programmieren verstecken zu müssen (ich beiß da doch kein Stück aus den Dingern raus), oder ich habe einfach den tieferen Sinn dahinter noch nicht kapiert - aber vielleicht erhellt mich mal wer.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz