Autor Beitrag
Xardas008
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Sa 26.05.07 12:32 
Ich habe folgendes Problem: Ich arbeite an 4 Gewinnt, und die Shapes auf dem Spielfeld selbst, die die heruntergefallenen Steine anzeigen sollen, müssen in einem Array vom Typ TShape gespeichert werden, um später einfacher auf die einzelnen Shapes (Insgesammt 6*7 stk) zugreifen zu können.
Beim FormCreate sollen dann alle Shapes erstellt werden mit der Eigenschaft Visible := false. Wie kann ich dies bewerkstelligen? Ich würde das ganze dann, um etwas Code zu sparen, in einer Eigenen Prozedur machen, da diese auch beim Klick auf Neues Spiel wieder aufgerufen werden muss. Die Schleife for zum durchlaufen des Arrays kann nicht gewählt werden, da das Spielfeld aus GroupBox Elementen besteht (Ausser man erstellt auch diese zur Laufzeit in einem Array, dann ginge das mit der Schleife)

Aber wie kann man das überhaupt machen?
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Sa 26.05.07 13:00 
So in etwa.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  i: Integer;
  a: array[1..42of TShape;
begin
  for i := 1 to 42 do
  begin
    a[i] := TShape.Create(Self); 
    a[i].Parent := Self;  // <- Vielleicht braucht mans, vielleicht nicht...
    a[i].Left := i * 4;
    a[i].Top := i * 3;
    a[i].Width := i;
    a[i].Height := i;
  end;
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 26.05.07 15:15 
Moin!

user profile iconChryzler hat folgendes geschrieben:
So in etwa.

Ich würde es so vorschlagen: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.FormCreate(Sender: TObject);
  var
    i: Integer;
    a: array[0..41of TShape;
begin
  for i := 0 to 41 do begin
    a[i] := TShape.Create(Self);
    a[i].Parent := Self; // braucht man ganz sicher, sonst sieht man sie nicht! ;)
    a[i].Left := (i mod 7) *16;
    a[i].Top := (i div 7) *16;
    a[i].Width := 16;
    a[i].Height := 16;
  end;
end;



user profile iconXardas008 hat folgendes geschrieben:
Beim FormCreate sollen dann alle Shapes erstellt werden
[...]
Ich würde das ganze dann, um etwas Code zu sparen, in einer Eigenen Prozedur machen, da diese auch beim Klick auf Neues Spiel wieder aufgerufen werden muss.

Es ist sicher nicht notwendig, die Shapes wieder zu entfernen und neu anzulegen, es reicht doch schon, wieder .Visible oder was auch immer umzustellen! :idea: Fazit: Objekte erzeugen (.Create()) nur einmal beim Programmstart, dadurch (s.o.) werden sie beim Freigeben des Formulars auch direkt mit freigegeben. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Sa 26.05.07 16:16 
Hab das jetzt mal mit nem Button ausprobiert das Shape erstellen. Nur ein Problem habe ich noch, und zwar muss jedes Shape über eine Groupbox drüber. Wie könnte ich das etwa lösen? Es wäre durchaus möglich, die Groupboxes auch zur Laufzeit erst zu erstellen sodass ich die auch in nem Array habe.

Bis dann
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 26.05.07 16:20 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
Hab das jetzt mal mit nem Button ausprobiert das Shape erstellen.

Sinnvoll ist das allerdings IMHO nur im FormCreate. :?

user profile iconXardas008 hat folgendes geschrieben:
Nur ein Problem habe ich noch, und zwar muss jedes Shape über eine Groupbox drüber.

Mal ganz blöd: wozu?! :gruebel: Nimm als Shapeform Kreise, etwas mehr Abstand dazwischen, fertig. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Sa 26.05.07 16:34 
user profile iconNarses hat folgendes geschrieben:

Mal ganz blöd: wozu?! :gruebel: Nimm als Shapeform Kreise, etwas mehr Abstand dazwischen, fertig. ;)


Das bringt mir ja nicht viel. Ok ich könnte hingehen und statt der Groupboxen normale Shapes nehmen mit ner passenden Spielfeldfarbe, somit wäre auch das Problem gelöst mit den Groupboxen.

Im Anhang seht ihr das Spielfeld wie es aussehen soll. Die kleinen Shapes in den Groupboxes sollen zur Laufzeit erst erstellt werden, da die sich in einem Array einfacher abfragen lassen bzw dann z.B. feststellen lässt ob in der Reihe schon ein Stein runtergefallen ist.

Nur habe ich keinen Plan wie ich das lösen soll, damit die Shapes in den Groupboxes sind.
Einloggen, um Attachments anzusehen!
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Di 29.05.07 19:25 
So hab mal angefangen statt der GroupBoxes Shapes zu nehmen (vielleicht finde ich ja noch schönere Elemente mal schauen, das spielt aber grade keine Rolle)

Jetzt habe ich die Initialisierung wiefolgt begonnen (erstmal nur um zu schauen obs auch richtig funktioniert):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        left := 125;
        top := 488;
        for i := 1 to 2 do
        begin
          for j := 1 to 2 do
          begin
            Spielfeld[i,j] := TShape.Create(self);
            Spielfeld[i,j].Parent := Self;
            Spielfeld[i,j].Left := left + 72;
            left := left + 72;
            Spielfeld[i,j].Top := top - 64;
            top := top - 64;
            Spielfeld[i,j].Height := 41;
            Spielfeld[i,j].Width := 33;
            Spielfeld[i,j].Brush.Color := clWhite;
            Spielfeld[i,j].Shape := stCircle;
           // Label1.Caption := IntToStr(left);
           // Label2.Caption := IntToStr(top);
          end;

Wobei ich unten links auf dem Spielfeld beginne, die Werte habe ich ermittelt indem ich an die Stellen wo die Shapes hinsollen, welche hingesetzt habe und die Differenz so ermittelt hatte.
Aber wenn ich das ganze jetzt starte sehe ich nur 1 Shape unten links drin (wo ja auch eins hinsoll) nur ein klein wenig zu tief. Wieso? Und wo hat er den Rest.

Bitte um schnelle Hilfe so langsam gerate in in Zeitdruck *gg*
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.05.07 19:49 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        left := 125;
        top := 488;
        for i := 1 to 2 do
        begin
          for j := 1 to 2 do
          begin
            Spielfeld[i,j] := TShape.Create(self);
            Spielfeld[i,j].Parent := Self;
            Spielfeld[i,j].Left := <span class="inlineSyntax">left</span> + 72;
            <span class="inlineSyntax">left := left + <span class="codenumber">72</span></span>;
            Spielfeld[i,j].Top := top - 64;
            top := top - 64;
            Spielfeld[i,j].Height := 41;
            Spielfeld[i,j].Width := 33;
            Spielfeld[i,j].Brush.Color := clWhite;
            Spielfeld[i,j].Shape := stCircle;
           // Label1.Caption := IntToStr(left);
           // Label2.Caption := IntToStr(top);
          end;

Damit greifst du auf das Formular zu und nicht auf das Shape! :mahn: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Di 29.05.07 20:07 
Wieso eigentlich, das sind 2 lokale Integervariablen, die ich in FormCreate erst deklariert habe.

naja hab das ganze jetzt ein wenig anders gelöst, erst wird die unterste Zeile komplett gefüllt, danach die Zeilen jeweils da drüber.

Naja habs jetzt wiefolgt gelöst:
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:
        for i := 1 to 7 do
        begin
            Spielfeld[i,1] := TShape.Create(self);
            Spielfeld[i,1].Parent := Self;
            if i = 1 then
            begin
              Spielfeld[i,1].Left := 197;
            end
            else
            begin
              Spielfeld[i,1].Left := Spielfeld[i-1,1].Left + 72;
            end;
        //    left := left + 72;
            Spielfeld[i,1].Top := 424;
       //     top := top - 64;
            Spielfeld[i,1].Height := 33;
            Spielfeld[i,1].Width := 33;
            Spielfeld[i,1].Brush.Color := clWhite;
            Spielfeld[i,1].Shape := stCircle;
            Spielfeld[i,1].Visible := true;
     //     Spielfeld[i,1]
        end;
        for i := 1 to 7 do
        begin
          for j := 2 to 6 do
            begin
              Spielfeld[i,j] := TShape.Create(self);
              Spielfeld[i,j].Parent := Self;
              Spielfeld[i,j].Left := Spielfeld[i,j-1].Left;
           // left := left + 72;
              Spielfeld[i,j].Top := Spielfeld[i,j-1].Top - 64;
          //    top := top - 64;
              Spielfeld[i,j].Height := 33;
              Spielfeld[i,j].Width := 33;
              Spielfeld[i,j].Brush.Color := clWhite;
              Spielfeld[i,j].Shape := stCircle;
              Spielfeld[i,j].Visible := true;
        //    Label1.Caption := IntToStr(left);
        //    Label2.Caption := IntToStr(top);
            end;
        end;


Und siehe da, es funktioniert. Dann bin ich dem Ziel doch schon einen entscheidenden Schritt näher gekommen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 29.05.07 20:17 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
Wieso eigentlich, das sind 2 lokale Integervariablen,

Der Gültigkeitsbereich der Formularklasse ist aber bindender innerhalb einer Methode derselben, als globale Variablen (die sowie zu vermeiden sind!). :idea:

user profile iconXardas008 hat folgendes geschrieben:
die ich in FormCreate erst deklariert habe.

Das glaube ich kaum, du meinst sicherlich initialisiert. ;)

