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] = '
O'
then
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] = 'O' then
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] = 'O' then
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;