AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Highscore - Problem mit sortieren !
Thema durchsuchen
Ansicht
Themen-Optionen

Highscore - Problem mit sortieren !

Ein Thema von doemi · begonnen am 19. Feb 2006 · letzter Beitrag vom 21. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#1

Highscore - Problem mit sortieren !

  Alt 19. Feb 2006, 18:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Highscore - Problem mit sortieren ! Dringend

  Alt 19. Feb 2006, 18:14
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
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#3

Re: Highscore - Problem mit sortieren !

  Alt 19. Feb 2006, 18:23
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
  Mit Zitat antworten Zitat
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#4

Re: Highscore - Problem mit sortieren !

  Alt 19. Feb 2006, 20:16
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 ), weil Du sie in der Speicher-Prozedur (bzw. anderen) schon deklariert hast.

Zwischenfrage: Warum schreibst Du Dir eine "eigene" PosEx-Funktion (bzw. kopierst sie ), die gibt's doch schon in den StrUtils (die Du ja auch schon unter Uses stehen hast) ?

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" .
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.
  Mit Zitat antworten Zitat
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#5

Re: Highscore - Problem mit sortieren !

  Alt 19. Feb 2006, 22:08
Irgendwie kann ich hier den Post nicht löschen...geht das auch iwie ?
  Mit Zitat antworten Zitat
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#6

Re: Highscore - Problem mit sortieren !

  Alt 19. Feb 2006, 23:35
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
  Mit Zitat antworten Zitat
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#7

Re: Highscore - Problem mit sortieren !

  Alt 20. Feb 2006, 16:14
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.
  Mit Zitat antworten Zitat
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#8

Re: Highscore - Problem mit sortieren !

  Alt 20. Feb 2006, 17:32
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
  Mit Zitat antworten Zitat
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#9

Re: Highscore - Problem mit sortieren !

  Alt 20. Feb 2006, 17:44
Im FormCreate, nachdem Du die Laden-methode aufgerufen hast .

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.
  Mit Zitat antworten Zitat
doemi

Registriert seit: 13. Dez 2005
16 Beiträge
 
#10

Re: Highscore - Problem mit sortieren !

  Alt 20. Feb 2006, 20:24
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr.
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