Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

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

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 09:27
Ist das TBrushRecall denn für diesen "DraMode" innerhalb des grids dann verantwortlich?
Häh? Das TBrushRecall hat mit Drag und sonst was nix, aber auch gar nix zu tun.

Du schreibst irgendwo im Paint-Event
Delphi-Quellcode:
procedure FooOnPaint( ... );
begin
  // oh, wer weiß ob die Farbe überhaupt noch richtig ist, vielleicht habe ich ja geschludert
  stringgrid.Canvas.Brush.Color := clWhite;

  if StringGrid.Cells[ACol, ARow] = 'Othen
  begin
    stringGrid.Canvas.Brush.Color := clSkyBlue;
    ...
  end;

end;
Das kann man auch anders schreiben und zwar
Delphi-Quellcode:
procedure FooOnPaint( ... );
begin

  if StringGrid.Cells[ACol, ARow] = 'Othen
  begin
    stringGrid.Canvas.Brush.Color := clSkyBlue;
    ...
  end;

  // sodele, dann wollen wir mal wieder alles so herstellen, damit hier nix durcheinander kommt
  stringgrid.Canvas.Brush.Color := clWhite;
end;
Bzw. so wie schon gezeigt, man merkt sich die Farbe beim Betreten der Methode und stellt diese Farbe wieder her.

Oder, was noch komfortabler ist, man arbeitet mit dem Recall, dann wird die komplette Brush-Einstellung gesichert und wieder hergestellt.

Oder du nimmst diesen generischen Recall
Delphi-Quellcode:
unit GenericRecall;

interface

uses
  System.Classes;

type
  IRecall<T> = interface
    ['{32F2834B-8EA3-4BDD-8467-F21DA78C8F82}']
    function GetReference: T;
    procedure Store;
    procedure Forget;
    property Reference: T read GetReference;
  end;

  TRecall<T: TPersistent> = class( TInterfacedObject, IRecall<T> )
  private
    FRecall: TRecall;
    FStorage: T;
    function GetReference: T;
    procedure Store;
    procedure Forget;
    constructor Create( AStorage, AReference: T );
  public
    destructor Destroy; override;
  end;

  TRecallFactory = class
  public
    class function Construct<T: TPersistent, constructor>( AReference: T ): IRecall<T>; overload;
    class function Construct<T: TPersistent>( AReference, AStorage: T ): IRecall<T>; overload;
  end;

implementation

{ TRecall<T> }

constructor TRecall<T>.Create( AStorage, AReference: T );
begin
  inherited Create;
  FRecall := TRecall.Create( AStorage, AReference );
end;

destructor TRecall<T>.Destroy;
begin
  FRecall.Free;
  inherited;
end;

procedure TRecall<T>.Forget;
begin
  FRecall.Forget;
end;

function TRecall<T>.GetReference: T;
begin
  Result := FRecall.Reference as T;
end;

procedure TRecall<T>.Store;
begin
  FRecall.Store;
end;

{ TRecallFactory }

class function TRecallFactory.Construct<T>( AReference: T ): IRecall<T>;
begin
  Result := Self.Construct( AReference, T.Create );
end;

class function TRecallFactory.Construct<T>( AReference, AStorage: T ): IRecall<T>;
begin
  Result := TRecall<T>.Create( AStorage, AReference );
end;

end.
und änderte deine Zeichen Methode so ab
Delphi-Quellcode:
procedure FooOnPaint( ... );
begin
  // Sichern, Sichern, Sichern

  TRecallFactory.Construct( StringGrid.Canvas.Brush ); // Brush sichern
  TRecallFactory.Construct( StringGrid.Canvas.Font ); // Font sichern

  if StringGrid.Cells[ACol, ARow] = 'Othen
  begin
    stringGrid.Canvas.Brush.Color := clSkyBlue;
    ...
  end;

  // Am Schluss wird nun automatisch der alte Zustand für Brush und Font wieder hergestellt
  // Wir verlassen es also so, wie wir es vorgefunden haben
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)
  Mit Zitat antworten Zitat