Autor Beitrag
juKx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45

WinXp Pro Sp2
Delphi 7 Enterprise Edition
BeitragVerfasst: Sa 05.11.05 14:55 
hi,

meine highscore liste möchte ich in einer tlistbox ausgeben. da diese nur die ersten zahlen ordnet muss ich ein eigenes sortierverfahren einbringen..hier bubble sort. aber es funktioniert einfach nicht..

thx im Voraus

Quelltext:

ausblenden volle Höhe Delphi-Quelltext
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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
const anzahl=1000000;
type
  Thigh = record
            nick:string[30];
            zeit:real;
          end;
  Tdatei = file of Thigh;
  feldtyp=array[0..anzahl] of real;


var 
     xm,ym,vx,vy,r,bis,von,dauer:integer;
     sek:real;
     start:boolean;
     f:Tdatei;
     u:feldtyp;
     eingabe:Thigh;
     name:string[30];


……bla…

procedure tausche(var x3,y3:real); 
var hilf:real;                          
begin
  hilf:=x3;
  x3:=y3;
  y3:=hilf;
end;

procedure TForm1.btscoreClick(Sender: TObject);
var  score:string;
     sortiert,a:boolean;
     i,max:integer;
     
begin
seek(f,0);
  while not eof(f) do
    begin
      read(f,eingabe);
      score:=floattostr(eingabe.zeit);
      LB.Items.Add(Score);  //lb = Listbox
      max:=lb.Items.Count;
    end;
    lb.items.Clear;
      for i:=0 to max do
        u[i]:=eingabe.zeit;
      //--sortieren des highscores---nach bubble sort
      repeat
        begin
          sortiert:=true;
          for i:=0 to max do
            if u[i]>u[i+1] then
              begin
                tausche(u[i],u[i+1]);
                sortiert:=false;
              end;
        end;
      until sortiert=true;
      for i:=0 to max do
        eingabe.zeit:=u[i];
      write(f,eingabe);
      begin
        lb.items.Clear;
        score:=floattostrf(eingabe.zeit,fffixed,10,2)+' sec---('+eingabe.nick+')----';
        while (LB.Items.Count > 14) do
          LB.Items.Delete(LB.Items.Count-1);
        lb.Items.add(score);
      end;
        //--ende sortieren des Highscores—
End;


Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 06.11.05 01:17 
Moin!

Da funktioniert noch sehr viel mehr nicht, als der BubbleSort... dein Code ist eine Katastrophe. :wink:

Wozu hantierst du da mit einer Datei rum? Warum hälst du nicht alle relevanten (und das sind IMHO max. 16 Stück) Highscore-Einträge in einem Array und liest das zu Programmbeginn bzw. speicherst es bei Programmende? Warum ist die Zeitangabe ein Real? Wenn du nur Sekunden speicherst, warum dann nicht als Integer (kann man sehr viel besser mit umgehen, z.B. als .Objects[] in der ListBox)?

Dein Code ist praktisch nicht reparierbar. Angebot: pack mal alles, was mit dem Highscore zu tun hat (oder noch besser das ganze Projekt aber ohne die EXE) hier in den Anhang, dann versuche ich mal, das auf eine INI-Datei umzustellen.

cu
Narses
juKx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45

WinXp Pro Sp2
Delphi 7 Enterprise Edition
BeitragVerfasst: So 06.11.05 22:56 
hi,

mh das mein code ne katasprophe ist das ist ja nicht gut. also ich habe mir das so gedacht.
zum anfang vom prog. gibt der spieler sein namen ein(eingabe.nick). so dann kann er das spiel spielen und wenn er eine zeit im spiel geschafft hat dann wird die unter eingabe.zeit gespeichert. so wenn jetzt der spieler sehen möchte ob er in den highscores drin ist klickt er auf highscore button. dann kommt das alles mit dem sortieren. ich dachte mir ich lese die datei aus mit nick und zeiten. dann packe ich die zeiten in ein array um sie besser mit dem bubble sort verfahren zu sortieren. dann nimm ich denn array und gib ihn wieder meinem record(eingabe) zurück. dann kann ich die datei speichern und jeder spieler hat den highscore dauerhaft auf sein PC(als datei).wenn ich den array sortiert habe und an eingabe.zeit zurückgegeben habe dann kann ich doch ganz normal in der Tlistbox den record anzeigen lassen(was bei mir ja nicht klappt).

