Autor Beitrag
Nini
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mo 09.03.15 22:14 
Ich muss für die Schule das Game of life programmieren.
ich habe mir auch schon einen Handlungsplan überlegt und bin schon so weit gekommen, dass ich weiß, dass ich nen timer brauchen und nen stringgrid.

aber jetzt weiß ich nicht mehr weiter. Wie funktionieren die Befehle, die die Zellen die ich makiere (wie gehts das eigentlich) einlesen?

Danach will ich über ein Feld festlegen, dass die makierten schwarz werden und damit wahr sind und die weißen falsch also quasi ein array of boolean, kann das so funktionieren?

weiter weiß ich leider noch nicht :/

danke, wenn ihr mir helfen könntet

und ja, ich habe auch shcon die anderen themen durchgelesen aber ich verstehe das alles einfach überhaupt nicht ;/


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 09.03.2015 um 21:54
Moderiert von user profile iconNarses: Titel geändert, war: "game of life stringgrid - probleme mit der delphi-sprache"
Moderiert von user profile iconNarses: Titel geändert, war: "[Hausaufgabe] Game of Life".
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 09.03.15 23:19 
Moin und :welcome: in der EE!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Ich muss für die Schule das Game of life programmieren.
Ich möchte das gleich zu Anfang festhalten: wir machen hier keine Hausaufgaben. :| Aber wir helfen dir sicher gerne dabei, das gemeinsam hinzukriegen. Wenn du mitmachst und Einsatz zeigst, werden wir das auch schaffen. :zustimm:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
ich habe mir auch schon einen Handlungsplan überlegt und bin schon so weit gekommen, dass ich weiß, dass ich nen timer brauchen und nen stringgrid.
Klar, den Timer bauchst du später, um "Bewegung" in das Ganze zu kriegen, aber ich würde dir als Anfänger erstmal nicht zu einem StringGrid für die Ausgabe raten. :? Das ist etwas friemelig mit dieser Komponente...

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Wie funktionieren die Befehle, die die Zellen die ich makiere (wie gehts das eigentlich) einlesen?
Wie schon gesagt, ich würde das nicht mit einem StringGrid machen. :nixweiss: Statt dessen würde ich dir gerne einen anderen Ansatz für die GUI zeigen wollen: :idea:
  • Leg mal ein neues Projekt an
  • Dann wählst du von der Registerkarte "Zusätzlich" ein TShape, klickst es auf das Formular (heißt dann automatisch Shape1) und ziehst die Größe auf 25x25 Pixel (die Größe ist erstmal nicht so wichtig, aber sonst wird das Formular bei mehr Zellen später so riesig)
  • Wenn das Shape-Rechteck auf dem Formular markiert ist kopierst du es dir mit Strg+C, dann fügst du eine Kopie davon mit Strg+V ein, die legst du rechts neben das erste Shape
  • Das Ganze jetzt noch 14x wiederholen, so dass du ein 4x4-Felder-Raster hast:
    RasterForm
  • Bei selektierter Form markierst du nun mit Strg+A alle Shapes, dann gehst du in den Objektinspektor auf die Seite "Ereignisse" und machst einen Doppelklick auf das Ereignis "OnMouseDown", es wird ein Ereignishandler angelegt. Da schreibst du folgenden Code rein:
    ausblenden Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
      var
        ThisShape: TShape;
    begin
      ThisShape := (Sender as TShape);
      if (ThisShape.Brush.Color = clWhite) then
        ThisShape.Brush.Color := clBlack
      else
        ThisShape.Brush.Color := clWhite;
    end;
Starte das Projekt, dann kannst du mit der Maus die Farbe der Zellen durch Anklicken "umdrehen". :think:

Wenn du das soweit als Ausgangspunkt hast, können wir weiter machen. ;)

cu
Narses
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Nini
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 10.03.15 17:28 
Danke sehr :)
aber mal eine dumme frage: was bedeutet GUI?

