| Autor |
Beitrag |
Xardas008
      
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)
|
Verfasst: 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:
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 14.06.07 15:14
Moin!
Xardas008 hat folgendes geschrieben: | 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...
Es könnte sein, dass die Objekte nicht zugewiesen sind; schonmal auf =NIL bzw. Assigned() geprüft, bevor zu zugreifst?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xardas008 
      
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)
|
Verfasst: Do 14.06.07 15:19
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 14.06.07 15:22
Moin!
Und was ist mit saved[]?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xardas008 
      
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)
|
Verfasst: 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 
      
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)
|
Verfasst: Do 14.06.07 15:34
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| saved[i,j].Spielsteine := TShape.Create(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 
      
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)
|
Verfasst: 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:
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:
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:
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 14.06.07 16:25
Moin!
Xardas008 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).  Weil:
Xardas008 hat folgendes geschrieben: | 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:
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!
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  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xardas008 
      
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)
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 14.06.07 18:13
Moin!
Xardas008 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type TFeld = ( Frei, Spieler1, Spieler2 ); |
Damit ergibt sich also tatsächlich notwendiger Speicheraufwand:
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:
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  müssen also auch nicht gespeichert werden!
Mal so als Ansatz...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xardas008 
      
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)
|
Verfasst: Fr 15.06.07 15:16
Narses hat folgendes geschrieben: |
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 15.06.07 17:00
Moin!
Xardas008 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... ?  Ich habe kein Wort verstanden...
Ich bin nachwievor davon überzeugt, dass diese Datenstrukturen ausreichen, um das Spiel abzubilden und Spielstände zu speichern/laden.
Xardas008 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 
      
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)
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 15.06.07 17:48
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Xardas008 
      
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)
|
Verfasst: 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 
      
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)
|
Verfasst: 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 
      
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)
|
Verfasst: 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
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.
|
|
|