Autor Beitrag
I-Drizzt-I
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 30.10.09 16:42 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
I-Drizzt-I Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.

_________________
PROGRAMMER: A device for converting coffee into software.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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.
ausblenden 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
I-Drizzt-I Threadstarter
Hält's aus hier
Beiträge: 4



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