Als nächstes muss ich doch jetzt ja einlesen, welche felder gefärbt sind und welche nicht. dafür benötige ich ja eine neue prozedur, kommt die in einen "start"-button? und wie les ich das dann ein?
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 10.03.15 17:35 
GUI
Du kannst auch wie von Dir selbst eingangs erwähnt mit einem Array of Boolean arbeiten und die Shapes lediglich zur Ausgabe des aktuellen Zustands verwenden.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 10.03.15 19:30 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
aber mal eine dumme frage: was bedeutet GUI?
Das hat dir user profile iconWasWeißDennIch ja schon erläutert. :beer:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Als nächstes muss ich doch jetzt ja einlesen, welche felder gefärbt sind und welche nicht. dafür benötige ich ja eine neue prozedur, kommt die in einen "start"-button? und wie les ich das dann ein?
Leider hab ich jetzt grade keine Zeit, hier weiter zu machen (ich hab noch einen Termin). :? Ich schreibe dir später noch was dazu. :zustimm:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: Di 10.03.15 23:49 
Die Idee mit dem StringGrid ist gar nicht mal so schlecht.
  • Du füllst alle Zellen mit '0' (kein Feld markiert).
  • Dann schreibst Du in DrawCell des StringGrids eine neue Zeichenroutine (wenn '0', dann weiß, wenn '1', dann schwarz).
  • Zum Schluss schreibst Du in MouseDown des StringGrids: Wenn angeklickte Zelle='0', dann Zelle:='1', sonst Zelle:='0'.

So, das wars schon. Und in Quelltext sind das unter 15 Zeilen.
Ich hoffe, es hilft etwas.

ub60
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.03.15 00:57 
Moin!

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Ich schreibe dir später noch was dazu.
Soo, jetzt ist später. :D

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Die Idee mit dem StringGrid ist gar nicht mal so schlecht.
Tja, das ist zugegeben Ansichtssache. :nixweiss: Womit ich sagen möchte, dass das, was ub60 da vorschlägt, durchaus OK ist (es wird zu einer Lösung führen). Ich würde es nur so nicht angehen wollen, da ich ein StringGrid für wenig didaktisch "hilfreich" halte. Aber das ist eben: Ansichtssache. :P

Leider haben wir nun ein Problem:
user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Als nächstes muss ich doch jetzt ja einlesen, welche felder gefärbt sind und welche nicht. dafür benötige ich ja eine neue prozedur, kommt die in einen "start"-button? und wie les ich das dann ein?
Da es jetzt zwei Vorschläge gibt, wie es weiter gehen soll, musst du dich nun entscheiden, welchen "Weg" du gehen möchtest:
  • willst du mit dem StringGrid (wie du es selbst und ub60 vorgeschlagen haben) weiter machen
    oder
  • den Ansatz mit den Shapes von mir verfolgen?
:nixweiss: Ich gehe davon aus, dass beide Wege an dein Ziel führen werden, eine funktionierende Implementation von Game of Life zu erstellen. Allerdings bin ich jetzt verständlicherweise nur für meinen Vorschlag "zuständig". ;) Wenn du also mit dem StringGrid weiter machen möchtest (wie du es auch angesprochen hast), dann kann dir ub60 sicher damit weiterhelfen. :beer:

Wenn du mit meinem Ansatz weiter machen möchtest, dann antworte bitte entsprechend, damit wir dort weiter machen können. :) Falls dem so ist, sag doch auch nochmal bitte was zu deinem Kenntnisstand: kannst du mit arrays etwas anfangen? Mehrdimensionale Arrays? records? Funktionen und Prozeduren? Klassen? :les: :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mi 11.03.15 16:22 
Ich würde mich für den Weg mit den Shapes entscheiden, weil ich stringgrids auch im unterricht überhaupt nicht behersche.

mehrdimensionale arrays, records, funktionen und klassen sagen mir nichts. mit prozeduren arbeiten wir im unterricht immer aber ich nutze sie mehr als sie zu verstehen und arrays weiß ich nur, dass es da indixe gibt und dass die was mit vielen rechnungen wie sieb des erastotheles vereinfachen aber wie die genau zu benutzen sind weiß ich leider nicht, info ist leider nicht so mein bestes fach :/
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Mi 11.03.15 16:37 
Ganz ohne Grundlagen wird es aber wohl nichts werden. In Ergänzung zum Lehrstoff in der Schule kann ich empfehlen:
Delphi-Basics (Englisch)
Grundlagen-Tutorials vom Delphi-Treff
Das E-Book vom Delphi-Treff (kostenlos)

