AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid DragMode Color

Ein Thema von PaddyVII · begonnen am 27. Jan 2015 · letzter Beitrag vom 28. Jan 2015
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 07:48
Genau für dieses Szenario gibt es extra die Klassen Delphi-Referenz durchsuchenTBrushRecall und Delphi-Referenz durchsuchenTFontRecall.

Eine sinnvolle Ergänzung wäre es, wenn man sich noch ein Interface dafür bauen würde, dann käme man für die meisten mit nur einer Zeile Code aus. Ansonsten sieht das so aus:
Delphi-Quellcode:
procedure WorkWithCanvas( ACanvas : TCanvas );
var
  LBrushRecall : TBrushRecall;
begin
  LBrushRecall := TBrushRecall.Create( ACanvas.Brush );
  try

    ACanvas.Brush.Color := clRed;

  finally
    LBrushRecall.Free;
  end;
  // Jetzt ist ACanvas.Brush wieder wie vorher
end;
Mit einem Interface könnte das so aussehen
Delphi-Quellcode:
procedure WorkWithCanvas( ACanvas : TCanvas );
begin
  TBrushRecallFactory.Construct( ACanvas.Brush ); // erzeugt ein Interface

  ACanvas.Brush.Color := clRed;

end;
// nach dem Verlassen der Methode wird die Interface Referenz zerstört
// damit auch der Recall und damit der ACanvas.Brush wieder hergestellt :o)
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 (28. Jan 2015 um 07:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von PaddyVII
PaddyVII

Registriert seit: 20. Nov 2014
Ort: Pforzheim
75 Beiträge
 
Delphi XE6 Enterprise
 
#2

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 08:06
Ist das TBrushRecall denn für diesen "DraMode" innerhalb des grids dann verantwortlich?
"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."
Dan Rather
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 08: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
Benutzerbild von PaddyVII
PaddyVII

Registriert seit: 20. Nov 2014
Ort: Pforzheim
75 Beiträge
 
Delphi XE6 Enterprise
 
#4

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 08:34
Najaa, letzteres klingt relativ kompliziert, die erste (so wie ich das problem jetzt gelöst habe) und die zweite methode klingen doch realtiv plausibel....
Danke für deine Unterstützung^^
"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."
Dan Rather
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 08:44
Najaa, letzteres klingt relativ kompliziert, die erste (so wie ich das problem jetzt gelöst habe) und die zweite methode klingen doch realtiv plausibel....
Danke für deine Unterstützung^^
Ähm, wenn das Schreiben von einer Zeile Code schon zu kompliziert ist, wie programmierst du dann?
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
Benutzerbild von PaddyVII
PaddyVII

Registriert seit: 20. Nov 2014
Ort: Pforzheim
75 Beiträge
 
Delphi XE6 Enterprise
 
#6

AW: StringGrid DragMode Color

  Alt 28. Jan 2015, 08:55
Ich meinte das mit Recall..das versteh ich vom prinzip her schoon, vom code her nicht ganz...seii n bisschen nachsichtig mit mir, bin noch nicht soo lang am Programmieren mit delphi, bin erst im ersten ausbilungsjahr...
"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."
Dan Rather
  Mit Zitat antworten Zitat
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:21
Ich meinte das mit Recall..das versteh ich vom prinzip her schoon, vom code her nicht ganz...seii n bisschen nachsichtig mit mir, bin noch nicht soo lang am Programmieren mit delphi, bin erst im ersten ausbilungsjahr...
Verstehst du wie so eine Edit-Komponente oder StringGrid-Komponente intern funktioniert?
Wenn Nein, warum verwendest du diese dann?

Du verwendest diese, weil du das Gefühl hast, die macht das was du möchtest, egal wie sie dies macht. Du verlässt dich darauf, dass die zugesicherten Eigenschaften auch gebracht werden.

Genau so arbeitet man mit dem TBrushRecall oder mit der der (in der Handhabung) vereinfachten Form über TRecallFactory .

Die Unit in die uses aufnehmen und in jeder Methode, wo du an dem Brush rumwurschtelst rufst du als Erstes ein (passend zu deinem Code) TRecallFactory.Construct( stringgrid.Canvas.Brush ); auf. Nun kannst du dich darauf verlassen, dass dieser Brush beim Verlassen der Methode wieder genau so ist, wie der beim Betreten der Methode war. Du räumst also hinter dir auf und verlässt den Ort so, wie du ihn vorgefunden hast.
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
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 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