Autor |
Beitrag |
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 07.01.10 23:34
Moin!
Vorschlag hat folgendes geschrieben : | Narses hat folgendes geschrieben : | Irgendwie sowas fehlt aber beim Anlegen eines neuen Scores.  | Bist du sicher, dass man mit dieser Zeile arbeiten muss? |
100%ig.
Vorschlag hat folgendes geschrieben : | mmh, ansetzen würde ich natürlich an dieser Stelle: |
Ja, die Gegend ist gut.
Vorschlag hat folgendes geschrieben : | 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. |
Hier stecken zwei Haken drin: - Das mit dem Listenindex hatten wir doch schonmal, und auch eine Lösung dafür.
Die klappt hier auch.
- Analysieren wir mal, was bei diesem Befehl genau passiert:
Delphi-Quelltext 1: 2: 3: 4:
| Data := Pointer( StrToInt( SubItems.Add[Points])); | - Die Eigenschaft .Data eines TListItems soll einen neuen Wert erhalten
- Da die Eigenschaft vom Typ Pointer ist, müssen wir einen Typecast machen, da wir einen Integer verwenden wollen
- Umwandlung eines Strings in einen Integer
- Einfügen eines neuen .SubItems an das TListItem, und zwar die Formulareigenschaft Points (die übrigens ein Integer ist
und gar nicht eingefügt werden kann), weiterhin liefert .Add() den Index des neu eingefügten Elements als Integer ab, kann man also auch nicht als Argument für StrToInt() nehmen.  Ich behaupt mal, dass das nicht "fast" funktioniert, sondern gar nicht. Da dort mindestens ein Datentyp nicht richtig verwendet wird, sollte sich das nichtmal kompilieren lassen.
Überlegen wir mal: was soll denn in der .Data-Eigenschaft drin stehen? Richtig: die verbrauchte Zeit. Wo hast du sie abgespeichert und wie kriegt man sie da rein? Probier mal... 
Vorschlag hat folgendes geschrieben : | Weiß aber derzeit noch nicht unbedingt, wo ich ansetzen muss... bin noch am Testen. |
Ich würde ja mal sagen, dass die Stelle wo die Klicks verarbeitet werden, verdächtig gut aussieht.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Fr 08.01.10 00:33
Delphi-Quelltext 1:
| Data := Pointer(StrToInt(SubItems.Add[Points])); |
habe ich zu
Delphi-Quelltext 1:
| Data := Pointer(SubItems[Points]); |
gemacht...
der Listviewfehler ist immer noch da.
Ich finde die stellen für
Delphi-Quelltext 1:
| lvHighscore.Items.BeginUpdate; |
und
Delphi-Quelltext 1:
| lvHighscore.Items.EndUpdate; |
nicht wirklich
Ich weiß, dass es am Anfang des Eintrages und am Ende hinmuss. Die richtige Stelle aber nicht
Zu dem Startproblem habe ich leider auch noch nichts. Die if Definition 1. mal TForm1.Button1Click wird es ja wohl nicht geben 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 08.01.10 00:52
Moin!
Vorschlag hat folgendes geschrieben : | Delphi-Quelltext 1:
| Data := Pointer(StrToInt(SubItems.Add[Points])); | habe ich zu Delphi-Quelltext 1:
| Data := Pointer(SubItems[Points]); | gemacht... | Da dir der Compiler das nicht abnehmen wird, solltest du bereits von selbst darauf gekommen sein, dass da was so ganz grundsätzlich nicht stimmen kann.  Points ist die Formulareigenschaft (vom Typ Integer!), die die Anzahl der Punkte im Spiel zählt. Du willst aber doch gar nicht (primär) danach sortieren, sondern nach der benötigten Zeit. Also kann das konzeptionell doch schon nicht stimmen (mal abgesehen von der Syntax).  //EDIT: Ich sehe gerade, dass das doch syntaktisch korrekt ist, das lässt sich kompilieren.  Ist aber logischer Quatsch...
Vorschlag hat folgendes geschrieben : | der Listviewfehler ist immer noch da.
Ich finde die stellen für
Delphi-Quelltext 1:
| lvHighscore.Items.BeginUpdate; |
und
Delphi-Quelltext 1:
| lvHighscore.Items.EndUpdate; |
nicht wirklich
Ich weiß, dass es am Anfang des Eintrages und am Ende hinmuss. Die richtige Stelle aber nicht |
 Schauen wir uns den Codeteil nochmal an:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 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(LbGebrauchteZeit.Caption); SubItems.Add(IntToStr(Points)); SubItems.Add(IntToStr(Moves)); SubItems.Add(DateTimeToStr(Now)); end; Form2.ShowModal; | Mit Form2.lvHighscore.Items.Add wird ein neues ListItem (=Score) angelegt. Davor muss das .BeginUpdate; stehen. Und wenn das ListItem fertig befüllt ist, kommt wieder ein .EndUpdate; - im Prinzip genau so, wie beim Laden.