Es gibt noch einige weitere, aber das würde hier den Rahmen sprengen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.03.15 17:53 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde mich für den Weg mit den Shapes entscheiden
OK, dann machen wir da weiter. ;)

Ich hätte dann noch zwei Fragen:

a) Möchtest du ein statisches Feld (durch virtuelle "tote" Felder begrenzt) oder ein "unendliches" (=Torus) Feld umsetzen? Hier steht mehr dazu :les: (wobei ich stark hoffe, dass du das meiste davon schon gelesen hast :?).

b)
user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
mehrdimensionale arrays, records, funktionen und klassen sagen mir nichts.
Verstehst du, was das hier für einen Zweck hat? Wenn ja, kannst du kurz beschreiben, welchen?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
const
  N = 4;

type
  TFeld = array[0..N-10..N-1of Boolean;

var
  Feld: TFeld;
Wenn du das nicht verstehst, ist das auch OK. Es hat nur dann Sinn, wenn ich auf deinem Verständnislevel schreibe, weil es sonst an dir "vorbei" geht... :zwinker: Es geht also nur darum herauszufinden, wie du mir am besten folgen kannst. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mi 11.03.15 18:08 
also ich dachte eher an ein torusförmiges spielfeld außer das ist viel schwieriger als das andere?
das meiste hatte ich wirklich schon gelesen oder zumindest schonmal überflogen ;)

also ich verstehe das feld so, dass es bestimmt für x und y werte stehen und da jeweils von null bis n-1 als index gibt und die werte für das feld können jeweils nur wahr oder falsch sein wegen boolean
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.03.15 22:36 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also ich dachte eher an ein torusförmiges spielfeld außer das ist viel schwieriger als das andere?
Nein, das ist überhaupt gar kein Problem und auch kein anderer "Schwierigkeitsgrad". ;)

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
das meiste hatte ich wirklich schon gelesen oder zumindest schonmal überflogen ;)
:zustimm:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also ich verstehe das feld so, dass es bestimmt für x und y werte stehen und da jeweils von null bis n-1 als index gibt und die werte für das feld können jeweils nur wahr oder falsch sein wegen boolean
:zustimm:

Dann übernehmen wir mal diesen Teil in das Projekt und ich zeige dir, wie man die Farbe der Shapes in so ein Feld überträgt. Deine Aufgabe ist dann anschließend den Code zu schreiben, um die Werte aus dem internen Feld wieder in die Farbe eines Shapes zu übertragen.

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:
43:
44:
45:
46:
47:
48:
49:
50:
51:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

const
  N = 4// Seitenlänge des Feldes

