Wenn Du wirklich nicht mit Dateien arbeiten willst (ganz abgesehen davon empfehle ich Dir DRINGEND, Dich mit Dateien und deren Operationen auseinanderzusetzen ...), kannst Du es auch mit Einträgen in die Windows-Registrierung vornehmen, wenn Du willst.
Dazu kann Dir sicher die Delphi-Hilfe weiterhelfen ...
Probiere es doch einfach auf folgende Art und Weise:
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: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170:
| unit HiScore;
interface
uses SysUtils; // meistens bereits automatisch in das Projekt eingebunden
const MAX_NAMEN = 20; // wieviele Namen Du max. in der HighScore aufnehmen lassen willst...
type TName = String[ 30 ]; // für einen einfachen Eintrag in der HighScore brauchen wir keinen // String, der 255 Zeichen Speicherplatz verschlingt. // ein null-terminierter String kommt auch nicht in Frage, da er nicht // in eine typisierte Datei geschrieben werden kann.
TEintrag = record Name : TName; Punkte : Word; end;
THighScore = object // globale Variablen Liste : ARRAY[ 0..MAX_NAMEN ] of TEintrag;
// interne Variablen Max_Eintrag : Byte;
constructor New; destructor Done;
procedure Hinzufuegen( _name : TName; _punkte : Word ); procedure Sortieren; procedure WriteToFile( _dateiname : String ); procedure ReadFromFile( _dateiname : String ); end;
var HighScore : THighScore;
implementation
constructor THighScore.New; begin Max_Eintrag := 0; end;
destructor THighScore.Done; begin // ...dasselbe gilt auch für den Destructor end;
procedure THighScore.Hinzufuegen( _name : TName; _punkte : Word ); var min_punkte : Word; max_punkte : Word; j : Byte; merker : Byte; begin if (Max_Eintrag < MAX_NAMEN) then begin // Sehr schön! Wir können den Namen einfach hinzufügen! // (Die HighScore ist noch nicht voll!) Inc( Max_Eintrag ); Liste[ Max_Eintrag ].Name := _name; Liste[ Max_Eintrag ].Punkte := _punkte; end else begin // Bei diesem Fall müssen wir den Eintrag mit der niedrigsten Punkte- // zahl rauswerfen und den neuen Eintrag hinzufügen ... merker := 0; min_punkte := 65535; for j := 0 to MAX_NAMEN do begin if (Liste[ j ].Punkte < min_punkte) then begin merker := j; min_punkte := Liste[ j ].Punkte; end; end; Liste[ merker ].Name := _name; Liste[ merker ].Punkte := _punkte; end; end;
procedure THighScore.Sortieren; var j : Byte; i : Byte; temp: TEintrag; begin for j := 0 to MAX_NAMEN do begin for i := 0 to MAX_NAMEN do begin if (Liste[ i ].Punkte > Liste[ j ].Punkte) then begin // Elemente vertauschen ... funktioniert nur über Dreieck ... temp.Name := Liste[ j ].Name; temp.Punkte := Liste[ j ].Punkte; Liste[ j ].Name := Liste[ i ].Name; Liste[ j ].Punkte:= Liste[ i ].Punkte; Liste[ i ].Name := temp.Name; Liste[ i ].Punkte:= temp.Punkte; end; end; end; end;
procedure THighScore.WriteToFile( _dateiname : String ); var f : TextFile; j : Byte; s : String; begin AssignFile( f, _dateiname ); Rewrite( f ); Writeln( f, 'HI-SCORE' ); for j := 0 to Max_Eintrag do begin Writeln( f, Liste[j].Name ); Str( Liste[j].Punkte, s ); Writeln( f, s ); end; Writeln( f, '%&/()' ); CloseFile( f ); end;
procedure THighScore.ReadFromFile( _dateiname : String ); var f : TextFile; s : String; punkte_s : String; punkte_i : Word; Ende : Boolean; begin AssignFile( f, _dateiname ); if (not FileExists( f )) then begin // Fehlermeldung ausgeben, Programm abbrechen oder was auch immer exit; end; Reset( f ); Readln( f, s ); if (s='HI-SCORE') then begin Ende := False; while ((not Eof( f )) and (not Ende)) do begin Readln( f, s ); if ( s = '%&/()' ) then Ende:=True; Readln( f, punkte_s ); if ( punkte_s = '%&/()' ) then Ende:=True; if ( Ende = False ) then begin punkte_i := StrToInt( punkte_s ); // wo diese Funktion zu finden ist, schlägst Du am besten in der Delphi-Hilfe nach ... Hinzufuegen( s, punkte_i ); end; end; CloseFile( f ); end else begin CloseFile( f ); end; end; |
Das wäre die Unit, die wir benötigen würden. Eingebunden in unser Programm sähe das dann so aus ...
Laden der Liste
Quelltext
1:
| HighScore.ReadFromFile( {irgendein Dateiname} ); |
Hinzufügen eines neuen Eintrags
Quelltext
1:
| HighScore.Hinzufuegen( {Name}, {Punktezahl} ); |
High-Score ausgeben
Quelltext
1: 2:
| HighScore.Sortieren; // in For-schleife zeichnen oder wie immer Du das machen willst... |
Datei speichern (z.B. beim Beenden des Programms)
Quelltext
1:
| HighScore.WriteToFile( {irgendein Dateiname} ); |
Also dann, ich hoffe, ich konnte Dir etwas helfen ...
P.S.: Ich weiß nicht, ob das Programm funktioniert, ich habe es nicht ausprobiert, sondern hier "on-the-fly" geschrieben ... es werden sich sicherlich ein paar Fehler eingeschlichen haben, aber im Großen und Ganzen müsste es doch laufen ... *gg*
Yours,
Indeterminatus.