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: Do 14.06.07 15:05 
Hi,

also habe meine Shapes alle zur Laufzeit erstellt, da bestimmte Werte in einer Datei gespeichert werden müssen.

Es handelt sich um das Spiel 4 Gewinnt und beim Spielfeld will ich die Farben der einzelnen Spielsteine einem Record übergeben, welches einen Datentyp vom Typ TShape besitzt.
Dieser Record ist dazu da, alle Werte die gespeichert werden müssen in eine Variable zu packen und mit einem Rutsch in ne Datei wegzuschreiben.

haben jetzt mit folgendem Befehl versucht die Farbe zu übertragen:
ausblenden Delphi-Quelltext
1:
2:
 
saved[i,j].Spielefeld.Brush.Color := Spielfeld[i,j].Brush.Color;


Kompilieren ist einwandfrei möglich, aber wenn der zur Laufzeit an diese Stelle kommt, dann knallts und ich bekomme eine Exception EAccessViolation.

Wieso dass? Bzw wie müsste der Befehl aussehen um dies zu vermeiden, alle anderen Werte speichert der Anstandslos in der Variablen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.06.07 15:14 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
 
saved[i,j].Spielefeld.Brush.Color := Spielfeld[i,j].Brush.Color;

[...]
wie müsste der Befehl aussehen um dies zu vermeiden

Das können wir ohne die Deklaration der von dir genannten Variablen/Felder nicht sagen... :roll: ;)

Es könnte sein, dass die Objekte nicht zugewiesen sind; schonmal auf =NIL bzw. Assigned() geprüft, bevor zu zugreifst? :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: Do 14.06.07 15:19 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
              Spielfeld[i,j] := TShape.Create(self);
              Spielfeld[i,j].Parent := Self;
              Spielfeld[i,j].Left := Spielfeld[i,j-1].Left;
              Spielfeld[i,j].Top := Spielfeld[i,j-1].Top - 64;
              Spielfeld[i,j].Height := 33;
              Spielfeld[i,j].Width := 33;
              Spielfeld[i,j].Brush.Color := clWhite;
              Spielfeld[i,j].Shape := stCircle;


Damit werden die in ner Schleife erstellt.

Hoffe das hilft euch weiter.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.06.07 15:22 
Moin!

Und was ist mit saved[]? :nixweiss: ;)

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: Do 14.06.07 15:23 
Hm stimmt, die sollten ja zumindest einmal als Objekte erstellt werden. Danke dir du hast mich auf den richtigen Weg geführt.
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: Do 14.06.07 15:34 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
       saved[i,j].Spielefeld := TShape.Create(self);
        saved[i,j].Spielefeld.Parent := Self;
        saved[i,j].Spielefeld.Visible := Spielfeld[i,j].Visible;
        saved[i,j].Spielefeld.Brush.Color := Spielfeld[i,j].Brush.Color;


So habe ich das jetzt gelöst. Ob er das an dieser Stelle richtig macht, weiß ich nicht.

Bei den Spielsteinen habe ich das so gelöst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
       saved[i,j].Spielsteine := TShape.Create(self);
     //  saved[i,j].Spielsteine.Parent := Self;
       saved[i,j].Spielsteine.Left := Figuren_Spieler2[i,j-3].Left;
       saved[i,j].Spielsteine.Top := Figuren_Spieler2[i,j-3].Top;
       saved[i,j].Spielsteine.Visible := Figuren_Spieler2[i,j-3].Visible;
       saved[i,j].Spielsteine.OnMouseDown := Figuren_Spieler2[i,j-3].OnMouseDown;
       saved[i,j].Spielsteine.OnMouseMove := Figuren_Spieler2[i,j-3].OnMouseMove;
       saved[i,j].Spielsteine.OnMouseUp := Figuren_Spieler2[i,j-3].OnMouseUp;


Wenn ich das Parent lasse, dann erscheinen lauter weiße Rechtecke über meinen Spielsteinen, was ja nicht erwünscht ist. Aber ich denke mal, dass er das richtig macht, wird sich zeigen wenn man Speichern und Laden kann, und die Werte wieder zurückübertragen werden, ob das richtig funktioniert.

Danke dir erstmal.
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: Do 14.06.07 15:58 
Ein anderes Problem ist aufgetaucht, wenn ich das ganze jetzt Speichern will, meckert er, dass er die Funktion SaveToFile(SaveDialog.Filename) nicht kennt.

Habe die Komponente aus Delphi für das Speichern genommen, und versuche nun folgendes:

