Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: XE7: Mobile App und TStringGrid

  Alt 17. Okt 2014, 23:16
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)

Geändert von Sir Rufo (18. Okt 2014 um 07:26 Uhr)
  Mit Zitat antworten Zitat