![]() |
AW: XE7: Mobile App und TStringGrid
Zitat:
Delphi-Quellcode:
ganz hervorragend ... so wie erwartet.
StringGrid1.RowCount := 20;
StringGrid1.Cells[2,2] := 'Test'; |
AW: XE7: Mobile App und TStringGrid
Guten Abend Sir Rufo;
Zitat:
Aber, langsam gewöhne ich mich daran das bei mir egal in welcher Version auf welchem OS nichts so funktioniert wie es bei allen anderen funktioniert :cry: Gruß HEiko |
AW: XE7: Mobile App und TStringGrid
Hatte ich dann auch schon gesehn :mrgreen:
Ich will ja nicht sagen diese Komponente ist Schrott, aber ![]() Hab mal nachgesehn: * Im Gegensatz zum VCL-StringGrid erweitert das FMX-StringGrid die Zeilen von selber, wenn man auf Nichtexistierende zugreift. * Es wird nur der Text in
Delphi-Quellcode:
(TStringColumn) eingetragen, und kein Refresh ausgelöst ... das mußt du halt selber machen. (oder warten, bis das irgendwann von "alleine" passiert)
FCells: array of string;
|
AW: XE7: Mobile App und TStringGrid
Wenn ich den
Delphi-Quellcode:
nicht setze, dann habe ich das gleiche Verhalten, wie du es hier beschreibst.
RowCount
Ach ja, völlig korrekt (so wie man es machen sollte) ist das hier
Delphi-Quellcode:
Ok, klappt auch nur beim ersten Mal, weil sich der RowCount von 100 auf 20 ändert. Ein Eintragen von Werten löst einfach nicht den benötigten Refresh aus :)
StringGrid1.BeginUpdate;
try StringGrid1.RowCount := 20; StringGrid1.Cells[2, 2] := 'Test'; finally StringGrid1.EndUpdate; end; |
AW: XE7: Mobile App und TStringGrid
Ok, zur generellen Abhilfe hier ein netter Helper
Delphi-Quellcode:
Und so verwenden (geht jetzt bei jedem Control)
unit FMX.Helper.Controls;
interface uses FMX.Controls; type IControlUpdater = interface ['{D90FA99C-F9EC-4A55-9E99-95A54D1E30F8}'] end; TControlUpdater = class( TInterfacedObject, IControlUpdater ) private FControl: TControl; constructor Create( AControl: TControl ); public destructor Destroy; override; end; TControlHelper = class helper for TControl function BeginAutoUpdate: IControlUpdater; end; implementation uses System.SysUtils; { TControlUpdater } constructor TControlUpdater.Create( AControl: TControl ); begin inherited Create; FControl := AControl; // BeginUpdate FControl.BeginUpdate; end; destructor TControlUpdater.Destroy; begin // EndUpdate FControl.EndUpdate; // Refresh auf dem sichtbaren Bereich anmelden // das ist schonender als ein hartes Repaint FControl.InvalidateRect( FControl.ClipRect ); inherited; end; { TControlHelper } function TControlHelper.BeginAutoUpdate: IControlUpdater; begin Result := TControlUpdater.Create( Self ); end; end.
Delphi-Quellcode:
Sobald die Methode verlassen wird, wird auch das erzeugte Interface
uses
FMX.Helpers.Controls; procedure TSomeForm.SomeMethod; begin StringGrid1.BeginAutoUpdate; StringGrid1.Cells[2,2] := 'Test'; end;
Delphi-Quellcode:
wieder freigegeben (RefCount geht auf 0)
IControlUpdater
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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-2025 by Thomas Breitkreuz