![]() |
Highscore - Problem mit sortieren !
Hallo.
Ich habe etwas programmiert, bei dem eine Highscore erzeugt wird, diese sortiert wird und dann in eine .txt Datei gespeichert wird. Nun habe ich folgendes Problem: Beim ersten Mal funktioniert das sortieren noch. Wenn ich allerdings dann abspeichere, das Programm schließe, die Highscore wieder lade und einen Eintrag hinzufüge, dann hängt er diesen Eintrag nur an die bestehende Highscore dran, anstatt ihn vom Wert her richtig einzutragen. Danke schonmal im Voraus für die Antworten. Mit Freundlichen Grüßen doemi |
Re: Highscore - Problem mit sortieren ! Dringend
Hai doemi,
als erstes ändere doch bitten den Titel deines Threads. "Dringed" ist hier fast jede Frage. Danke. Nun zu deinem Problem: Ja, ohne den Code mit dem Du das ganze machst wird dir niemand sagen können wo der Fehler liegt ;-) |
Re: Highscore - Problem mit sortieren !
Hallo.
Hier der Code den ich verwende:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, StrUtils, ExtCtrls; type TForm1 = class(TForm) ListView1: TListView; btn1: TButton; edt1: TEdit; lbl2: TLabel; Label1: TLabel; Image1: TImage; OpenDialog1: TOpenDialog; procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); procedure btn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure speichern; procedure laden; { Private declarations } public { Public declarations } end; var Form1: TForm1; Name: string; SaveList: TStrings; i, j: Integer; Zeit: Integer; Const Delimitter = #14; implementation {$R *.dfm} function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; var I,X: Integer; Len, LenSubStr: Integer; begin if Offset = 1 then Result := Pos(SubStr, S) else begin I := Offset; LenSubStr := Length(SubStr); Len := Length(S) - LenSubStr + 1; while I <= Len do begin if S[I] = SubStr[1] then begin X := 1; while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do Inc(X); if (X = LenSubStr) then begin Result := I; exit; end; end; Inc(I); end; Result := 0; end; end; procedure TForm1.laden; var LoadList: TStrings; ActPos, PrevPos: Integer; Begin If Not OpenDialog1.Execute Then Exit; LoadList := TStringList.create; Try // Laden... LoadList.LoadFromFile(OpenDialog1.FileName); // Lösche den ListView ListView1.Items.Clear; // Laufe durch Zeilen der StringList For i := 0 To pred(LoadList.Count) Do Begin PrevPos := 1; ActPos := 1; // Erste Position des Delimitters ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); // Erstelle Item With ListView1.Items.Add Do Begin // setze Caption des neuen Items Caption := Copy(LoadList[i], PrevPos, (ActPos - PrevPos)); PrevPos := succ(ActPos); // erzeuge für jeden gefundenen Delimitter ein SubItem Repeat ActPos := PosEx(Delimitter, LoadList[i], succ(ActPos)); If ActPos <> 0 Then SubItems.Add(Copy(LoadList[i], PrevPos, (ActPos - PrevPos))) Else SubItems.Add(Copy(LoadList[i], PrevPos, Length(LoadList[i]))); PrevPos := succ(ActPos); // Wenn ActPos = 0 (kein Delimitter gefunden) -> fertig Until ActPos = 0; End; End; Finally // Freigeben... FreeAndNil(LoadList); End; End; procedure TForm1.speichern; var SaveList: TStrings; i, j: Integer; TestVar: String; Begin //If Not SaveDialog1.Execute Then Exit; SaveList := TStringList.create; Try // Dein ListView With ListView1 Do Begin // Laufe durch alle Items For i := 0 To pred(Items.Count) Do Begin TestVar := ''; With Items[i] Do // Laufe durch alle SubItems For j := 0 To pred(SubItems.Count) Do TestVar := TestVar + Delimitter + SubItems[j]; SaveList.Add(Items[i].Caption + TestVar); End; End; // Speichern SaveList.SaveToFile('domi.txt'); Finally // Freigeben ... FreeAndNil(SaveList); End; End; procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item1.Data = Item2.Data) then Compare := 0 else if (Integer(Item1.Data) > Integer(Item2.Data)) then Compare := 1 else Compare := -1; end; procedure TForm1.btn1Click(Sender: TObject); begin Name:=edt1.text; with ListView1.Items.Add do begin // neuen Eintrag erzeugen Caption := Name; // Name eintragen Zeit := Random(1000); // zufällige Zeit erzeugen SubItems.Add(IntToStr(Zeit)); // Zeit zum Anzeigen als Text Data := Pointer(Zeit); // Zeit zum Vergleichen binär speichern (.Data ist vom Typ Pointer, deshalb die typecasts) end; end; procedure TForm1.FormCreate(Sender: TObject); begin; laden; end; procedure TForm1.FormDestroy(Sender: TObject); begin speichern; end; end. Mfg doemi |
Re: Highscore - Problem mit sortieren !
Nabend.
Also...
Delphi-Quellcode:
Zunächst solltest Du diese ganzen Variablen in den Prozeduren, in denen Du sie verwendest, lokal deklarieren. Dann merkst Du auch, dass Du Dir die "SaveList"-Variable sparen kannst ("i", "j", und "Name" auch :wink: ), weil Du sie in der Speicher-Prozedur (bzw. anderen) schon deklariert hast.
var
Name: string; // siehe unten SaveList: TStrings; // hier überflüssig i, j: Integer; // "j" ist hier auch überflüssig, "i" solltest Du lieber in der Laden-Prozedur deklarieren Zeit: Integer; // siehe unten Zwischenfrage: Warum schreibst Du Dir eine "eigene" PosEx-Funktion (bzw. kopierst sie :wink: ), die gibt's doch schon in den StrUtils (die Du ja auch schon unter Uses stehen hast) :gruebel: ? Weiter... Im ListView-OnCompare vergleichst Du nicht, ob die beiden Integer, auf die die "Datas" zeigen, gleich sind, sondern nur, ob sie auf dieselbe Adresse zeigen.
Delphi-Quellcode:
Die Btn1Click-Prozedur war mein' ich auch nicht ganz richtig, so wär' es besser:
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer); var Item1IntData, Item2IntData: Integer; begin { Die Data-Eigenschaft eines ListItems ist vom Typ Pointer, daher muss man sie in einen Zeiger auf einen Integer umwandeln, um an den Wert, auf den er zeigt, zu kommen: } Item1IntData := PInteger(Item1.Data)^; Item2IntData := PInteger(Item2.Data)^; if Item1IntData = Item2IntData then Compare := 0 else if Item1IntData > Item2IntData then Compare := 1 else Compare := -1; end;
Delphi-Quellcode:
Im OnCreate des Fensters solltest Du noch ein "Randomize" aufrufen, um "den Zufallsgenerator zu initialisieren" :stupid: .
procedure TForm1.btn1Click(Sender: TObject);
var Name: string; // ist jetzt hier deklariert Zeit: Integer; // dito begin Name := Edt1.text; Zeit := Random(1000); // diese Zeile ist jetzt hier with ListView1.Items.Add do begin Caption := Name; SubItems.Add(IntToStr(Zeit)); Data := @Zeit; // das @ gibt die Adresse der Variable "Zeit" zurück end; end;
Delphi-Quellcode:
MfG
procedure TForm1.FormCreate(Sender: TObject);
begin; Randomize; // <--- hier laden; end; PS: Ich hoffe, ich hab' da jetzt keinen Quatsch verzapft. Edit: Hab' noch ein bissl was hinzugefügt. |
Re: Highscore - Problem mit sortieren !
Irgendwie kann ich hier den Post nicht löschen...geht das auch iwie ?
|
Re: Highscore - Problem mit sortieren !
Hi...
1000 mal entschuldigung wegen des Doppelpost, aber iwie weiss ich net wie man einträge löscht... Das Problem ist: Er sortiert schon, aber: Wenn ich abspeichere und beim nächsten Mal die .txt datei aufrufe und dann ändere, tut er so als ob er eine neue Highscore unter der anderen anlegt: Name Zeit hhh 0 asds 1000 sddf 3000 das steht beim ersten abspeichern, jetzt schließe ich und rufe die Highscore wieder auf: Name Zeit hhh 0 asds 1000 sddf 3000 Wenn ich jetzt einträge mache zeigt er mir das so an: Name Zeit hhh 0 asds 1000 sddf 3000 derer 23 werz 1345 Wer kann mir sagen wo der Fehler liegt, denn eigentlich müsste er doch die Einträge ordnen...also mit dem verbessertem Quelltext. Danke schonmal im Voraus doemi dumdi 2000 |
Re: Highscore - Problem mit sortieren !
Moin, moin.
Vielleicht hilft's, wenn Du nach dem Laden nochmal die AlphaSort-Methode des ListViews aufrufst. MfG PS: Du kannst Beiträge nicht selber löschen, das können nur Mods, Hausmeister, und Admins. |
Re: Highscore - Problem mit sortieren !
Hi...
Ich steh grad en bissl auf dem Schlauch: Wie löse ich das am besten, also wie rufe ich diese ASort Methode auf ? mfg doemi |
Re: Highscore - Problem mit sortieren !
Im FormCreate, nachdem Du die Laden-methode aufgerufen hast :wink: .
MfG Edit: Hast Du die Eigenschaft "SortType" des ListVies eigentlich auf stData gesetzt? Wenn nicht, kannst Du Dir das zusätzliche Aufrufen von AlphaSort wahrscheinlich sparen. |
Re: Highscore - Problem mit sortieren !
SortType is auf data...
aber es funzt trotzdem net... procedure formcreate; begin laden; AlphaSort; // wie schreib ich das hin ? is das net die Compare procedure ? end; mfg doemi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz