Autor Beitrag
Mentor86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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.
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.07.03 15:54 
Und hier ist er, der ultimative Klick-in-die-Zelle-und-Du-bekommst-eine-1-Algorithmus:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 18.07.03 15:54 
Kann mir einer sagen, was hier falsch ist? Ich habe ein Stringgrid von 50 mal 2 Zellen.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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.

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.07.03 18:16 
Hi!

So tut sich was!

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 18.07.03 18:56 
Das wird ein farbenfrohes Programm! So geht's mit den Shapes:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: 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:
ausblenden 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: 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.

ausblenden 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 user profile iconGausi: Code- durch Delphi-Tags ersetzt
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 05.02.06 10:36 
mit invalidatecell kannst du das neuzeichnen einer einzelnen Zelle veranlassen. invalidatecell ist aber protected

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 79



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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)