thx für deine hilf und im anhang das prog
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.11.05 13:08 
Moin!

So, hier ist dein Projekt in der von mir überarbeiteten/erweiterten Version. Ich gebe zu, ich habe ziemlich viel geändert. Hier ein Überblick, soweit ich es noch auf die Kette kriege:

  • beim Start crashed das Ding sofort mit:
    Absturz hat folgendes geschrieben:
    ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt Project2.exe ist eine Exception der Klasse EInvalidOperation aufgetreten. Meldung: 'Ein deaktiviertes oder unsichtbares Fenster kann nicht den Fokus erhalten'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
    ---------------------------
    OK Hilfe
    ---------------------------
    Ich hab das nicht weiter verfolgt, sondern direkt das "große Hackebeil" ausgepackt und angefangen... :wink:
  • Wenn du Dinge nur einmal beim Programmstart machen willst, solltest du das Ereignis FormCreate() statt FormActivate() verwenden!
  • Du solltest aussagekräftige Namen für die Komponenten verwenden und etwas besser formatieren. Folgende Namen habe ich geändert:
    btneu -> BtnChangeNick, Button1 -> BtnStart, Button2 -> BtnExit, Timer2 -> Clock, Label1 -> LabelTime, Timer1 -> Movement, btscore -> BtnHighscore, zurueck -> BtnClose mit ModalResult := mrOK
  • Ich habe den Highscore in ein eigenes Formular gepackt; das macht keinen Sinn mit dem "Versteckspiel" :wink: Dazu mehr weiter unten.
  • Die Nickname-Eingabe habe ich auch abgetrennt und entsprechende Komponenten aus dem Form gelöscht; dazu dann noch eine angepasste Prozedur erstellt. Neue Variable "NickName" eingeführt (als public-property der Formularklasse; du hast generell viel zu viele globale Variablen verwendet; wozu? Die sind doch nur in der Formularklasse nötig, also auch da deklarieren)
  • Randomize brauchst du nur einmal am Anfang zu machen.
  • Das ganze Programm kannst du mit Application.Terminate; beenden (sollte in VCL-Apps so gemacht werden).
  • Form1.Position := poDesktopCenter gesetzt (im Objektinspektor); so wird das Formular immer in der Bildschirmmitte geöffnet.
  • Der Radius ändert sich nicht -> ins FormCreate() verschoben
  • Die Panels waren etwas konfus; aufgeräumt (nur ein Panel mit Alignment := alBottom und bvOuter := bvNone).
  • Schwierigkeitsgrad von GroupBox auf RadioGroup umgestellt, damit du das Problem mit ungültigen Auswahlen nicht mehr hast.
  • Reflektionsbedingungen vereinfacht, Panelgröße einbezogen.
  • Anwendungstitel gesetzt, damit die MessageBoxen auch einen korrekten Titel haben.
  • von,bis,dauer,sek entfernt und auf CurrentTime: Integer und TickStart: Cardinal (Ticks sind ohne Vorzeichen, deshalb nicht als Integer deklarieren!) umgestellt.
  • start: Boolean entfernt, Spielzustand ist anhand von Movement.Enabled ablesbar.
  • Pfad für die Highscores per Application.Exename bestimmen, dazu IniFiles in die uses aufgenommen.
  • Den Listbox-Ansatz auf ein ListView mit Style lvReport umgestellt; entsprechende Spalten angelegt und das Control auf automatisches Sortieren eingestellt; so werden neue Einträge automatisch richtig einsortiert; dazu muss man natürlich eine eigene Datenvergleichsprozedur bereitstellen, die die Relation zweier Elemente zueinander bestimmt. Einfach mal in den Quelltext von Unit2 schauen, sollte sich eigentlich schon fast selbst erklären.

Wenn du was nicht verstanden hast, frag ruhig nach; der Code soll dir in erster Linie als Anleitung dienen, wie man es auch machen könnte, und dann nutzt es mal wenig, wenn du´s nicht verstehst... :wink:

