![]() |
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? |
AW: FMX TStringGrid Anzeigefehler ?!?!
Ich habe mir jetzt probehalber XE3 geholt und habe dort keine Probleme mit der Anzeige mehr :-D
Doch etwas anderes bereitet mir jetzt Schwierigkeiten: Ich kann nicht mehr auf CellControlbyRow(n) zugreifen:?: Ich versuche ein Image immer in der 1. Zelle der Reihe über der sich die Maus befindet anzuzeigen: Zitat:
Zitat:
Zitat:
|
AW: FMX TStringGrid Anzeigefehler ?!?!
Ich habe jetzt das gleiche Problem gehabt und notdürftig geflickt:
Delphi-Quellcode:
Ich bin gerade dabei, ein XE2-Grid-Beispiel auf XE3 umzustellen.
TColumnBugFix = class(FMX.Grid.TColumn)
end; var Form3: TForm3; implementation ... begin Control := TColumnBugFix(aCol).CellControlByRow(Row); // hier Typ casten if Control <> nil then begin Das kann einen wirklich zur Verzweiflung treiben! Aber Potential sehe ich immer noch. Da aber Emba auch nicht auf bekannte Probleme reagiert (David I hatte mir das eigentlich versprochen), denke ich noch darüber nach, mein Geld zurück zu verlangen. Ein ernsthaftes Arbeiten ist damit bisher jedenfalls kaum möglich. :x |
AW: FMX TStringGrid Anzeigefehler ?!?!
Danke für die Antwort :)
Ich habe mich jetzt jedoch entschlossen, mein Project in VCL umzusetzen, weil ich dort auch noch ein Drawgrid habe. |
AW: FMX TStringGrid Anzeigefehler ?!?!
Zitat:
|
AW: FMX TStringGrid Anzeigefehler ?!?!
Hatte ich gedacht, weil ich ernst genommen hatte, was die Videos suggerieren.
Es fehlt ja auch nicht viel: überarbeitetes und stabiles Databinding vor allem auch an Gitter und dann passt das schon. Die anderen Probleme würde ich als Kinderkrankheiten verbuchen, die sich noch abstellen lassen. Das Konzept ist aber nicht schlecht. Dass Windows direkt mit der VCL verwoben ist fand ich schon oft nachteilig. Wenn das Entwicklungswerkzeug alles selbst managed finde ich das von der Idee her schon nicht schlecht. |
AW: FMX TStringGrid Anzeigefehler ?!?!
Ich finde grade den Bezug von der VCL zu Windows gut, die Programme benutzen die Native Controls und sehen auch wie Windows Programme aus. Was man leider von FireMonkey-Programmen nicht gerade sagen kann, gerade unter Mac OS X sehen die Dinger schlimm aus. Ich denke so mit XE4 oder XE5 wird das ganze langsam nutzbar sein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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