ausblenden Delphi-Quelltext
1:
2:
SaveDialog.Execute;
saved[i,j].SaveToDialog(SaveDialog.Filename);


Aber irgendwie meckert der mir das an, dabei habe ich diese Codezeile aus einem Buch entnommen.

Hat sonst wer eine Idee wie ich diesen Array mit allen Inhalten in die Datei bekomme?

der Record ist wiefolgt aufgebaut:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type Save = record
    Spielsteine:TShape;
    Spieler1:BOOLEAN;
    Spieler2:BOOLEAN;
    Spielefeld:TShape;
    Spielverlauf:Spiel;
  end;

Und die Variable saved hat Folgende deklaration:
ausblenden Delphi-Quelltext
1:
saved :array[1..7,1..6] of Save;					


Das mit dem Füllen aller Inhalte ist bereits implementiert, jetzt muss ich nur noch hingehen und dieses Array in die Datei schreiben.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.06.07 16:25 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
Das mit dem Füllen aller Inhalte ist bereits implementiert, jetzt muss ich nur noch hingehen und dieses Array in die Datei schreiben.

Das geht sowieso nicht (zumindest nicht in eine typisierte Datei - aber ich unterstelle mal, dass du das vor hast). :mahn: Weil:
user profile iconXardas008 hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type Save = record
    Spielsteine:TShape;
    Spieler1:BOOLEAN;
    Spieler2:BOOLEAN;
    Spielefeld:TShape;
    Spielverlauf:Spiel;
  end;

Und die Variable saved hat Folgende deklaration:
ausblenden Delphi-Quelltext
1:
saved :array[1..7,1..6] of Save;					

das sind keine einfachen Datentypen, sondern Objektinstanzen, und die liegen nicht im record, sondern auf dem Heap! :shock:

Ich fürchte, du hast da einen ganz dicken Konzept-Bock geschossen... :? Vielleicht solltest du dein Speicherkonzept nochmal auf die Werkbank packen. :| (ehrlich gesagt, erscheint mir dein Code/Ansatz - von dem, was ich davon bisher gesehen habe - sowieso viel zu kompliziert; das geht sicher auch einfacher :nixweiss:)

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: Do 14.06.07 17:10 
Dann zeig mir ma nen weg, wies einfacher geht. Muss das fix fertig bekommen, nächste Woche Donnerstag ist Abgabe und ich muss dazu noch ne Doku verfassen.

Er muss nur die Werte in ner Datei speichern und später wieder laden. Der rest funktioniert.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 14.06.07 18:13 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
Dann zeig mir ma nen weg, wies einfacher geht.

Also, überlegen wir mal, was wirklich gespeichert werden muss: ;)

Du hast ein Feld 6x7, dessen Positionen entweder frei oder von einem Spieler besetzt sind. Für den Feldzustand könnte man eine Zahl als Code verwenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TFeld = (
    Frei,
    Spieler1,
    Spieler2
    );

Damit ergibt sich also tatsächlich notwendiger Speicheraufwand:
ausblenden Delphi-Quelltext
1:
2:
var
  Spiel: array[0..5,0..6] of TFeld;

Du könntest das Ding nun recht simpel in eine INI-Datei packen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
uses
  ..., IniFiles;

  var
    IniFile: TIniFile;
    i,j: Integer;
begin
  IniFile := TIniFile.Create(...);
  for i := 0 to 5
    for j := 0 to 6 do
      IniFile.WriteInteger('Abschnitt','Position'+IntToStr(i)+'.'+IntToStr(j),Integer(Spiel[i,j]));

Beim Laden umgekehrt machen; alle weiteren Informationen lassen sich aus diesen Basisinfos ableiten :arrow: müssen also auch nicht gespeichert werden! :idea:

Mal so als Ansatz... :D

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: Fr 15.06.07 15:16 
user profile iconNarses hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TFeld = (
    Frei,
    Spieler1,
    Spieler2
    );



Eine ähnliche Datenstruktur habe ich bereits, die ich bei der Gewinnabfrage benutze (gut wäre auch einfacher gegangen indem ich einfach nur die Fragen abgefragt hätte, aber so hats gleich einen weiteren Nutzen fürs Speichern).

Damit lässt sich ja das Spielfeld auch ableiten, nur lassen die Spielsteine selbst sich damit nicht ableiten, weil dadurch ja nicht gewährleistet ist welche Steine der Spieler genommen hat, gut man könnte die Anzahl der gelegten Steine ermitteln und daran dann einfach von oben links nach unten Rechts die Steine dann verstecken, aber das is ja net der Sinn, was wenn der Spieler mittendrin einen herholt.

