Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zelle färben


Simu - Di 31.08.04 11:38
Titel: Zelle färben
Hallo
bin ein Schiffe versenken am programmieren.
Jetzt möchte ich eine StringGrid Zelle einfärben wenn ich getroffen habe.
Kann mir jemand sagen was an meinem Code falsch ist?
Habe im Delphi Forum viel Beispiele gesehen, komme aber nicht dahinter. :oops:
Vielen Dank!!!
mfg


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:
procedure TForm1.StringGrid2MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  ACol, ARow : Integer;
begin
  StringGrid2.MouseToCell(x,y,ACol,ARow);
  if
    StringGrid2.Cells[ACol, ARow ] = 'X' then    //Prüft ob in Zelle ein X vorhanden ist
    begin
      StringGrid2.Cells[ACol,ARow]:='O';         //Wenn ein X vorhanden, dann Getroffen, ein O wird gesetz
      Label2.Caption:='Getroffen';
      StringGrid2.Canvas.Brush.Color:= clred;
  end;
  if
    StringGrid2.Cells[ACol, ARow ] = '=' then    //Prüft ob in Zelle ein = voranden ist
    begin
      Label2.Caption:='Nochmal';
    end;
  If
    StringGrid2.Cells[ACol, ARow ] = '' then     //Prüft ob in der Zelle nichts vorhanden ist
    begin
      StringGrid2.Cells[ACol,ARow]:='=';         //Wenn nichts vorhanden, dann nicht getroffen, ein = wird gesetzt
      Label2.Caption:='Nicht getroffen';
      computerschiesst();
    end;
end;


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.
Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Di 07.09.2004 um 10:44


jasocul - Di 31.08.04 12:45

Hi,

Du benutzt das falsche Ereignis. Nur im DrawCell.Ereignis werden die Zellen neu gemalt. Ich glaube die Eigenschaft DefaultDrawing muss auch noch auf True stehen.

Hoffentlich hatte ich das noch richtig in Erinnerung.

Gruß,
Peter


.Chef - Di 31.08.04 13:52

Hier mal ein Beispielcode aus einem meiner Programme. Dargestellt werden disassemblierte Programme in drei Spalten (Adresse, Befehl, Opcode). Wenn ein Breakpunkt gesetzt ist, wird die ganze Zeile rot eingefärbt wie bei den meisten Debuggern. Sollte zum verdeutlichen des Prinzips genügen:

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:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do
  begin
    if BP[ARow] then
    begin
      Canvas.Brush.Color:=clRed;
      Canvas.Font.Color:=clWhite;
      if Selection.Top = ARow then Canvas.Brush.Color:=clBlue;
    end else
    begin
      Canvas.Brush.Color:=clWhite;
      Canvas.Font.Color:=clBlack;
      if Selection.Top = ARow then
      begin
        Canvas.Brush.Color:=clHighlight;
        Canvas.Font.Color:=clWhite;
      end;
    end;
    if ACol = 1 then Canvas.Font.Style:=[fsBold] else Canvas.Font.Style:=[];
    Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,Cells[ACol,ARow]);
    Canvas.FrameRect(Rect);
  end;
end;


Gruß,
Jörg


Simu - Di 31.08.04 15:34

Danke hab das so gemacht.
jetzt habe ich aber das problem, dass ich die procedure nicht aufrufen kann in meinem code.

hab das so gemacht:


Quelltext
1:
2:
TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
         Rect: TRect; State: TGridDrawState);


ergiebt mir folgenden fehler:

nicht genügend wirkliche parameter

kannst du mir sagen wo ich den fehler mache?

danke !!

mfg


.Chef - Di 31.08.04 15:38

Der Code gehört ins OnDrawCell-Ereignis. Doppelklicke einfach im OI auf OnDrawCell und füge den Code dann dort ein.


Simu - Di 31.08.04 16:31

Vielen Dank, es hat funktioniert!! :D
Ihr habt mir sehr geholfen!!

Gruss Simu