type
  TFeld = array[0..N-10..N-1of Boolean; // Aufbau des Feldes festlegen (2-dimensionales array)

  TForm1 = class(TForm)
    Shape1: TShape;
    ...
    Shape16: TShape;
    btnLesen: TButton;
    btnSchreiben: TButton;
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure btnLesenClick(Sender: TObject);
    procedure btnSchreibenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    Feld: TFeld; // das ist der interne Speicher für die Zellen (=Shapes in der GUI)
    // mit den Werten in diesem Array arbeiten wir später, die Shapes in der GUI
    // sind nur zum Anzeigen der unsichtbaren Werte in diesem Feld da
  end;

...

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
...
end;

procedure TForm1.btnLesenClick(Sender: TObject);
  var
    x, y, snr: Integer;
    Shape: TShape;
begin
  for y := 0 to N-1 do // von unten nach oben
    for x := 0 to N-1 do begin // von rechts nach links
      snr := x +y *N +1// Nr. des Shapes berechnen
      Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
      Feld[x, y] := (Shape.Brush.Color = clBlack); // Wert ermitteln
    end;
end;


procedure TForm1.btnSchreibenClick(Sender: TObject);
begin
  // hier muss dein Code zum Übertragen der Werte aus dem Feld in die Shapes hin
end;

Alles, was in dem Projekt neu ist, habe ich markiert. Das solltest du nun in dein Projekt übertragen. Hier noch ein paar Erläuterungen:
  • Ich habe zwei Buttons auf das Formular gelegt und "btnLesen" bzw. "btnSchreiben" genannt. Die sind später für das endgültige Projekt nicht nötig, sondern nur ein Zwischenschritt, damit du die neuen Teile auch mal ausprobieren kannst.
  • Du kannst fast alles markierte oben per Copy+Paste übertragen, aber die Funktionsrümpfe für die beiden neuen Buttons musst du natürlich durch einen Doppelklick auf dem Button im Formular von Delphi erstellen lassen, sonst fehlt dir die Zuordnung der Methode zum Button, was dazu führt, dass der Button nix tut, wenn man das Programm laufen lässt und draufklickt :idea:
  • Der einzige echte "Trick" ist die Funktion FindComponent() oben, damit kann man auf eine Komponente über ihren Namen(!) zugreifen. Das tun wir hier nämlich: wir berechnen die Nummer, die hinten an dem Shape steht in der Variable snr und dann holen wir uns eine Referenz auf dieses Shape. Und zum Schluss schauen wir, ob die Farbe Schwarz ist, was wir uns als "True"-Wert im Feld merken.
Probier mal, ob du den Code vervollständigt kriegst. Wenn du noch Fragen hast, immmer her damit. Ansonsten frisch ans Werk :D und melde dich bitte mit dem Code von deinem Projekt in einem neuen Beitrag.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Do 12.03.15 21:18 
Ich versteh leider nicht, was da beim Werte ermitteln passiert :/ für mich liest sich das so, als ob ich da einfach alles schwarz machen würde

ausblenden Delphi-Quelltext
1:
 Feld[x, y] := (Shape.Brush.Color = clBlack); // Wert ermitteln					

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 12.03.15 21:20 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Ich versteh leider nicht, was da beim Werte ermitteln passiert :/ für mich liest sich das so, als ob ich da einfach alles schwarz machen würde
OK, schreiben wir das mal anders (länger, ich hab´s zusammengefasst :?):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if (Shape.Brush.Color = clBlack) then
  Feld[x, y] := True
else
  Feld[x, y] := False;

Verständlicher? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Nini
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Do 12.03.15 21:35 
ja, danke, gleich viel verständlicher :)

und in die zweite prozedur mach ich ja jetzt wieder so zwei for-schleifen in einander, aber was will ich eigentlich genau in dem shape anzeigen lassen? weil die sind ja schon weiß oder schwarz, soll ich da jetzt was reinschreiben ?
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 12.03.15 21:52 
Ja, du hast dann zwei Methoden eine liest die Farben aus den Shapes und schreibt sie als Boolean-Werte ins Array und die zweite liest die Werte aus dem Array und setzt die Farbe in den Shapes.

Im Moment klingt das ziemlich unsinnig, die Werte einfach hin und her zu schreiben, aber Narses wird dir auch noch eine dritte Prozedur an die Hand geben, in der sich die Werte im Array dann - gemäß den Spielregeln - ändern.

Für diesen Beitrag haben gedankt: Narses
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Do 12.03.15 22:20 
so, das ist was ich machen würde, aber irgendwas stimmt daran noch überhaupt nicht.

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:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

const
  N = 4;