Vorschlag hat folgendes geschrieben : | Zu dem Startproblem habe ich leider auch noch nichts. Die if Definition 1. mal TForm1.Button1Click wird es ja wohl nicht geben  |
Nein, die gibt es sicher nicht. Nächster Versuch?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 13:25
Super, ich muss das Programm doch noch heute abgegeben und nicht wie anderst geplant nächste Woche.
Werden heute Abend versuchen noch die Vorschläge von dir soweit wie möglich zu implentieren.
Ansonsten müssen sie wohl auf Grund Zeitmangels wegbleiben
Mal ne kleine Frage am Rande (traue mich kaum zu fragen), hast du morgen Dienstag (15:15-17:00) die Möglichkeit ab und zu mal hier reinzuschauen? Das benotete Programmieren wäre morgen und ich werde sicherlich mal etwas (  ) Hilfestellung benötigen.
Gruß

|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 14:15
Moin!
Vorschlag hat folgendes geschrieben : | Werden heute Abend versuchen noch die Vorschläge von dir soweit wie möglich zu implentieren. |
Na dann viel Erfolg.
Vorschlag hat folgendes geschrieben : | Mal ne kleine Frage am Rande (traue mich kaum zu fragen), hast du morgen Dienstag (15:15-17:00) die Möglichkeit ab und zu mal hier reinzuschauen? Das benotete Programmieren wäre morgen und ich werde sicherlich mal etwas ( ) Hilfestellung benötigen. |
Alter Schwede...  Wir sind hier keine Klausuren-Schreib-Agentur.
Du kannst gerne Fragen stellen, wenn diese konkret und verständlich sind, gibt es sicher auch Antworten hier. Meine persönliche Unterstützung gibt´s nach Zahlung eines angemessenen Betrags im voraus auf mein Konto.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 14:25
Beim Thema HTML (Homepages mit Joomla) habe ich für 3 Klassenkameraden (wir hatten abwechselnd Info) die Aufgaben von zu Hause aus erledigt
Wie hoch ist den der Betrag  (bitte per PN) ?
Ich will Delphi eigentlich auch nur rumbekommen, das liegt mir einfach nicht.
Danke nochmal für alle Hilfen.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 14:53
Moin!
Vorschlag hat folgendes geschrieben : | Wie hoch ist den der Betrag (bitte per PN) ?
Ich will Delphi eigentlich auch nur rumbekommen, das liegt mir einfach nicht. |
In diesem Fall sollest du wegen realistischer Beurteilung deiner Leistungen damit rechnen, dass du hier morgen gar keine Hilfe kriegst.  Hart, aber gerecht.
Vorschlag hat folgendes geschrieben : | Danke nochmal für alle Hilfen. |
Bitte, nur leider vergebens. Ich hatte gehofft, dass du vielleicht doch noch eigenes Interesse entwickeln würdest...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 18:36
Kommt drauf an, ob du mit eigenem Interesse meinst, dass ich mich weiterhin in Delphi reinknieen werde, dann muss ich dich leider enttäuschen.
Das ich etwas gelernt habe, ja. Ich sehe auch zwischen HTML und C++ einige Verbindungen, aber mir persönlich sagt HTML z.B. mehr zu.
B2T:
Das müsste dann stimmen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Form2.lvHighscore.Items.BeginUpdate; 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.lvHighscore.Items.EndUpdate; |
?
Nur leider bekomme ich es mit dem automatisch sortieren nach dem Eintragen nicht hin.
All meine Versuche enden mit dem Fehler undeklarierter Bezeichner?!?
Die richtige Stelle, um die Zeit erst beim 1. Klick zu erfassen, habe ich auch noch nicht gefunden?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 18:49
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 19:03
Zitat: | Dann zeig mal "all deine Versuche", wird schon nicht so schwer sein. |
1. Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data));
2. Data := DateTimeToStr(SubItems[Form1.LbGebrauchteZeit.Caption]);
3. Data := Pointer(SubItems[1]);
Zitat: | Ich würde ja mal sagen, dass die Stelle wo die Klicks verarbeitet werden, verdächtig gut aussieht.  |
Verarbeitet werden sie hier:
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:
| procedure TForm1.Button1Click(Sender: TObject); var Differenz: Integer; Zeit1, Zeit2: TDateTime;
function AllCardsOpen: Boolean; var i: Integer; begin Result := FALSE; for i := MIN to MAX do if (Cards[i].Button.Visible) then Exit; Result := TRUE; end; begin (Sender as TButton).Visible := FALSE; case GameState of gsOpenCards0: begin Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end; gsOpenCards1: begin Move2 := (Sender as TButton).Tag; ... end else begin GameState := gsOpenCards2; Moves := Moves +1; end; end; gsOpenCards2: begin Cards[Move1].Button.Visible := TRUE; Cards[Move2].Button.Visible := TRUE; Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end; end; end; |
Da würde ich das Augenmerk legen?
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 19:44
Moin!
Vorschlag hat folgendes geschrieben : | Zitat: | Dann zeig mal "all deine Versuche", wird schon nicht so schwer sein. |
1. Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); |
Was die Zuweisung auf Compare hier zu suchen hat, müsstest du mir nochmal erklären.  Sorry, aber sieht wirklich so aus, als ob du mangels Plan einfach nur rätst.
Vorschlag hat folgendes geschrieben : | 2. Data := DateTimeToStr(SubItems[Form1.LbGebrauchteZeit.Caption]); |
Schon besser. Da du aber bereits mehrfach den Hinweis bekommen hast, dass die Eigenschaft .Data ein Pointer ist, wird die Zuweisung eines Strings (DateTime ToStr) wohl nicht ganz passen können.  Wenn du mir jetzt noch sagen kannst, warum das .SubItems[] da auftaucht, dann kommen wir weiter.
Vorschlag hat folgendes geschrieben : | 3. Data := Pointer(SubItems[1]); |
Wenn du diesen Ansatz mit dem 2. kombinierst und noch etwas mehr Logik rein bringst, wird´s was.
Nochmal zur Erinnerung: Narses hat folgendes geschrieben : | Du willst aber doch gar nicht (primär) danach sortieren, sondern nach der benötigten Zeit. |
Vorschlag hat folgendes geschrieben : | Zitat: | Ich würde ja mal sagen, dass die Stelle wo die Klicks verarbeitet werden, verdächtig gut aussieht.  |
Verarbeitet werden sie hier:
[...]
Da würde ich das Augenmerk legen? |
Jup.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 22:29
Dann klingt mir dies hier am logistischen:
Delphi-Quelltext 1:
| Data := Pointer(Form2.lvHighscore.Items[1]); |
[1] ist doch Benötigte Zeit?
[0] Name
[2] Paare
[3] Fehlversuche
[4] Datum
?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 22:42
Moin!
Vorschlag hat folgendes geschrieben : | Dann klingt mir dies hier am logistischen:
Delphi-Quelltext 1:
| Data := Pointer(Form2.lvHighscore.Items[1]); |
[1] ist doch Benötigte Zeit? |
Ja, aber im ListItem (also links vom ":=").  Der Ausdruck Form2.lvHighscore.Items[1] ist ungültig.  Du möchtest aber die benötigte Zeit haben, genau diese Zeit schreibst du doch extra in ein (verstecktes) Label auf dem Formular (btw: sowas gehört nicht in ein Label, sondern in eine Klassen-Eigenschaft). Da es in einem Label steht (Label.Caption ist ein String), musst du es allerdings vor dem Typecast auf Pointer() noch in einen Integer umwandeln. Das hast du schonmal gemacht, sollte also auch hier klappen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 22:55
Delphi-Quelltext 1:
| Data := Pointer(Form2.lvHighscore.Items[StrToInt(LbGebrauchteZeit.Caption)]); |
?
Geht aber auch irgendwie nicht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Form2.lvHighscore.Items.BeginUpdate; 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)); Data := Pointer(Form2.lvHighscore.Items[StrToInt(LbGebrauchteZeit.Caption)]); end; Form2.lvHighscore.Items.EndUpdate; Form2.ShowModal; |
Ich bin am Verzweifeln...
das mit dem 1. Klick und dann erst die Zeit nehmen bekomme ich auch nicht hin...
obwohl du mir ja die Stelle zum Einbinden eigentlich bestätigt hast.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| case GameState of gsOpenCards0: begin Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end; |
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 23:03
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 23:25
Super das Sortieren klappt nun
Auch wenn es jetzt nur nach gebrauchter Zeit sortiert wird und nicht noch falls diese gleich sein sollte nach etwas anderem. Geht bestimmt auch? Wieder mit ifs?
Das Zweite probiere ich gerade aus und mir ist auch eine Idee bekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| begin (Sender as TButton).Visible := FALSE; case GameState of gsOpenCards0: begin if Moves := '' AND Points :='' then begin LbAnfangszeit.Caption := TimeToSTr(now) Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end else begin Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end; end; |
Nur ist da wohl nen Fehler drinnen 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 23:35
Moin!
Vorschlag hat folgendes geschrieben : | Super das Sortieren klappt nun
Auch wenn es jetzt nur nach gebrauchter Zeit sortiert wird und nicht noch falls diese gleich sein sollte nach etwas anderem. Geht bestimmt auch? |
Warum sollte das nicht klappen?  Hast du die Vergleichsmethode nochmal geändert (die war doch schon fertig umgestellt)?
Vorschlag hat folgendes geschrieben : | Das Zweite probiere ich gerade aus und mir ist auch eine Idee bekommen:
[...]
Nur ist da wohl nen Fehler drinnen  |
Könnte man so sagen.  Wenn Moves und Points = 0 ist, dann ist das noch kein Indiz dafür, dass ein neues Spiel im Gange ist.  Ich würde das anders machen: - Du leerst den Inhalt des Startzeit-Labels in der Methode, die ein neues Spiel startet
- In der Methode, die die Mausklicks bearbeitet schaust du nun, ob das Startzeit-Label leer ist; wenn ja, schreibst du die Startzeit rein
- Damit wird auf jeden Fall der Spielstart korrekt abgefangen

cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 23:44
Also das Sortieren geht ja. Aber es wird halt nur nach der gebrauchten Zeit und nicht auch noch nach anderen Kriterien sortiert.
Also soll ich es so machen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| end; GameState := gsOpenCards0; Moves := 0; Points := 0; LbAnfangszeit.Caption:= ''; end; |
und
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| begin (Sender as TButton).Visible := FALSE; case GameState of gsOpenCards0: if LbAnfangszeit.Caption= '' then begin LbAnfangszeit.Caption := TimeToStr(now); Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end else begin begin Move1 := (Sender as TButton).Tag; GameState := gsOpenCards1; end; end; |
?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 23:51
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 11.01.10 23:54
Also meine Vergleichsmehtode ist folgende:
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; |
2. mmh also hattest du es dir anderst gedacht?
Also funktionieren tut es zumindestens.
|
|