Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Zelle in DrawGrid dauerhaft einfärben (https://www.delphipraxis.net/188705-zelle-drawgrid-dauerhaft-einfaerben.html)

hedie 30. Mär 2016 07:39

Zelle in DrawGrid dauerhaft einfärben
 
Hallo zusammen

Ich möchte ein "zeichnungstool" für kleine Grafiken erstellen.
Dazu müssen die Pixel recht gross sein.

Deshalb wollte ich dazu ein DrawGrid nehmen.

Um das Pixel bzw. die Zelle zu markieren, habe ich bisher folgenden Code:

Delphi-Quellcode:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (gdSelected in State) then begin

    DrawGrid1.Canvas.Brush.Color := clBlue;
    DrawGrid1.Canvas.FillRect(Rect);


  end;
Die macht mir die Zelle auch blau, leider bleibt diese aber nicht blau, sobald ich eine andere Zelle anklicke.
Kann mir jemand sagen, wie ich dies erreiche, dass die Zelle markiert bleibt?

Später möchte ich dann zelle um zelle durchgehen um zu sehen welche pixel 1 sind und welche 0.

Danke schonmal

Helmi 30. Mär 2016 07:45

AW: Zelle in DrawGrid dauerhaft einfärben
 
Hallo,

ich hatte mal so was ähnliches gemacht (war aber ein StringGrid)
(ich schalte zwar nur zwischen zwei Farben um, aber das Prinzip sollte sichtbar sein)

Im MouseDown hab ich die Farbe selektiert und als Object in die Zelle geschrieben
Delphi-Quellcode:
procedure TForm3.StringGridMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ACol : Integer;
  ARow : Integer;
  Farbe : TColor;

begin
  StringGrid.MouseToCell(X, Y, ACol, ARow);

  Farbe := Integer(StringGrid.Objects[ACol, ARow]);

  If Farbe = SelectColor then
    Farbe := StandardColor
  else
    Farbe := SelectColor;

  StringGrid.Objects[ACol, ARow] := Pointer(Farbe);
end;
und in DrawCell der Zelle zugewiesen
Delphi-Quellcode:
procedure TForm3.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  If gdFixed in State then
    exit;

  Rect.Left := Rect.Left - 4;

  StringGrid.Canvas.Brush.Color := Integer(StringGrid.Objects[aCol, ARow]);
  StringGrid.Canvas.FillRect(Rect);
end;

hedie 30. Mär 2016 08:14

AW: Zelle in DrawGrid dauerhaft einfärben
 
Vielen Dank

Hat bestens geklappt :)

Sir Rufo 30. Mär 2016 08:24

AW: Zelle in DrawGrid dauerhaft einfärben
 
Sehr gruselig dieser Ansatz.

Man erstellt sich eine Datenklasse und speichert dort die Informationen. Und weil diese Datenklasse ja eine Grafik darstellt spendiert man der auch noch so lustige Methoden wie
Delphi-Quellcode:
FromBitmap
und
Delphi-Quellcode:
ToBitmap
oder sogar besser per
Delphi-Quellcode:
Assign
(ableiten von
Delphi-Quellcode:
TPersistent
).

Helmi 30. Mär 2016 08:29

AW: Zelle in DrawGrid dauerhaft einfärben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1334125)
Sehr gruselig dieser Ansatz.

Mit welcher Erklärung?

Sir Rufo 30. Mär 2016 08:48

AW: Zelle in DrawGrid dauerhaft einfärben
 
Zitat:

Zitat von Helmi (Beitrag 1334126)
Zitat:

Zitat von Sir Rufo (Beitrag 1334125)
Sehr gruselig dieser Ansatz.

Mit welcher Erklärung?

  • Fehlende Trennung von Anzeige und Daten
  • Missbrauch von
    Delphi-Quellcode:
    TObject
  • ...

Helmi 30. Mär 2016 08:52

AW: Zelle in DrawGrid dauerhaft einfärben
 
warum einfach wenn´s auch kompliziert geht...

Um eine Diskussion vorzubeugen: es gibt immer mehrere Wege zur Lösung

Sir Rufo 30. Mär 2016 09:05

AW: Zelle in DrawGrid dauerhaft einfärben
 
Es gibt eben immer mehr schlechte und falsche Wege als gute und richtige :stupid:

Helmi 30. Mär 2016 09:10

AW: Zelle in DrawGrid dauerhaft einfärben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1334135)
Es gibt eben immer mehr schlechte und falsche Wege als gute und richtige :stupid:

bislang hab ich nur Mängel an meiner Lösung gelesen, aber noch keine "gute und richtige" Lösung gesehen

Sir Rufo 30. Mär 2016 09:17

AW: Zelle in DrawGrid dauerhaft einfärben
 
Zitat:

Zitat von Helmi (Beitrag 1334137)
Zitat:

Zitat von Sir Rufo (Beitrag 1334135)
Es gibt eben immer mehr schlechte und falsche Wege als gute und richtige :stupid:

bislang hab ich nur Mängel an meiner Lösung gelesen, aber noch keine "gute und richtige" Lösung gesehen

Deine Lösung kann mit einem simplen Array schon verbessert werden. Muss man das jetzt explizit aufschreiben?

Runder wird das mit einer Klasse, wo man noch ein paar Hilfsmethoden dranbaut um aus dem Farbarray ein Bitmap zu bauen.

Das Konzept hatte ich ja schon skizziert


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz