Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FMX TStringGrid Anzeigefehler ?!?! (https://www.delphipraxis.net/172295-fmx-tstringgrid-anzeigefehler.html)

MeisterLampe 23. Dez 2012 15:59

FMX TStringGrid Anzeigefehler ?!?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag und erstmal frohe Weihnachten euch allen.

Ich bin echt am verzweifeln :(

Folgendes Problem:
Ich möchte gerne ein StringGrid mit mehr als 25000 Einträgen füllen. Ich weiß, sowas ist nicht sinnvoll aber ich trotzdem :P

Nur ist mir nun aufgefallen, dass die Reihe mit dem Index 19046 noch korrekt angezeigt wird, die Reihe mit dem Index 19047 nur zur hälfte und alle folgenden Reihen gar nicht mehr :(

Lasse ich mir jedoch über Showmessage(StringGrid1.Cells[0, StringGrid1.Selected]) den Inhalt ausgeben, stimmt dieser auch... Nur man kann es im StringGrid nicht mehr sehen.

Hab ich einfach was übersehen oder ist das ein bekannter Bug und es gibt dafür nen Fix?

Im Anhang hab ich mal ein Beispielprogramm rangehängt, welches mein Problem verdeutlicht.

Vielen Dank schonmal.

Sir Rufo 23. Dez 2012 23:21

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Jo, bei FMX gibt es da so einige kleinere Bugs ;)

Auch das Aktualisieren der Anzeige in einem Grid gehört dazu.
Dieses muss zeitweilig manuell nochmal angestossen werden.

Hier mal eine Unit, womit man die Zellen in einem Grid aktualisieren lassen kann.

Der Aufruf erfolgt dann ganz banal mit
Delphi-Quellcode:
TGridTools.UpdateCells( MyStringGrid );
und es werden alle sichtbaren Zellen aktualisiert.

Pauschal kann man diesen Aufruf in einen Idle-Event packen (TApplicationEvents.OnIdle) oder eben an die diversen Methoden des Grids hängen.

Delphi-Quellcode:
unit FMX.CommonGuiTools;

interface

uses
  FMX.Grid, FMX.Forms;

type
  TGridTools = class abstract
    class procedure UpdateCells( const AGrid : TGrid; const Visible : Boolean = True ); overload;
    class procedure UpdateCells( const AGrid : TGrid; const AMethod : TOnGetValue;
      const VisibleRows : Boolean = True ); overload;
    class procedure AutosizeColumn( const AGrid : TGrid; const ColumnIndex : Integer; const MinWidth : Single = 0 );
  end;

  TFormTools = class abstract
    class procedure CenterForm( const AForm, BForm : TCommonCustomForm );
  end;

implementation

uses
  System.Math;

{$IF CompilerVersion = 23}

type
  THackedColumn = class( TColumn )
  end;
{$IFEND}
  { TGridTools }

class procedure TGridTools.AutosizeColumn( const AGrid : TGrid; const ColumnIndex : Integer; const MinWidth : Single );
var
  LCol :        Integer;
  LWidth :      Single;
  LClientWidth : Single;
begin

  LWidth  := 0;
  for LCol := 0 to Pred( AGrid.ColumnCount ) do
    begin
      if ( LCol <> ColumnIndex ) and AGrid.ColumnByIndex( LCol ).Visible
      then
        LWidth := LWidth + AGrid.ColumnByIndex( LCol ).Width;
    end;

  repeat
    LClientWidth                            := AGrid.ClientWidth;
    AGrid.ColumnByIndex( ColumnIndex ).Width := Max( MinWidth, AGrid.ClientWidth - LWidth );
  until SameValue( LClientWidth, AGrid.ClientWidth, 0.0001 );
end;

class procedure TGridTools.UpdateCells( const AGrid : TGrid; const Visible : Boolean );
var
  LCol, LRow, LRowMin, LRowMax : Integer;
  LColumn :                     TColumn;
begin
  if Visible
  then
    begin
      LRowMin := AGrid.TopRow;
      LRowMax := Pred( Min( AGrid.TopRow + AGrid.VisibleRows, AGrid.RowCount ) );
    end
  else
    begin
      LRowMin := 0;
      LRowMax := Pred( AGrid.RowCount );
    end;

  for LCol := 0 to Pred( AGrid.ColumnCount ) do
    begin
      LColumn := AGrid.ColumnByIndex( LCol );

{$IF CompilerVersion = 23}
      THackedColumn( LColumn ).UpdateColumn;
{$ELSE}
      for LRow := LRowMin to LRowMax do
        if ( Visible and AGrid.ColumnByIndex( LCol ).Visible ) or not Visible
        then
          LColumn.UpdateCell( LRow );
{$IFEND}
    end;
end;

class procedure TGridTools.UpdateCells( const AGrid : TGrid; const AMethod : TOnGetValue; const VisibleRows : Boolean );
var
  LMethod : TOnGetValue;
begin
  LMethod := AGrid.OnGetValue;
  try
    AGrid.OnGetValue := AMethod;
    UpdateCells( AGrid, VisibleRows );
  finally
    AGrid.OnGetValue := LMethod;
  end;
end;

{ TFormTools }

class procedure TFormTools.CenterForm( const AForm, BForm : TCommonCustomForm );
begin
  AForm.Left := BForm.Width div 2 + BForm.Left - AForm.Width div 2;
  AForm.Top := BForm.Height div 2 + BForm.Top - AForm.Height div 2;
end;

end.

MeisterLampe 24. Dez 2012 01:43

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Vielen Dank für die Antwort.
Doch leider kommt beim Compilieren in Zeile 69
AGrid.ColumnByIndex( LCol ).UpdateCell( LRow );
die Meldung: Undeklarierter Bezeichner: "UpdateCell"

Was muss ich tun?

Sir Rufo 24. Dez 2012 08:17

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Zitat:

Zitat von MeisterLampe (Beitrag 1196593)
Was muss ich tun?

Du arbeitest anscheinend mit XE2 ... ok, ich habe die Unit geändert. Die läuft jetzt auch mit XE2.
Ich habe aber nicht getestet, ob jetzt das Update dort auch zuverlässig ausgeführt wird (sollte eigentlich) :)

MeisterLampe 24. Dez 2012 11:31

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Also Compilieren konnte ich die Unit nun :) Danke :D