type
  TFeld = array[0..N-10..N-1of Boolean;

  { TForm1 }

  TForm1 = class(TForm)
    btnSchreiben: TButton;
    btnLesen: TButton;
    Shape1: TShape;
    Shape10: TShape;
    Shape11: TShape;
    Shape12: TShape;
    Shape13: TShape;
    Shape14: TShape;
    Shape15: TShape;
    Shape16: TShape;
    Shape2: TShape;
    Shape3: TShape;
    Shape4: TShape;
    Shape5: TShape;
    Shape6: TShape;
    Shape7: TShape;
    Shape8: TShape;
    Shape9: TShape;
    procedure btnLesenClick(Sender: TObject);
    procedure btnSchreibenClick(Sender: TObject);
    procedure Shape1ChangeBounds(Sender: TObject);
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
    { public declarations }
    Feld: TFeld;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Shape1ChangeBounds(Sender: TObject);
begin

end;

procedure TForm1.btnSchreibenClick(Sender: TObject);
var  x, y, snr: Integer;
    Shape: TShape;
begin
   for y := 0 to N-1 do
       for x := 0 to N-1 do begin
           if (feld[x,y] = true) then begin
             snr := x +y *N +1// Nr. des Shapes berechnen
             Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
             shape.brush.color := clblack
           end;
           else shape.brush.color := clwhite;

       end;

end;

procedure TForm1.btnLesenClick(Sender: TObject);
var
    x, y, snr: Integer;
    Shape: TShape;
begin
    for y := 0 to N-1 do // von unten nach oben
        for x := 0 to N-1 do begin // von rechts nach links
            snr := x +y *N +1// Nr. des Shapes berechnen
            Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
            if (Shape.Brush.Color = clBlack) then
               Feld[x, y] := True
            else
               Feld[x, y] := False; // Wert ermitteln
        end;
end;

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Thisshape : TShape;
begin
  ThisShape := (Sender as TShape);
  if (ThisShape.Brush.Color = clWhite) then
    ThisShape.Brush.Color := clBlack
  else
    ThisShape.Brush.Color := clWhite;
end;

end.


Moderiert von user profile iconMartok: Quote- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 12.03.15 22:36 
Moin!

Ja, schon gar nicht schlecht. :zustimm: Betrachten wir mal nur den hier relevanten Teil:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btnSchreibenClick(Sender: TObject);
var  x, y, snr: Integer;
    Shape: TShape;
begin
   for y := 0 to N-1 do
       for x := 0 to N-1 do begin
           if (feld[x,y] = truethen begin
             snr := x +y *N +1// Nr. des Shapes berechnen
             Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
             shape.brush.color := clblack
           end;
           else shape.brush.color := clwhite;

       end;
end;

Es ist leider zwar logisch korrekt auf = True zu vergleichen, aufgrund von technischen Details, die ich dir jetzt mal erspare, kann das zu Ergebnissen führen, die du so nicht erwarten und deshalb als "falsch" interpretieren würdest. Also: niemals auf = True testen, sondern einfach nur schreiben:
ausblenden Delphi-Quelltext
1:
if (feld[x,y]) then begin // das ist funktional identisch zu "= True"					


Nächstes Problem: du ermittelst nur im Fall einer schwarzen Zelle die Referenz auf das Shape neu (der entsprechende Code steht in dem Teil der Fallunterscheidung, die sich mit schwarzen Zellen beschäftigt). Wenn du also auf eine weiße Zelle triffst, dann färbst du das "falsche" Shape ein (weil du die Referenz nicht neu berechnest)... :hair: Lösungsidee: der Code, der die Referenz auf das Shape bestimmt, muss in jedem Fall (für schwarze und weiße Zellen) ausgeführt werden. :idea:

Kannst du das noch ändern? :zustimm:

Und als Funktions-Test: klicke mal irgendwelche Zellen schwarz, dann einmal auf den "Lesen"-Button (das ist dann so wie "speichern"), dann machst du irgendwelche anderen Zellen schwarz und klickst auf den "Schreiben"-Button (wirkt dann so wie "laden"). Jetzt sollten wieder die Zellen schwarz sein, die du beim Klick auf den "Lesen"-Button gefärbt hattest. :idea: Wenn das so abläuft, ist alles korrekt. :)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Nini
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Do 12.03.15 23:24 
yeah, so klappt es :) danke sehr
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.btnSchreibenClick(Sender: TObject);
var  x, y, snr: Integer;
    Shape: TShape;
begin
   for y := 0 to N-1 do
       for x := 0 to N-1 do begin
           if (feld[x,y]) then begin
             snr := x +y *N +1// Nr. des Shapes berechnen
             Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
             shape.brush.color := clblack
           end
           else begin
             snr := x +y *N +1// Nr. des Shapes berechnen
             Shape := TShape(FindComponent('Shape' +IntToStr(snr))); // Komponente suchen
             shape.brush.color := clwhite;
           end;

       end;

end;


Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 12.03.15 23:27 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
yeah, so klappt es :) danke sehr
Super! :zustimm:

Aber :gruebel: schau doch nochmal genau hin, du hast da zwei komplett identische Zeilen stehen, muss das wirklich so sein? :lupe: Geht das nicht etwas ... kürzer? :zwinker:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.