Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Auf eine String Grid Zelle zugreifen


I-Drizzt-I - Fr 30.10.09 16:42
Titel: Auf eine String Grid Zelle zugreifen
Hallo zusammen,

Ich möchte Schiffeversenken mit Delphi 7 programmieren. Dazu verwende ich 2 String Grids als Felder.
Das programm habe ich schon mit in C# geschrieben. Das problem was ich momentan habe ist, dass ich nicht weiß wie ich auf eine Zelle des String Grids zugreifen kann.
Wie ich die x und y koordinaten der Zelle bekomme auf die ich klicke weiß ich schon.

In C# gab es hierfür einen einfach Befehl:

NameDesGrids[x-Koordinate, y-Koordinate].weitereBefehle

Gibt es in Delphi einen vergleichbaren Befehl und mit welchem Befehl kann ich die Farbe der Zellen ändern?

Ich hoffe ihr könnt mir helfen

Mfg
Drizzt


Lannes - Fr 30.10.09 16:51

Hallo,

zugreifen: Grid.Cells[Col,Row] := 'Hallo';
Eine Zelle hat keine definierte Farbe, deshalb färben in der Ereignisbehandlung zu OnDrawCell.


I-Drizzt-I - Fr 30.10.09 19:43

user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:

Eine Zelle hat keine definierte Farbe, deshalb färben in der Ereignisbehandlung zu OnDrawCell.


Ich kann also nicht per klick auf die Zelle die Farbe dieser Zelle verändern. Gibt es denn keinen befehl wie Style.clrRed oder sowas.

Ich wollte das ganze nämlich auf Farben aufbauen, das String Grid ist von anfang an Blau. Möchte ich nun z.B mein Schlachtschiff setzten soll die ausgewählte Zelle plus 4 weitere (senkrecht oder waagerecht) in eine andere Farbe wechseln und damit dann das Schiff darstellen.

Gibt es keine möglichkeit das so zu realiesieren?

mfg
Drizzt


Xentar - Fr 30.10.09 20:13

user profile iconI-Drizzt-I hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es keine möglichkeit das so zu realiesieren?

Doch - aber eben nicht so einfach mit Style oder sowas, sondern wie oben schon geschrieben, im Ereignis OnDrawCell selber malen.


Lannes - Fr 30.10.09 21:12

Hallo,

user profile iconI-Drizzt-I hat folgendes geschrieben Zum zitierten Posting springen:
...
Wie ich die x und y koordinaten der Zelle bekomme auf die ich klicke weiß ich schon.
da hast Du ja schon den ersten Schritt. :wink:

Zusätzlich zu Grid.Cells[c,r] gibt es auch Grid.Objects[c,r], in Objects kann man einen Zeiger auf Objekte ablegen, u.A. auch auf einen Farbwert:

Delphi-Quelltext
1:
2:
3:
4:
//zuweisen
Grid.Objects[c,r] := Pointer(clRed); 
//abfragen (Farbwert ist Integer)
MyColor := Integer(Grid.Objects[c,r]);


Das Array Objects wird automatisch durch Delphi bei der Initialisierung des Grid mit Pointer(0) belegt, Farbwert 0 ist schwarz. Also mit einer Schleife in OnCreate der Form die Hintergrundfarbe des StringGrid in allen Zellen hinterlegen:

Delphi-Quelltext
1:
Grid.Objects[c,r] := Pointer(Grid.color);                    

Wenn jetzt auf eine Zelle geklickt wird, die Koordinaten hast Du ja, hinterlegst Du in Objects die Farbe. Auch in den anderen Zellen(... 4 waagerecht oder senkrecht).

Nun brauchst Du nur noch im Event-Handler zum Ereignis OnDrawCell die Farbe abfragen und entsprechend die jeweilige Zelle ausmalen. Die Variablen ACol, ARow und Rect liefern Dir die erforderlichen Werte.

Delphi-Quelltext
1:
2:
Grid.Canvas.Brush.Color := Integer(Grid.Objects[ACol,ARow]);
Grid.Canvas.FillRect(Rect);


Das Ereignis OnDrawCell wird automatisch ausgelöst, wenn Objects verändert wird :idea:


I-Drizzt-I - Sa 31.10.09 13:32

Vielen dank,

Genau das hab ich noch gebraucht, ihr habt mir echt geholfen =)

Ich denke den rest bekomm ich auch alleine hin.