Autor |
Beitrag |
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 10:36
Moin!
Vorschlag hat folgendes geschrieben : | Narses hat folgendes geschrieben : | [*]Wenn ein Spiel zuende ist, kann ich nochmal einen Highscore eintragen, zwar "nicht fertig", aber mit den restlichen Daten. | Wie kann ich dies unterbinden? |
Das ist ein Konzept-Fehler, erzeuge Highscores automatisch beim Gewinnen (also direkt nach dem Dialog, dass man "gewonnen" hat).  Habe ich aber jetzt schon ca. 3x geschrieben...
Ansatz für das Namens-Problem: mach das Edit-Feld für den Spielernamen auf das Hauptformular. Beim Anlegen eines Highscores prüfst du, ob das Feld leer ist. Ist das so, machst du ein InputQuery() auf, in dem du den Namen abfragst. Dann schreibst du den Namen in das Editfeld und legst den Highscore an. Bricht der Benutzer die Zwangseingabe des Namens ab, brichst du auch die Anlage des Highscores ab - kein Name, kein Score.
Vorschlag hat folgendes geschrieben : | Was meinst du mit modal? |
Damit meine ich z.B. Form2.ShowModal; statt Form2.Show; dann blockiert Form2 die Anwendung, bis man das Fenster wieder schließt.
Vorschlag hat folgendes geschrieben : | Hattest du dies vielleicht schon in deiner Version gefixt? |
Jap. Gilt auch für die folgenden Anmerkungen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 11:43
Ich versuche damit zu schaffen:
Delphi-Quelltext
Wieso bekomme ich hier einen Fehler?
Zitat: | [DCC Fehler] Unit2.pas(130): E2015 Operator ist auf diesen Operandentyp nicht anwendbar |
?
Die If´s Anderst beschrieben und es geht...
--- Moderiert von Narses: Beiträge zusammengefasst---
Narses hat folgendes geschrieben : |
Ansatz für das Namens-Problem: mach das Edit-Feld für den Spielernamen auf das Hauptformular. Beim Anlegen eines Highscores prüfst du, ob das Feld leer ist. Ist das so, machst du ein InputQuery() auf, in dem du den Namen abfragst. Dann schreibst du den Namen in das Editfeld und legst den Highscore an. Bricht der Benutzer die Zwangseingabe des Namens ab, brichst du auch die Anlage des Highscores ab - kein Name, kein Score.
s |
Also ich habe nun eingefügt, dass vor dem Highscore erstellen und der Gewonnen Nachricht auf einen Namen geprüft wird, nur was ist mit InputQuery() gemeint? Und ich bekomme ich es hin, dass wen der Name gefehlt hat und dann eingegebn wurde, der Highscore doch noch gespeichert wird? 
Zuletzt bearbeitet von Vorschlag am Di 19.01.10 16:48, insgesamt 1-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 12:47
Moin!
Vorschlag hat folgendes geschrieben : | Also ich habe nun eingefügt, dass vor dem Highscore erstellen und der Gewonnen Nachricht auf einen Namen geprüft wird, |
Ich habe diesen Code entfernt, da er nicht mehr relevant ist (in der Highscore-Unit wird doch gar nix mehr eingetragen, das passiert jetzt alles in der MainForm).
Vorschlag hat folgendes geschrieben : | nur was ist mit InputQuery() gemeint? Und ich bekomme ich es hin, dass wen der Name gefehlt hat und dann eingegebn wurde, der Highscore doch noch gespeichert wird?  |
Das habe ich an dem Code geändert: - Das Verhalten bei fehlendem Namen entspricht jetzt meinem Vorschlag.
- Ich habe deine grauslige Codeformatierung berichtigt
(Code formatieren ist keine überflüssige Arbeit für Sauna-unten-sitzer, du siehst doch selbst kaum noch Strukturen in deinem eigenen Code!).
- Weiterhin ist das .ShowModal; statt der Ein-/Ausblenderei der Forms auch drin.
- Ich habe deinen zusätzlichen Code aus der function AllCardsOpen: Boolean; dahin verschoben, wo er hingehört.
Allerdings ist dein Highscore-Format noch wurstig. Du erstellst so einen neuen Eintrag:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| with Form2.lvHighscore.Items.Add do begin Caption := EdName.Text; SubItems.Add(Form1.LbGebrauchteZeit.Caption); SubItems.Add(IntToStr(Points)); SubItems.Add(IntToStr(Moves)); SubItems.Add(DateTimeToStr(Now)); end; | Beim Speichern wird das Ganze als Stringliste serialisiert und dann wieder so geladen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| for i := 0 to Datei.Count-1 do begin Zeile.CommaText := Datei.Strings[i]; if (Zeile.Count = 5) then with lvHighscore.Items.Add do begin Caption := Zeile.Strings[0]; Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); SubItems.Add(IntToStr(Integer(Data))); SubItems.Add(Zeile.Strings[2]); end; | Anlegen tust du 5 Elemente für einen Highscore, aber beim Laden nur 3.
cu
Narses
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 14:14
Das Problem mit dem Laden habe ich jetzt seit ner Stunde versucht hinzubekommen.
Aber auch mit deinem Tutorial und dieser Anleitung: www.delphi-treff.de/...cherung/ini-dateien/
komme ich einfach nicht drauf, wie ich die Weiteren Werte einlesen kann?
Kannst du mir einen Tipp geben?
Danke.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 14:28
Moin!
Vorschlag hat folgendes geschrieben : | Das Problem mit dem Laden habe ich jetzt seit ner Stunde versucht hinzubekommen.
Aber auch mit deinem Tutorial und dieser Anleitung: www.delphi-treff.de/...cherung/ini-dateien/
komme ich einfach nicht drauf, wie ich die Weiteren Werte einlesen kann? |
Dieses Tutorial behandelt ja auch etwas völlig anderes. Was haben INI-Dateien mit dem Textlistenformat zu tun, die hier verwendet werden?
Vorschlag hat folgendes geschrieben : | Kannst du mir einen Tipp geben? |
Wie wäre es, einfach auch wieder 5 Werte beim Laden anzulegen?
Im Zweifel zeig mal deinen Code (brauchst nicht wieder das ganze Projekt hochladen, es reicht wenn du den Ausschnitt (analog zu dem letzten Codeschnipsel in meinem letzen Post) zeigst).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 14:55
Ich würde es so machen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for i := 0 to Datei.Count-1 do begin Zeile.CommaText := Datei.Strings[i]; if (Zeile.Count = 5) then with lvHighscore.Items.Add do begin Caption := Zeile.Strings[0]; Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); SubItems.Add(IntToStr(Integer(Data))); SubItems.Add(Zeile.Strings[2]); SubItems.Add(Zeile.Strings[3]); SubItems.Add(Zeile.Strings[4]); end; |
Wobei ich mir grad mal die erstellte .ini angeschaut habe und eigentlich nur 3 Daten gespeichert werden?
hfhgf,22,9
d.h. das Laden ist nicht das Problem sondern das Speichern?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 15:07
Moin!
Vorschlag hat folgendes geschrieben : | Ich würde es so machen? |
Sieht gut aus.
Vorschlag hat folgendes geschrieben : | Wobei ich mir grad mal die erstellte .ini angeschaut habe und eigentlich nur 3 Daten gespeichert werden?
hfhgf,22,9
d.h. das Laden ist nicht das Problem sondern das Speichern? |
Scheint mir eine alte/ungültige INI zu sein. Löschen und neuen Highscore anlegen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 15:11
Es funktioniert!!!
Yippeh
Wär wirklich wohl ne alte .ini gewesen...
So das wichtigste ist geschafft. Mal schauen, ob ich noch mehr einfügen möchte.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 15:29
Moin!
Vorschlag hat folgendes geschrieben : | Es funktioniert!!!
Yippeh
[...]
So das wichtigste ist geschafft. Mal schauen, ob ich noch mehr einfügen möchte. |
Musst du nicht Fragen zu "deinem" Projekt beantworten?  (ich schätze mal, das Ding hier soll deine Info-Note retten  oder?) Das könnte nach meinem bisherigen Eindruck von deinen "Programmierfähigkeiten" leicht ins Auge gehen - du hast doch ganz sicher keinen blassen Schimmer, wie die GameEngine funktioniert oder etwa doch (damit würde ich dich annageln)?  Wenn ich dein Info-Lehrer wäre, bräuchte ich ca. 5 Minuten um rauszufinden, dass du das nie und nimmer alleine geschrieben haben kannst. Hast du schon einen Plan was du sagen/tun willst, wenn das rauskommt und der Le(e|h)rkörper anfängt, Streß zu machen?  Schade, dass ich nicht dabei bin...  Ich liebe Schlachtfeste...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 15:57
mmh, also dein Tutorial werde ich mir durchlesen
Außerdem ist Hilfe beim Erstellen des Programmes nicht verboten
Fragen müssen wir nicht direkt beantworten, sondern wir bekommen Aufgaben, die wir ins 90min erledigen sollen
Habe schon eine neue Frage:
Wie sortiere ich die Highscoreliste primär nach gebrauchter Zeit und falls die gleich ist dann nach Zügen?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 16:05
Moin!
Vorschlag hat folgendes geschrieben : | Fragen müssen wir nicht direkt beantworten, sondern wir bekommen Aufgaben, die wir ins 90min erledigen sollen  |
Die können sich doch aber nicht auf das Projekt beziehen.  Dazu müsste die Projekt-Aufgabe ja normiert für alle gleich sein.
Vorschlag hat folgendes geschrieben : | Wie sortiere ich die Highscoreliste primär nach gebrauchter Zeit und falls die gleich ist dann nach Zügen? |
Dann zeig mir doch mal die Stelle als Codeausschnitt, an der bestimmt wird, wie sich zwei Elemente der Liste zueinander verhalten. Dann sehen wir weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 16:43
Narses hat folgendes geschrieben : | Die können sich doch aber nicht auf das Projekt beziehen. Dazu müsste die Projekt-Aufgabe ja normiert für alle gleich sein.  |
Naja wir können, wenn wir wollen vorher schon ihm unser Programm schicken, damit er individuelle aufgaben geben kann. Aber ich denke, dass es besser ist, die normalen Aufgaben zu bearbeiten
Narses hat folgendes geschrieben : | Dann zeig mir doch mal die Stelle als Codeausschnitt, an der bestimmt wird, wie sich zwei Elemente der Liste zueinander verhalten. Dann sehen wir weiter.
|
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); end; |
Also werden sie primar nach Item1 absteigend sortiert.
Wenn allerdings Item1 und Item2 gleich sein sollten, dann will ich, dass sie nach Zeile.Strings[3] sortiert werden.
Falls dies auch gleich sein sollte, dann nach dem Eintragedatum also Zeile.Strings[4]
sieht es dann so aus?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); Compare := CompareValue(Integer(Item1.Zeile.Strings[3]),Integer(Item2.Zeile.Strings[3])); Compare := CompareValue(Integer(Item1.Zeile.Strings[4]),Integer(Item2.Zeile.Strings[4])); end; |
?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 16:54
Moin!
Vorschlag hat folgendes geschrieben : | Also werden sie primar nach Item1 absteigend sortiert. |
Jup, die Stelle ist es.
Vorschlag hat folgendes geschrieben : | Wenn allerdings Item1 und Item2 gleich sein sollten, dann will ich, dass sie nach Zeile.Strings[3] sortiert werden. |
Wie wird denn zurückgemeldet, dass zwei Einträge gleich sind?
Vorschlag hat folgendes geschrieben : | Falls dies auch gleich sein sollte, dann nach dem Eintragedatum also Zeile.Strings[4] |
Hier musst du noch auf die Datentypen achten.
Vorschlag hat folgendes geschrieben : | sieht es dann so aus? |
Geht schon in diese Richtung.  Allerdings musst du noch verhindern, dass eine ungleich-Relation wieder überschrieben wird.  Und, wie schon gesagt, die Datentypen stimmen nicht.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 17:13
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if Item1.Data = Item2.Data then Compare := CompareText(Item1.SubItems[3],Item2.SubItems[3]) else begin Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); end; end; |
Nur das Kompilieren geht nicht.
Listenindex übersteigt das Maximum.
???
--- Moderiert von Narses: Beiträge zusammengefasst---
Außerdem ist mir aufgefallen, dass die Liste erst beim Neuen Starten sortiert wird.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.01.10 19:53
Moin!
Zunächst mal dein Code vernünftig eingerückt, bereinigt und kommentiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item1.Data = Item2.Data) then Compare := CompareText(Item1.SubItems[3],Item2.SubItems[3]) else Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); end; | Sieht soweit gut aus.  (wobei du vermutlich das Datum nicht als Text vergleichen willst, aber egal)
Vorschlag hat folgendes geschrieben : | Nur das Kompilieren geht nicht.
Listenindex übersteigt das Maximum.
??? |
Das hat nix mit dem Kompilieren zu tun, sondern ist ein Laufzeitfehler (also ein Fehler, der erst auftritt, wenn das Programm läuft). Und zwar hängt das damit zusammen, dass die Items bei Einfügen bereits sortiert werden, zu diesem Zeitpunkt sind aber die .SubItems noch nicht gesetzt. Deshalb musst du dem Listview sagen, es soll erstmal warten, mit den ganzen automatisch Funktionen und das dann am Ende erledigen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| lvHighscore.Items.BeginUpdate; for i := 0 to Datei.Count-1 do begin Zeile.CommaText := Datei.Strings[i]; if (Zeile.Count = 5) then with lvHighscore.Items.Add do begin Caption := Zeile.Strings[0]; Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); SubItems.Add(IntToStr(Integer(Data))); SubItems.Add(Zeile.Strings[2]); SubItems.Add(Zeile.Strings[3]); SubItems.Add(Zeile.Strings[4]); end; end; lvHighscore.Items.EndUpdate; finally |
Vorschlag hat folgendes geschrieben : | Außerdem ist mir aufgefallen, dass die Liste erst beim Neuen Starten sortiert wird. |
Das liegt daran, dass du beim Anlegen eines neues Scores die Punkte nicht in die .Data-Eigenschaft schreibst.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mi 06.01.10 20:15
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 07.01.10 01:04
Moin!
Vorschlag hat folgendes geschrieben : | Narses hat folgendes geschrieben : | Das liegt daran, dass du beim Anlegen eines neues Scores die Punkte nicht in die .Data-Eigenschaft schreibst. | Verstehe ich leider mal wieder nicht |
Nun, beim Laden der Scores hast du diese Zeile drin:
Delphi-Quelltext 1:
| Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); | Irgendwie sowas fehlt aber beim Anlegen eines neuen Scores.
Nochwas: Ich habe das Spiel gestartet, nichts getan und dann erstmal diesen Beitrag geschrieben. Dann habe ich das Spiel gelöst und kriege einen Score (=benötigte Zeit), die gar nix mit der Realität zu tun hat. Will sagen: du darfst die Zeit erst zählen, wenn der erste Klick erfolgt ist.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Do 07.01.10 17:29
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 07.01.10 17:46
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Do 07.01.10 20:23
Narses hat folgendes geschrieben : | Nun, beim Laden der Scores hast du diese Zeile drin:
Delphi-Quelltext 1:
| Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); | Irgendwie sowas fehlt aber beim Anlegen eines neuen Scores.  |
Bist du sicher, dass man mit dieser Zeile arbeiten muss?
mmh, ansetzen würde ich natürlich an dieser Stelle:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| if (EdName.Text = '') then EdName.Text := InputBox('Bitte geben Sie einen Namen ein.','Ihr Name:',''); if (EdName.Text <> '') then begin ShowMessage('Herzlichen Glückwunsch Sie haben gewonnen!'#13#10#13#10+ 'Benötigte Zeit in Sekunden: '+LbGebrauchteZeit.Caption+#13#10#13#10+ 'Sie haben '+FloatToStr(FMoves)+' Fehlversuche gehabt.'); with Form2.lvHighscore.Items.Add do begin Caption := EdName.Text; SubItems.Add(Form1.LbGebrauchteZeit.Caption); SubItems.Add(IntToStr(Points)); SubItems.Add(IntToStr(Moves)); SubItems.Add(DateTimeToStr(Now)); end; Form2.ShowModal; end else ShowMessage('Kein Name, kein Highscore!'); end; |
folgendes funktioniert fast:
Delphi-Quelltext 1: 2:
| SubItems.Add(DateTimeToStr(Now)); Data := Pointer(StrToInt(SubItems.Add[Points])); |
nur nach dem Anlegen eines Highscores, ist der ListenIndex wieder überfordert.
Narses hat folgendes geschrieben : | Nochwas: Ich habe das Spiel gestartet, nichts getan und dann erstmal diesen Beitrag geschrieben. Dann habe ich das Spiel gelöst und kriege einen Score (=benötigte Zeit), die gar nix mit der Realität zu tun hat. Will sagen: du darfst die Zeit erst zählen, wenn der erste Klick erfolgt ist.  |
Da habt ihr Recht
Weiß aber derzeit noch nicht unbedingt, wo ich ansetzen muss...  bin noch am Testen.
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|