Doch nun kommt bei meinem Aufruf ein Fehler:
[DCC Fehler] Main.pas(477): E2250 Es gibt keine überladene Version von 'UpdateCells', die man mit diesen Argumenten aufrufen kann

So versuche ich die procedure aufzurufen:

procedure TForm1.GridPainting(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
GridFillSelection;
TGridTools.UpdateCells( Grid ); <---:?:
end;

MeisterLampe 24. Dez 2012 12:48

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Zitat:

Zitat von MeisterLampe (Beitrag 1196628)
[DCC Fehler] Main.pas(477): E2250 Es gibt keine überladene Version von 'UpdateCells', die man mit diesen Argumenten aufrufen kann

So versuche ich die procedure aufzurufen:

procedure TForm1.GridPainting(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
GridFillSelection;
TGridTools.UpdateCells( Grid ); <---:?:
end;

Asche auf mein Haupt:oops::oops: Nachdem ich aus TGrid TStringGrid gemacht hatte ging es.

Doch hat die Procedure leider nichts gebracht :(
Es werden immernoch die Zeilen 19047 und folgende fehlerhaft angezeigt :/

Gibt es noch andere Möglichkeiten? Evtl eine FMX.TGrid alternative?

Sir Rufo 24. Dez 2012 14:13

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Im Painting hat die aber nichts zu suchen.

Klatsch dir mal einen Button auf die Form, der dann dieses UpdateCells aufruft.
Wenn du dann Anzeigefehler bemerkst, dann klicke auf den Button und prüfe ob die Inhalte nun erscheinen.

MeisterLampe 24. Dez 2012 14:37

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Zitat:

Zitat von Sir Rufo (Beitrag 1196642)
Im Painting hat die aber nichts zu suchen.

Mal ganz doof gefragt: Wieso nicht?

Zitat:

Zitat von Sir Rufo (Beitrag 1196642)
Klatsch dir mal einen Button auf die Form, der dann dieses UpdateCells aufruft.
Wenn du dann Anzeigefehler bemerkst, dann klicke auf den Button und prüfe ob die Inhalte nun erscheinen.

Hab ich auch schon probiert und hilft leider nicht :(

Sir Rufo 24. Dez 2012 15:41

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Das Update veranlasst ja das Neuzeichnen ;)

Dann weiß ich auch nicht mehr, das hier hilft auf jeden Fall bei XE3/FMX2 :gruebel:

MeisterLampe 24. Dez 2012 21:20

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Okay danke trotzdem.

Weiß vllt noch jemand anderes eine Lösung?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.
Seite 1 von 2  1 2      

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