Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Highscore - Problem mit sortieren ! (https://www.delphipraxis.net/63489-highscore-problem-mit-sortieren.html)

doemi 19. Feb 2006 17:12


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

Sharky 19. Feb 2006 17:14

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 ;-)

doemi 19. Feb 2006 17:23

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

Thorben77 19. Feb 2006 19:16

Re: Highscore - Problem mit sortieren !
 
Nabend.

Also...

Delphi-Quellcode:
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
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.

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:
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;
Die Btn1Click-Prozedur war mein' ich auch nicht ganz richtig, so wär' es besser:
Delphi-Quellcode:
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;
Im OnCreate des Fensters solltest Du noch ein "Randomize" aufrufen, um "den Zufallsgenerator zu initialisieren" :stupid: .
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin;
  Randomize; // <--- hier
  laden;
end;
MfG

PS: Ich hoffe, ich hab' da jetzt keinen Quatsch verzapft.

Edit: Hab' noch ein bissl was hinzugefügt.

doemi 19. Feb 2006 21:08

Re: Highscore - Problem mit sortieren !
 
Irgendwie kann ich hier den Post nicht löschen...geht das auch iwie ?

doemi 19. Feb 2006 22:35

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

Thorben77 20. Feb 2006 15:14

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.

doemi 20. Feb 2006 16:32

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

Thorben77 20. Feb 2006 16:44

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.

doemi 20. Feb 2006 19:24

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 23:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz