AGB  ·  Datenschutz  ·  Impressum  







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

FMX TStringGrid Anzeigefehler ?!?!

Ein Thema von MeisterLampe · begonnen am 23. Dez 2012 · letzter Beitrag vom 2. Jan 2013
Antwort Antwort
Seite 1 von 2  1 2      
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#1

FMX TStringGrid Anzeigefehler ?!?!

  Alt 23. Dez 2012, 15:59
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

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.
Angehängte Dateien
Dateityp: rar Gitter Problem.rar (2,08 MB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 23. Dez 2012, 23:21
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 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Dez 2012 um 08:15 Uhr)
  Mit Zitat antworten Zitat
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#3

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 01:43
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?

Geändert von MeisterLampe (24. Dez 2012 um 01:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 08:17
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#5

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 11:31
Also Compilieren konnte ich die Unit nun Danke

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;
  Mit Zitat antworten Zitat
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#6

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 12:48
[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 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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 14:13
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#8

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 14:37
Im Painting hat die aber nichts zu suchen.
Mal ganz doof gefragt: Wieso nicht?

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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 15:41
Das Update veranlasst ja das Neuzeichnen

Dann weiß ich auch nicht mehr, das hier hilft auf jeden Fall bei XE3/FMX2
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MeisterLampe

Registriert seit: 10. Dez 2012
16 Beiträge
 
Delphi XE2 Starter
 
#10

AW: FMX TStringGrid Anzeigefehler ?!?!

  Alt 24. Dez 2012, 21:20
Okay danke trotzdem.

Weiß vllt noch jemand anderes eine Lösung?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 06:55 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