Wie ich gerade sehe: Betrachte es als Geburtstagsgeschenk... :party: :wink:

cu
Narses
Einloggen, um Attachments anzusehen!
juKx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45

WinXp Pro Sp2
Delphi 7 Enterprise Edition
BeitragVerfasst: Mo 07.11.05 22:24 
hi Narses!

erstmal ein ganz großes dankeschön an dich das du dir so viel mühe gegeben hast um mein problem zu bearbeiten. an deinem beispiel kann ich sehen wie ich sachen einfacher mache und probleme vorbeuge..

noch eine frage....wenn dieser kreis oder ball sich bewegt kann ich das auch hinkriegen das der nicht so flimmert oder wackelt? ist ja bei meinem alten prog. aus so?? gibt es da ein alternative?
an meinem rechner kann es nicht liegen...(3,4 MHz , 9800 PRo, 1gb DDR RAM)

thx für alles juKx
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 07.11.05 22:31 
Moin!

user profile iconjuKx hat folgendes geschrieben:
noch eine frage....wenn dieser kreis oder ball sich bewegt kann ich das auch hinkriegen das der nicht so flimmert oder wackelt? ist ja bei meinem alten prog. aus so?? gibt es da ein alternative?
an meinem rechner kann es nicht liegen...

Ja, das stimmt, es liegt nicht an deinem Rechner, sondern an den VCLs. Wenn du das wirklich "sauber" haben willst, führt kein Weg an DirectX vorbei - aber da bin ich nicht "Experte"... :wink:

Meine Empfehlung: lass es doch erstmal so und kümmere dich um einen sauberen Programmierstil. Grafik-APIs sind nämlich nochmal eine Stufe "höher" angesiedelt, in der "Programmierkunst". :D

cu
Narses
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 09.11.05 13:00 
Moin!

Ich stelle mal deine Fragen aus der PN öffentlich rein, damit andere auch was davon haben. :wink:
user profile iconjuKx hat folgendes geschrieben:
1. warum ne INI datei und keine normale datei?vorteil?

Gegenfrage: was ist eine "normale Datei"? :wink: Vorteil von INI-Dateien: wenig Kompatibilitätsprobleme und einfacher Zugriff durch die entsprechenden Methoden, Nachteil: langsam...

user profile iconjuKx hat folgendes geschrieben:
2. wieso hier count-1 ?? ( for i:=0 to ListView1.Items.Count-1 do)

Du hast ListView1.Items.Count Element, aber ab Index 0, also darf die Schleife nur bis .Count-1 laufen, da dass dann schon die Gesamtanzahl Element sind.

user profile iconjuKx hat folgendes geschrieben:
3. wie verbindet man 2 units?

Man kann Units nicht in dem Sinne "verbinden", du kannst dem Compiler lediglich sagen, dass du auf eine andere Unit zugreifen willst (Beispiel: in Unit1 steht hinter implementation: uses Unit2;, um die Methode RegisterHighscore() aus derselben benutzen zu können).

user profile iconjuKx hat folgendes geschrieben:
4. Nen gutes Ini Tutorial?finde ich richtig gut diesen dateientyp

Hast du hier schon mal in der Library oder auch im Forum gesucht? Ansonsten: INI-Dateien sind doch recht einfach zu benutzen, eine kleine "Einführung" hast du in meiner Version deines Projektes schon drin, Rest in der Hilfe nachlesen und selbst ein bischen probieren, fertig. :wink:

cu
Narses
juKx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45

WinXp Pro Sp2
Delphi 7 Enterprise Edition
BeitragVerfasst: Mi 09.11.05 23:52 
hi,

danke für deine guten antworten. Eine letzte frage noch..Ich habe ja jetzt in der INI die ganzen Highscores zu stehen. Es ist aber einfach in die Ini hineinzugehen und die zeiten nicht regulär zu verändern, also per Hand!?Wie kann ich soetwas verhindern? Passwort? Wenn ja wie?

gruß juKx
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 10.11.05 09:15 
Moin!

Neue Frage (Thema), neuer Thread! Ich antworte dir auch gerne da, sind hier aber die Forumsregeln. :wink:

cu
Narses