Wie kann ich die dem ganzen mitgeben?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 15.06.07 17:00 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
nur lassen die Spielsteine selbst sich damit nicht ableiten, weil dadurch ja nicht gewährleistet ist welche Steine der Spieler genommen hat, gut man könnte die Anzahl der gelegten Steine ermitteln und daran dann einfach von oben links nach unten Rechts die Steine dann verstecken,

Ähm, wie meinen... ? :gruebel: Ich habe kein Wort verstanden... :?

Ich bin nachwievor davon überzeugt, dass diese Datenstrukturen ausreichen, um das Spiel abzubilden und Spielstände zu speichern/laden.

user profile iconXardas008 hat folgendes geschrieben:
aber das is ja net der Sinn, was wenn der Spieler mittendrin einen herholt.

Was mittendrin herholen? Meinst du, einer "hackt" (naja, editieren halt... ;)) das Speicherformat, oder was?

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: Fr 15.06.07 17:17 
Ich habe links vom Spielfeld 21 Spielsteine, und rechts nochmals. Diese lassen sich per Drago & Drop bewegen, und wenn der Stein runterfällt, dann verschwindet der Stein. Nun kann der Spieler aber selbst entscheiden welchen Stein er nimmt, und hat keine feste Vorgabe, ausser dass es einer seiner Steine sein muss (was auch sonst net anders geht.

Und dies muss gespeichert werden, welcher von den steinen sichtbar ist und welcher nicht, dass kannst du nicht aus ner inidatei mit den werten ableiten die du mir da lieferst.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 15.06.07 17:48 
Moin!

user profile iconXardas008 hat folgendes geschrieben:
Und dies muss gespeichert werden, welcher von den steinen sichtbar ist und welcher nicht, dass kannst du nicht aus ner inidatei mit den werten ableiten die du mir da lieferst.

:| Hm, dein (Umgangs-)Ton gefällt mir nicht... :? Geht´s auch etwas freundlicher? ;)

user profile iconXardas008 hat folgendes geschrieben:
Ich habe links vom Spielfeld 21 Spielsteine, und rechts nochmals.

ausblenden Delphi-Quelltext
1:
2:
3:
  for i := 0 to 20 do begin
    IniFile.WriteBoolean('Spieler1','Vorrat'+IntToStr(i),Vorrat1[i]);
    IniFile.WriteBoolean('Spieler2','Vorrat'+IntToStr(i),Vorrat2[i]);

:roll:

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 16.06.07 09:16 
Du schreibst oben bei dem Create der IniFile als Parameter drei ., was für Parameter erwartet er? In meiner Delphi-Hilfe steht leider nichts zur Inifile.

Generell fänd ich ne Delphi-Hilfe nicht schlecht, wo alle Klassen wie IniFile mit ihren Methoden drinstünde damit man sieht welche Parameter man benötigt, oftmals findet er zu meinen Sachen nie etwas.
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 16.06.07 09:28 
So das Speichern funktioniert. Danke dir. Und sry wenn mein Ton ein wenig daneben war.

Spieler1 und Spieler2, also die Booleans brauch man nur die erste Position im String speichern, da das bei mir ein normaler Boolean ist.

Ich schau dann nachher noch welche Werte ich noch benötige und dann mach ich dementsprechend das Laden.

Aber auf ne Inifile wäre ich nie gekommen.
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 16.06.07 10:35 
Also ein Problem habe ich noch. Das speichern funktioniert, er speichert die Daten in die Inidatei, ein paar Fehlerüberprüfungen werde ich noch angeben, z.B. dass die Dateiendung automatisch angehängt wird wenn der Spieler diesen vergessen hat.

Aber beim Laden habe ich noch Probleme, und zwar versuche ich erstmal nur den Spielernamen von Spieler1 zu lesen mit ReadString, nur irgendwie übergibt der mit
ausblenden Delphi-Quelltext
1:
Lbl_Spieler1.Caption := IniFile.ReadString('Name_Spieler1','Name','');					

immer nur den Defaulwert am Ende.

Muss ich für das Lesen etwas besonderes beachten, zum Beispiel schon beim erstellen des Objekts?

Habe das genau so gemacht wie beim Speichern mit dem Create.


EDIT: Hat sich erledigt, habe ihm ne falsche Section gegeben, da hat nur die Zahl 1 am Ende gefehlt. Jetzt gehts aber.