![]() |
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. |
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:
und es werden alle sichtbaren Zellen aktualisiert.
TGridTools.UpdateCells( MyStringGrid );
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. |
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? |
AW: FMX TStringGrid Anzeigefehler ?!?!
Zitat:
Ich habe aber nicht getestet, ob jetzt das Update dort auch zuverlässig ausgeführt wird (sollte eigentlich) :) |
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; |
AW: FMX TStringGrid Anzeigefehler ?!?!
Zitat:
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? |
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. |
AW: FMX TStringGrid Anzeigefehler ?!?!
Zitat:
Zitat:
|
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: |
AW: FMX TStringGrid Anzeigefehler ?!?!
Okay danke trotzdem.
Weiß vllt noch jemand anderes eine Lösung? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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