Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringGrid: Aktion beim Zellenanklicken (https://www.delphipraxis.net/70671-stringgrid-aktion-beim-zellenanklicken.html)

Freaky89 2. Jun 2006 14:24


StringGrid: Aktion beim Zellenanklicken
 
Hallo!

Ich würde gerne eine Simulation programmieren und bräuchte dazu vorerst ein Gitterfeld, dass, wenn man ein Feld anklickt, in diesem Feld die Farbe ändert.

Ich hatte es mit StringGrid versucht und dabei bin ich auf das Problem gestoßen, dass ich zwar Zellen durch Canvas.Pixels[x,y]:=TColor; färben kann, aber es nicht schaffe, dass sie sich erst färbt, wenn ich auf die Zelle klicke!

Wenn so eine Aktion nicht möglich ist hat jemand vielleicht eine andere Idee, wie man das realisieren könnte (durch die andere Komponente vielleicht).

LG Freaky

shmia 2. Jun 2006 15:24

Re: StringGrid: Aktion beim Zellenanklicken
 
Das lässt sich mit einen StringGrid durchaus lösen.
Jede Zelle des StringGrid muss aber zusätzlich zum Text eine Information (Farbe) tragen.
Diese Info kann man nun im Text der Zelle selbst unter bringen oder im
Property Objects[].

Delphi-Quellcode:
// StringGrid.DefaultDrawing auf False setzen
// OnDrawCell - Handler
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   celltext:string;
   canvas : TCanvas;
   color : TColor;
begin
   celltext := StringGrid1.Cells[Acol, ARow];
   Canvas := StringGrid1.Canvas;

   if (ACol >= StringGrid1.FixedCols) and (ARow>= StringGrid1.FixedRows) then
   begin
      color := clGreen;
      if celltext = '*' then
         color := clRed
   end
   else
      color := clBtnface;

   // Hintergrund zeichnen
   Canvas.Brush.Color := color;
   Canvas.FillRect(Rect);
   // Text ausgeben
   DrawText(Canvas.Handle, PChar(celltext), Length(celltext), Rect, DT_SINGLELINE);
end;
Du brauchst jetzt du die Zellen mit einem '*' zu belegen und sie werden rot.

Freaky89 3. Jun 2006 12:25

Re: StringGrid: Aktion beim Zellenanklicken
 
Hey,
danke für die Antwort, hat geklappt.

Nur noch ne Frage, damit ich besser versteh wieso das funktioniert.. :gruebel: :-D

onDrawCell heißt in meinem Buch, tritt ein, wenn die Zelle neu gezeichnet werden muss, bedeutet dass immer, wenn man was an der Zelle verändert tritt die Aktion ein?

Und wieso fräbt er bei dieser Anweisung nicht die komplette StringGrid, sondern nur die ausgewählte Zelle?

Danke jetzt schon Freaky!

shmia 6. Jun 2006 09:11

Re: StringGrid: Aktion beim Zellenanklicken
 
Zitat:

Zitat von Freaky89
onDrawCell heißt in meinem Buch, tritt ein, wenn die Zelle neu gezeichnet werden muss, bedeutet dass immer, wenn man was an der Zelle verändert tritt die Aktion ein?

Das Event OnDrawCell wird "abgefeuert" wenn:
* der Inhalt der Zelle wurde verändert wurde
* Das StringGrid oder Teile davon aufgedeckt werden, nachdem es von einem anderen Fenster verdeckt wurde
* das StringGrid und/oder sein Parent (das Form auf dem es liegt) sichtbar geworden sind.
Zitat:

Zitat von Freaky89
Und wieso fräbt er bei dieser Anweisung nicht die komplette StringGrid, sondern nur die ausgewählte Zelle?

Weil die Farbe nur auf den aktuellen Canvas angewendet wird (Canvas.Brush.Color := ...) und nicht auf
das gesamte Stringgrid (StringGrid1.Color :=...).

Helmi 25. Jan 2007 19:02

Re: StringGrid: Aktion beim Zellenanklicken
 
Hallo,

ich hätte zu diesem Thema auch ne Frage:

Ich würd gern das gleiche machen, also beim Klick auf eine Zelle diese farbig ändern.

Tests mit OnSelectCell haben leider nichts gebracht.

Hier mein momentaner Code:
Delphi-Quellcode:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
var
  r: TRect;

begin
  with StringGrid1 do
    begin
      r := CellRect(ACol, ARow);



      If Canvas.Brush.Color = clBlue then
        Canvas.Brush.Color := clRed
      else
        Canvas.Brush.Color := clNavy;

    Canvas.FrameRect(R);
  end;
end;
Den "TRick" mit eintragen eines Zeichens in die Zelle und dann das decodieren der Farbe der Zelle im OnDrawCell kenn ich, aber ginge das nicht einfach auch mit OnSelectRect?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 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