Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 14.01.09 18:38 
Hallo!

Ich möchte also ein Game of Life programmieren. Dazu brauche und habe ich ein Array of Integer und ein Board (in meinem Fall ein StringGrid).
Bisher habe ich nur das:
www.delphi-forum.de/...ighlight=game+++life
... und die wenig effiziente Vorgangsweise, das Ganze im StringGrid1DrawCell anzeigen zu lassen. Das ist langsam, und wenn es erst etwas "können" soll - wenn also Regeln definiert sind - und alles samt den stetigen Änderungen jedesmal komplett neu gezeichnet werden muss, dann kannst du, während das Programm läuft, im Park spazieren gehen.

Ich brauche also eine Möglichkeit, auf eine Zelle des StringGrids per Rect zuzugreifen, so, wie es im StringGrid1DrawCell passiert, nur eben nicht dort, damit ich die Änderungen - und immer dur diese - neu zeichnen kann. Also in der Weise:
ausblenden Delphi-Quelltext
1:
if (Cell[i, j] = voll) and (Cell[i, j+1] = leer) then "tu was"					

oder im Array:
ausblenden Delphi-Quelltext
1:
if (Board[i, j] = voll) and (Board[i, j+1] = leer) then "zeig das im StringGrid an"					


Hier der Code:
ausblenden volle Höhe 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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
const leer  = 0;
      voll  = 1;
      col   = 150;
      row   = 150;

var
  Form1: TForm1;
  Board: array [0..col-10..row-1of Integer;

//..

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
begin
 for i := 0 to col do
  for j := 0 to row do
   if Random(25) = 0 then
    Board[i, j] := voll
   else
    Board[i, j] := leer;

 StringGrid1.Refresh;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  i, j: Integer;
begin
 for i := 0 to col do
  for j := 0 to row do
   if Board[i, j] = voll then
    with TStringGrid(Sender).Canvas do
    begin
     if (ACol = i) and (ARow = j) then
     begin
      Brush.Color := clRed;
      FillRect(Rect);
     end;  //if Board[i, j] = voll then
    end;  //with TStringGrid(Sender).Canvas do
end;

Wie geht das?


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 14.01.2009 um 18:21

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 14.01.09 18:55 
Ein StringGrid ist eben langsam. Wenn dir das zu langsam ist, warum machst du das denn überhaupt damit? :gruebel:
Es gibt btw. auch noch ein DrawGrid, und richtig schnell wäre es, wenn du es gleich selbst zeichnest. Schließlich willst du das doch ohnehin...

Trotzdem ist die Lösung für deine direkte Frage sehr einfach:
ausblenden Delphi-Quelltext
1:
2:
  StringGrid1.Canvas.Brush.Color := clRed;
  StringGrid1.Canvas.FillRect(StringGrid1.CellRect(11));
Damit wird die Zelle (1,1) rot gefüllt.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 15.01.09 22:17 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Trotzdem ist die Lösung für deine direkte Frage sehr einfach:
ausblenden Delphi-Quelltext
1:
2:
  StringGrid1.Canvas.Brush.Color := clRed;
  StringGrid1.Canvas.FillRect(StringGrid1.CellRect(11));
Damit wird die Zelle (1,1) rot gefüllt.

Danke, aber mal sehen, ob ich da noch weitermache...

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!