Ok, zur generellen Abhilfe hier ein netter Helper
Delphi-Quellcode:
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.
Und so verwenden (geht jetzt bei
jedem Control)
Delphi-Quellcode:
uses
FMX.Helpers.Controls;
procedure TSomeForm.SomeMethod;
begin
StringGrid1.BeginAutoUpdate;
StringGrid1.Cells[2,2] := 'Test';
end;
Sobald die Methode verlassen wird, wird auch das erzeugte Interface
IControlUpdater
wieder freigegeben (RefCount geht auf 0)
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)