![]() |
StringGrid Zellenfarbe ändern?
Hallo Leute, dies ist mein erster Beitrag und ich hoffe, dass ich hier im richtigen Teil des Forums gelandet bin. :-D
Ich habe kleine Picross-Spiel programmiert, so sieht es zur Zeit aus: ![]() Das Programm funktioniert soweit, die Zahlen schreibe ich in ein StringGrid, doch wenn man es am lösen ist wird es leider schnell unübersichtlich. :cry: Gibt es eine Möglichkeit, dass wenn ich eine 1 in eine Zelle schreibe sich diese Zelle (also der Hintergrund) z.B. blau färbt und wenn ich eine 0 reinschreibe die Zelle rot wird? :roll: Würde der Übersicht sehr gut dienen, doch leider kenne ich mich mit dem Färben nicht aus und andere Threads hier aus dem Forum haben mir da auch nicht wirklich weitergeholfen. Habe sowas gefunden:
Code:
Aber ich verstehe den Code nicht ganz, habe noch nie mit Prozeduren gearbeitet die nicht durch Buttons oder ähnliches aktiviert wurden, wäre über jede Hilfe sehr dankbar! :)
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin with TStringGrid(Sender).Canvas do begin if (ACol=1) and (ARow=1) then begin Brush.Color:= clRed; FillRect(Rect); end; end; end; |
AW: StringGrid Zellenfarbe ändern?
Diese Methode wird beim Malen jeder einzelner Zelle aufgerufen.
Sender ist die Referenz auf das Grid ACol und ARow sind die Indizes der Zelle Rect der Umriss der Zelle State gibt z.B. an, ob die Zelle markiert ist |
AW: StringGrid Zellenfarbe ändern?
Da ich ja nicht beim Malen, sondern nachdem ich etwas in eine Zelle geschrieben habe die Farbe ändern möchte, muss ich einfach StringGrid1GetEditText als Prozedur nehmen?
Aber wie pack ich dann das Abfragen ob eine 1 oder 0 drinne steht noch mit dem obrigen Code zusammen?
Code:
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
ARow: Integer; var Value: String); begin If StringGrid1.Cells[Acol,ARow]='1' Then brush.Color:=clRed; end; |
AW: StringGrid Zellenfarbe ändern?
Nein, Paint-Operationen sollten nur in der obigen Methode durchgeführt werden. Beim nächten Neuzeichnen ( nach Verdecke, Verschieben usw.) wären dann die Änderungen sonst wieder verschwunden.
|
AW: StringGrid Zellenfarbe ändern?
Versteh ich nicht.
Naja egal, lass ich es eben so wie es jetzt ist, funktioniert ja soweit alles, ist halt nur 'n bisschen unübersichtlich, aber was solls. ¯\_(ツ)_/¯ Danke trotzdem. :) |
AW: StringGrid Zellenfarbe ändern?
Damit kannst du starten:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var sg : TStringGrid; c : TCanvas; begin sg := TStringGrid( Sender ); c := sg.Canvas; if // Rand ( ACol = 0 ) or ( ARow = 0 ) then c.Brush.Color = clYellow else if // Zellen ( sg.Cells[ACol,ARow] = '1' ) then c.Brush.Color = clLime else c.Brush.Color = clWhite; c.FillRect(Rect); end; |
AW: StringGrid Zellenfarbe ändern?
Danke, das funktioniert prima! :-D
Aber wann genau wird die Prozedur jetzt ausgeführt, immer wenn ich etwas in das StringGrid schreibe, oder fragt er einfach dauernd ab ob die Zelle die 1 enthält oder nicht? Wenn man es nicht versteht ist es ja leider auf Dauer auch nicht so dolle. Bei den Buttons, Timer oder Formstart Events kann ich das noch nachvollziehen und es ist ja klar wann die ausgeführt werden, aber hier ist es ein wenig verwirrend für mich. :D |
AW: StringGrid Zellenfarbe ändern?
Habs auf meine Bedürfnisse angepasst und läuft jetzt wie geschmiert!
Bei dem Code von dir wurden auch die Headleisten mit den Lösungen mit Farbe überdeckt, was natürlich ungünstig war, hab das verbessert und bringt mir jetzt das gewünschte Ergebnis. ![]() 1000 Dank für den Code, und ein frohes Neues! :)
Code:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var sg : TStringGrid; c : TCanvas; begin sg := TStringGrid( Sender ); c := sg.Canvas; If (ACol>0) And (ARow>0) Then Begin If sg.Cells[ACol,ARow] = '1' Then c.Brush.Color := clBlack Else If sg.Cells[ACol,ARow] = '0' Then c.Brush.Color := clGray Else If sg.Cells[ACol,ARow] = '' Then c.Brush.Color := clWhite Else c.Brush.Color := clRed; //... c.FillRect(Rect); end; end; |
AW: StringGrid Zellenfarbe ändern?
War mir schon klar mit dem Übermalen, aber du solltest auch etwas dabei lernen - was ja auch funktioniert hat ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 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