![]() |
StringGrid DragMode Color
Guten Mittag alle zusammen,
ich hätt da mal ne kleine frage: und zwar färbe ich mit
Delphi-Quellcode:
Eine Zelle ein und schreibe ein 'O' Hinein(beim Click) (bzw. schreibe erst ein 'O' hinein und dann färbe ich die Zelle, dies geschieht an einer anderen stelle im code, is ja auch irrelevant;D). Wichtig ist, dass BEIDES passiert, sprich: ein 'O' geschrieben wird UND sich die zelle blau färbt! Das passt soweit auch :-D
if StringGrid.Cells[ACol, ARow] = 'O' then
begin stringGrid.Canvas.Brush.Color := clSkyBlue; Jedoch nicht, wenn ich eine Zelle nehme und sie verschiebe (Drag) innerhalb des stringgrids. Dann werden alle Zellen (Innherhalb der verschiebung) hellblau, jedoch wird kein 'O' hineingeschrieben, was auch nicht die absicht ist- mein ansatz: DRAG MODUS AUSSCHALTEN:D und schon steh ich vor dem Problem: Kann mir jemand sagen, wie ich diesen Drag mode INNERHALB der stringGrid und der Zellen ausschalten kann?? p.s: Hab schon alle möglichen einstellungen im Objektinspektor die was mit Drag zutunhatten Geändert/deaktiviert - erfolglos!! Ich habe versucht, mein problem soo genau wie möglich zu umschreiben, tut mir leid wenns bisschen kompliziert klingt... ...kann mir jemand die lösung ERKLÄREN sprich nicht nur code schreiben?? Ich danke euch im Vorraus LG Paddy_VII:thumb: |
AW: StringGrid DragMode Color
okay, für die dies interessiert: wenn man eine Farbe vorher nicht initialisiert (in meinem Fall brauchte ich weiß)
Delphi-Quellcode:
dann kommt Delphi etwas durcheinander und nimmt sich für alle Farbaktionen (bei mir der DragMode) einfach die letzte Farbe...
stringgrid.Canvas.Brush.Color := clWhite;
von demher, als tipp wer mit Canvas arbeitet sollte immer vorher seine farbe setzten (das klügste wäre natürlich weiß)... |
AW: StringGrid DragMode Color
Zitat:
Delphi-Quellcode:
var oldBrushColor:TColor;
begin [...] oldBrushColor:=stringgrid.Canvas.Brush.Color; stringgrid.Canvas.Brush.Color := clSkyBlue; //Mach was stringgrid.Canvas.Brush.Color:=oldBrushColor; [...] end; |
AW: StringGrid DragMode Color
könnte klappen, nur muss man doch dann die initialisierung VOR der zuweisung machen oder??
|
AW: StringGrid DragMode Color
Genau für dieses Szenario gibt es extra die Klassen
![]() ![]() 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:
Mit einem Interface könnte das so aussehen
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;
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) |
AW: StringGrid DragMode Color
Ist das TBrushRecall denn für diesen "DraMode" innerhalb des grids dann verantwortlich?
|
AW: StringGrid DragMode Color
Zitat:
Delphi-Quellcode:
hat mit Drag und sonst was nix, aber auch gar nix zu tun.
TBrushRecall
Du schreibst irgendwo im Paint-Event
Delphi-Quellcode:
Das kann man auch anders schreiben und zwar
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;
Delphi-Quellcode:
Bzw. so wie schon gezeigt, man merkt sich die Farbe beim Betreten der Methode und stellt diese Farbe wieder her.
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; 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:
und änderte deine Zeichen Methode so ab
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.
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; |
AW: StringGrid DragMode Color
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^^ |
AW: StringGrid DragMode Color
Zitat:
|
AW: StringGrid DragMode Color
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...:oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 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