Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - StringGrid Farbe einer einzelnen Zelle ändern??
Éde1987 - Sa 23.12.06 00:34
Titel: StringGrid Farbe einer einzelnen Zelle ändern??
Also ich habe schon wieder ein Problem!
Ich will die Farbe meines StringGrids ändern, was ja dachte ich nicht so schwer sein kann. Da habe ich mich aber sehr doll getäuscht. Ich kapier auch keinen der anderes Themen deshalb nochmal ein neues. Bitte nochmal für ganz doofe erklären!
Danke...
Bsp:
Delphi-Quelltext
1:
| StringGrid1.Cells[1,1] --> sei bitte rot |
geht nicht :(
jaenicke - Sa 23.12.06 00:41
Tja, da gibts nix fertiges für, da musst du das selber zeichnen. Aber die Frage war ja nun schon oft da...
Éde1987 - Sa 23.12.06 00:44
Stimmt schon aber ich bin noch ein totaler newbe was programmieren angeht deshalb brauche ich hilfe und das fachschinesisch kapier ich net
jaenicke - Sa 23.12.06 00:47
Fachchinesisch? Naja...
http://www.delphi-forum.de/viewtopic.php?t=56605#339406
Dort wird jetzt nur der Hintergrund gefärbt, aber etwas weiter oben steht auch die Textausgabe...
Aber da sehe ich ehrlich gesagt kein Fachchinesisch. Egal, probier das mal so aus, wie in dem verlinkten Beitrag...
Éde1987 - Sa 23.12.06 00:54
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if ((Acol = 13) and (ARow = 13)) then begin StringGrid1.Canvas.Brush.Color := clRed;; StringGrid1.Canvas.FillRect(Rect); end; end; |
ok das ist schon fast ganz verständlich nur nochmal ne frage:
was bedeutet das State: TGridDrawState und wofür bracuhe ich das?
jaenicke - Sa 23.12.06 01:02
Das brauchst du erstmal nicht so dringend... Aber wenn du es wissen willst, warum siehst du nicht in der Hilfe nach?
Zitat: |
TGridDrawState represents state information about the cell of a grid that is being rendered. It is a set that includes 0 or more of the following:
Value Meaning
gdSelected
The cell is currently selected.
gdFocused
The cell has input focus.
gdFixed
The cell is in the fixed region of the grid. |
Du kannst danach entscheiden, ob du die Zelle anders zeichnen musst, weil sie zum Beispiel gerade markiert ist.
Éde1987 - Sa 23.12.06 01:06
man ich kapiere es nicht!
sagen wir mal ich habe mein StringGrid und will das Kästchen an der Stelle x,y rot malen wie geht das? da muss es doch was einfaches geben!
jaenicke - Sa 23.12.06 01:09
Ähh, du hast den Quelltext doch gerade selbst nochmal gepostet... Mehr ist das nicht... Da muss nur nochmal wie etwas über diesem Quelltext im von mir verlinkten Thread stand noch der Text gezeichnet werden. Aber die Einfärbung ist nur das, was du schon hast.
Du musst allerdings auch das Ereignis OnDraw im Objektinspektor damit verknüpfen. Deshalb heißt die Prozedur ja auch StringGrid1DrawCell... OnDrawCell in StringGrid1 eben...
Éde1987 - Sa 23.12.06 01:15
ok danke ist nett das du es versucht hast.
ich kann es anscheinend nicht.
Delphi-Quelltext
1: 2:
| StringGrid1.Canvas.Brush.Color := clRed;; StringGrid1.Canvas.Rectangle(ACol,ARow); |
wie kann ich jetzt ACOL und AROW eine reieh bzw spalte zuordnen wenn das nicht geht dann bekomme ich es wohl nicht hin.
jaenicke - Sa 23.12.06 01:21
Das geht so nicht. Du musst darauf regieren, wenn eine bestimmte Zelle neu gezeichnet werden muss, weil sie zum Beispiel von einem anderen Fenster verdeckt war.
Jetzt mal ganz von vorne:
Klick mal dein StringGrid an. Dann geh in den Objektinspektor links und klick dort auf Events. Jetzt such dort OnDrawCell. Klick doppelt drauf. Jetzt landest du im Quelltext und dort befindest du dich jetzt innnerhalb einer Prozedur, die genauso heißt wie hier im Beispiel.
Dort ergänzt du dann den Quelltext, den du eben zitiert hast...
Éde1987 - Sa 23.12.06 01:32
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
| procedure TForm1.FormCreate(Sender: TObject); var i,j:integer; begin For i:=1 to 8 do for j:=1 to 8 do Feld[j,i]:=' '; for i:=1 to 8 do Begin StringGrid1.Cells[0,i]:=chr(64+i); StringGrid1.Cells[i,0]:=inttostr(i); StringGrid1.Cells[0,0]:='%'; end; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j,x,y:integer; Label Schiff; begin Randomize; For i:=1 to 8 do For j:=1 to 8 do Feld[j,i]:=' '; Schiff: For i:=1 to 8 do For j:=1 to 8 do Feld[j,i]:=' '; For i:=1 to 5 do begin x:=Random(8)+1; y:=Random(8)+1; if Feld[x,y]='s' then goto Schiff else Feld[x,y]:='s'; end; For i:=1 to 8 do For j:=1 to 8 do StringGrid1.Cells[j,i]:=Feld[j,i]; end;
procedure TForm1.Button2Click(Sender: TObject); begin close; end;
procedure TForm1.Button3Click(Sender: TObject); var x:char; i,j,y,z:integer; Rect: TRect; ACol,ARow:String; begin x:=Edit1.text[1]; Case x of 'A': z:=1; 'B': z:=2; 'C': z:=3; 'D': z:=4; 'E': z:=5; 'F': z:=6; 'G': z:=7; 'H': z:=8; 'a': z:=1; 'b': z:=2; 'c': z:=3; 'd': z:=4; 'e': z:=5; 'f': z:=6; 'g': z:=7; 'h': z:=8; end; y:=strtoint(edit2.Text); if Feld[y,z]='s' then begin Feld[y,z]:='T'; StringGrid1.Cells[j,i]:=Feld[j,i]; end else Feld[y,z]:='X'; For i:=1 to 8 do For j:=1 to 8 do StringGrid1.Cells[j,i]:=Feld[j,i]; Edit1.Clear; Edit2.Clear; end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if ((Acol = 13) and (ARow = 13)) then begin StringGrid1.Canvas.Brush.Color := clRed;; StringGrid1.Canvas.FillRect(Rect); end; end; |
so das ist mein Quelltext. Das soll mal sowas wie Schiffe versenken werden und ich vesuche nun das Feld welches ich eigebe rot auszumalen aber es geht immer noch nicht du kannst es dir ja mal angucken wenn du lust hast. Ich danke schonmal im vorraus für die Mühe auch wenn du nun keine Lust mehr hast noch mehr zu helfen. Das könnte ich nömlich gut verstehen.
jaenicke - Sa 23.12.06 02:40
Du hast offenbar nicht ganz verstanden, was der Quelltext eigentlich macht ;-).
Der zeichnet die Zelle in Zeile 13 und Spalte 13 rot... Und wenn du woanders eine Zelle rot haben willst, dann musst du eben diese if-Abfrage ändern...
In ACol steht die Spalte und in ARow die Zeile. So, und die Färbung passiert eben nur, wenn beides 13 ist. Wenn du also die ganze Spalte 12 rot haben willst, dann musst du schreiben: if ACol = 12 then
Du musst hier eben wissen, ob die mit ACol und ARow angegebene Zelle (die gerade neu gezeichnet werden muss) rot sein soll oder nicht...
Wann welche Zelle gezeichnet wird weißt du nicht, es kann also auch die mittlere zuerst gezeichnet werden. Du bekommst übergeben, welche gerade neu gezeichnet werden soll und musst darauf reagieren, dass diese spezielle Zelle neu gezeichnet werden muss...
Éde1987 - Sa 23.12.06 10:51
Also nur nochmal für alle anderen ich habe es jetzt so gemacht...
Delphi-Quelltext
1: 2:
| StringGrid1.Canvas.Brush.Color := clRed; StringGrid1.Canvas.Rectangle(y*31,z*31,(y+1)*31,(z+1)*31); |
da das ganze andere zeug bei mir nicht geklappt hat!
aber ich danke jaenicke für seine Mühe auch wenn sie mir als newbe zu hoch war.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!