Delphi-PRAXiS

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?

MeisterLampe 24. Dez 2012 23:07

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:

procedure TForm1.GridMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Single);
var
n: Integer;
begin
try
n := Grid.RowByPoint(X, Y);

Pfeil.Parent := Grid.Columns[SCName].CellControlByRow(n);//.CellControlByRow(n);
X := Grid.Columns[SCName].CellControlByRow(n).Width - Pfeil.Width;
Y := Grid.Columns[SCName].CellControlByRow(n).Height - Pfeil.Height;
Pfeil.Position.X := X;
Pfeil.Position.Y := Y;
except

end;
end;
Schon vorm Compilieren markiert mir Delphi "CellControlByRow(n)" und meldet:
Zitat:

TColumn enthält kein Element namens 'CellControlByRow'
Und beim Compilieren kommt dann folgende Fehlermeldung:
Zitat:

[dcc32 Fehler] Unit1.pas(31): E2362 Auf protected-Symbol TColumn.CellControlByRow kann nicht zugegriffen werden
Ich bin am verzeifeln. Da klappt das nun mit der Anzeige und schon kommt das nächste Problem :(

stahli 29. Dez 2012 21:52

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Ich habe jetzt das gleiche Problem gehabt und notdürftig geflickt:

Delphi-Quellcode:
  TColumnBugFix = class(FMX.Grid.TColumn)
  end;

var
  Form3: TForm3;

implementation

...

  begin
    Control := TColumnBugFix(aCol).CellControlByRow(Row); // hier Typ casten
    if Control <> nil then
    begin
Ich bin gerade dabei, ein XE2-Grid-Beispiel auf XE3 umzustellen.
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

MeisterLampe 1. Jan 2013 21:51

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.

cookie22 2. Jan 2013 07:28

AW: FMX TStringGrid Anzeigefehler ?!?!
 
Zitat:

Zitat von stahli (Beitrag 1197101)
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

Hattest du ernsthaft gedacht, dass man mit FMX produktiv arbeiten kann? Für Windows ist die VCL halt viel besser und wenn es Moblie Development sein soll kommt man sogar mit Phonegap schneller zu guten Ergebnissen.

stahli 2. Jan 2013 08:50

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.

cookie22 2. Jan 2013 09:07

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 09:28 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