| Autor |
Beitrag |
Mentor86
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 13:27
Hi, wie kann ich die einzelne Zelle eines Stringgrids färben. So wie ich es machen will, funktioniert es nicht.
Delphi-Quelltext 1:
| stringgrid1.Cells[x,0].color:=clred; |
Bitte helft mir.
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 13:57
Hallo!
Erst einmal die Erklärung, weshalb Dein Quelltext nicht funktioniert: Cells ist vom Typ "String" und besitzt deshalb keine Eigenschaften!
Und hier eine Lösung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (ACol = 1) and (ARow = 1) then begin StringGrid1.Canvas.Font.Color := clRed; StringGrid1.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol,ARow]); end; inherited; end; |
Du zeichnest die Zelle, die hervorgehoben werden soll, selbst, indem Du obigen Quellext im OnDrawCell-Ereignis des StringGrid verwendest. Bei ACol und ARow kannst Du dann die Werte (Variablen) einsetzen, die Du benötigst.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 15:47
Ok, das habe ich verstanden. Aber ich habe eine neue Frage: Wie bekomme ich das hin, dass wenn ich in das Stringgrid in eine Zelle klicke, dort z.B. eine 1 erscheint? Ich weiss, dass es irgendwie mit dem Ereigns Onmousedown gehen muss, habe es aber noch nicht hinbekommen.
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 15:54
Und hier ist er, der ultimative Klick-in-die-Zelle-und-Du-bekommst-eine-1-Algorithmus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); VAR col, row : Integer; begin StringGrid1.MouseToCell(x,y,col,row); StringGrid1.Cells[col,row]:='1'; end; |
Wie Du siehst, liefet MouseDown die Koordinaten in "Pixeln", die mit MouseToCell in "Zellen" umgewandelt werden.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 15:54
Kann mir einer sagen, was hier falsch ist? Ich habe ein Stringgrid von 50 mal 2 Zellen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure einfaerben; var i:integer; begin for i:=0 to 50 do begin form1.stringgrid1.canvas.brush.color:=clmaroon; if (form1.stringgrid1.cells[i,1]='0') then begin form1.stringgrid1.canvas.brush.color:=clgreen; form1.stringgrid1.canvas.FillRect(Rect(i*30,0,(i+1)*30),30); end; end; end; |
das funktioniert irgendwie nicht. Der soll über alle Felder, die eine 1 beinhalten ein rotes Rechteck zeichnen, über alle andere ein grünes.
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
Zuletzt bearbeitet von Mentor86 am Fr 18.07.03 16:01, insgesamt 1-mal bearbeitet
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 15:56
Danke schonmal für den Code mit dem Mausklick.
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 15:57
Hallo!
Könntest Du in Deinen Beiträgen den BBCode aktivieren, damit die Tags funktionieren?
Außerdem wäre es gut, wenn Du beschreiben könntest, was er stattdessen macht!
Danke
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 16:04
Also, genau gesagt, macht er garnichts, bis auf das er beim Starten des Programms im Kompiler-Fenster anzeigt: "Deklaration erwartet, aber FOR gefunden."
Komisch, bei unserem Lehrer in der Schule hat das funktioniert.
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 16:39
Die Zeile mit dem Fillrect scheint schon nicht so richtig zu stimmen, insbesondere der Teil mit "Rect(...".
Könntest Du noch schreiben, wo und vor allem wie Du die Prozedur aufrufst?
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 17:00
Also, Ziel ist es einen zellulären Automaten nach der von Neumann Funktion zu bauen. Wie haben das so gemacht, das ein Feld, welches Entweder links oder rechts ein Feld hat, wo eine 1 drinsteht ebenfalls zur 1 mutiert. Hat die Zelle keinen Nachbarn mit 1, so wird sie auf 0 zurückgesetzt. Nun will ich die Prozedur mit dem einfaerben zur Übersicht einbauen. Hier mal der Quelltext.
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:
| procedure TForm1.Timer1Timer(Sender: TObject); var i,x,y:integer; begin x:=0; y:=0; for i:=0 to 50 do begin if (stringgrid1.Cells[x,0]='1') or (stringgrid1.cells[x+2,0]='1') then begin stringgrid1.cells[x+1,1]:='1'; end else begin stringgrid1.cells[x+1,1]:='0'; end; x:=x+1; end; for i:=0 to 50 do begin stringgrid1.cells[y,0]:=stringgrid1.cells[y,1]; y:=y+1; end; end;
einfaerben;
end; |
Dies ist der Zusammenhang.[/b]
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 18:16
Hi!
So tut sich was!
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:
| procedure einfaerben; var i:integer; myRect : TRect; begin for i:=0 to 50 do begin form1.stringgrid1.canvas.brush.color:=clmaroon; if (form1.stringgrid1.cells[i,1]='0') then begin myRect.Left:=i*31; myRect.Top:=0; myRect.Bottom:=30; myRect.Right:=(i+1)*31; form1.stringgrid1.canvas.brush.color:=clgreen; form1.stringgrid1.canvas.FillRect(myRect); end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin einfaerben; end; |
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 18:48
Eine abschliessende Frage noch:
Ich habe durchnummerierte Shapes. Wenn man in ein Editfeld eine Zahl eingibt und bestätigt, soll genau dieses Shape seine Farbe wechseln. Ich habe die Shapes durchnummeriert: sh1, sh2, sh3 usw.
wie kann ich es jetzt hinbekommen, dass das seine farbe wechselnde shape, der eingegeben Zahl entspricht. So gings bei mir nicht:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var i:integer; begin i:=strtoint(eingabe.text); shi.brush.color:=clred; end; |
GEht sowas überhaupt?
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.07.03 18:56
Das wird ein farbenfrohes Programm! So geht's mit den Shapes:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); VAR i : INTEGER; begin if Form1.FindComponent('sh'+edit1.text) is TShape then TShape(Form1.FindComponent('sh'+edit1.text)).brush.Color:=clRed; end; |
Du solltest nur noch prüfen, ob edit1 auch eine gültige Zahl enthält!
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mentor86 
      