Wenn ich mal mein ästhetisches Empfinden äussern darf: Ich finde das mit den doppelten Kreisen nicht so schön. Besser wäre es, den weißen Kreis einfach in der passenden Farbe zu füllen; das kommt auch der Realität näher, da man ja auch nur durch eine Art Fensterchen auf die Chips in der Matrix schaut. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Xardas008 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149

Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
BeitragVerfasst: Di 29.05.07 21:24 
Ich finds halt besser, wenn man die Steinchen als extra Stein sieht später. Gut wenn wir ganz realistisch bleiben würden, wäre dies nicht möglich da die ja bis ganz runter fallen, aber das war vom Lehrer auch nicht gefordert. Naja ich habs jetzt soweit dass jeder Stein gesetzt werden kann (und zwar abwechselnd, wobei ich noch eine Prüfung einbauen muss, dass nur die Steinchen bewegt werden können von dem Spieler, der auch grade am Zuge ist, wobei ich noch nicht genau weiß wie). Naja fehlt aber nur noch die Gewinnabfrage dann ist das Spiel ansonsten fertig, bis auf so Kleinigkeiten wie Speichern/Laden *gg*.

Und dann soll ich zu dem ganzen auch noch eine Dokumentation schreiben, ka was da rein soll aber was solls *gg*.