Beiträge: 46
|
Verfasst: Fr 18.07.03 19:28
Danke für deine Hilfe. Mein Programm wird bald fertig sein. :)
_________________ Man kann Probleme nicht mit Denkweisen lösen, die zu ihnen geführt haben.
|
|
C++arsten
      
Beiträge: 79
|
Verfasst: So 05.02.06 09:22
Titel: Dazu hab ich eine Frage
Ich muss nochmal zu etwas Grundsätzlichem nachhaken:
Wenn in der ersten Spalte eines StringGrids, egal in welcher Zeile, "AS" eingegeben wird, soll die Zelle [3,2] grau hinterlegt werden. Wird das "AS" hingegen weggenommen, dann soll die Zelle wieder normal weiß gezeichnet werden.
Ich habe es so versucht, aber es läuft nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (StringGrid1.Cells[1, ARow] = 'AS') then begin with TStringGrid(Sender).Canvas do begin if (ACol = 3) and (ARow = 2) then begin Brush.Color:= clGray; FillRect(Rect); end; end; end; end; |
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 05.02.06 10:10
Das geht schon, aber wenn du in Zelle 1,1 etwas änderst, wird nur diese Zelle neu gezeichnet. Das Grid kann ja nicht wissen, das dann auch zelle 3,2 neu gezeichnet werden muß. Reagier z.B. im onsetedittext auf eine änderung und veranlasse das neuzeichnen der Zelle.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
C++arsten
      
Beiträge: 79
|
Verfasst: So 05.02.06 10:29
Danke, habe ich gemacht, klappt auch.
Nur - wie schaffe ich es, statt des Textes 'Hallo Welt' die Fläche grau zu belegen? Die Zuweisung von Hallo Welt war nur ein Test, grau muss es sein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin if (StringGrid1.Cells[1, ARow] = 'AS') then begin StringGrid1.Cells[2, ARow] := 'Hallo Welt'; end else if (StringGrid1.Cells[1, ARow] = 'Z') then begin StringGrid1.Cells[3, ARow] := 'Hallo Welt'; end else if (StringGrid1.Cells[1, ARow] = 'AG') then begin StringGrid1.Cells[4, ARow] := 'Hallo Welt'; end; end; |
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 05.02.06 10:36
mit invalidatecell kannst du das neuzeichnen einer einzelnen Zelle veranlassen. invalidatecell ist aber protected
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type Tgridhack=class(Tstringgrid); ...
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (acol=3) and (Arow=2) then beep; end;
procedure TForm1.Button1Click(Sender: TObject); begin Tgridhack(StringGrid1).InvalidateCell(3,2); end; |
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
C++arsten
      
Beiträge: 79
|
Verfasst: So 05.02.06 10:52
Danke, ich habe es probiert, aber irgendwie scheint das noch nicht zu funktionieren.
Wenn ein 'AS' eingegeben wird in der ersten Spalte, soll in der gleichen Zeile die Zelle 3 grau hinterlegt werden.
Wenn aber 'Z' eingegeben wird, dann muss die vormals graue Zelle 3 wieder normal dargestellt werden, dafür aber Zelle 2 grau sein.
In Abhängigkeit also von 'AS' oder 'Z' in der ersten Spalte wird die eine bzw. andere Zelle an- bzw. ausgeknipst.
Himmel hilf.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 05.02.06 13:42
ohne deinen aktuellen code wird niemand helfen können ...
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|