Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Speichern


Zlatan - Di 22.02.11 17:34
Titel: Speichern
Nehmen wir an ich habe ein spiel mit mehreren leveln (jedes Level hat eigene form)
Ich wollte einen button erstellen, dass man nach level 5 abspeichern kann
dass heißt wenn ich morgen das programm starten würde, würde ich mit level 6 anfangen.

Geht das und Wie?


Xion - Di 22.02.11 17:41

Du kannst z.B. Level=6 speichern. Wenn du das lädst, dann weißt du, dass 6 der nächste Level wäre.

Dazu musst du ne Datei anlegen. Entweder ne TIniFile z.B, oder per AssignFile


ALF - Di 22.02.11 17:47

Oder Du Speicherst automatisch wenn der Level 5 geschafft ist. So wie es viele andere Spiele auch machen :wink: Diese Info packst Du, wie user profile iconXion schon geschrieben hat in eine Datei.

Gruss Alf


Zlatan - Di 22.02.11 17:48

Tut mir wirklich leid aber das kapier ich jetzt nicht :?:


Xion - Di 22.02.11 17:52

Es gibt keine Funktion "Speichern" in Delphi. Ich glaub dir ist das unklar, weil du gar nicht weißt, was speichern eigentlich heißt ;)

Was du willst ist ein Arbeitsspeicher-Abbild, so das beim nächsten Start das Programm exakt so startet, wie es beenden wurde. Das ist wohl eher nicht so sinnvoll (dann würde ja jede Word Datei das komplette Word-Programm enthalten).

Du musst also was Speichern, damit dein Programm sich selbst wieder richtig konfigurieren kann. Dafür reicht es ja, dass du sagst, welche Form angezeigt wurde z.B. Diese zeigst du dann wieder an, wenn man das Programm startet. Und das musst du in eine Datei reinschreiben (von Hand).

Tutorial zu TIniFile: http://www.kuknet.de/tutorial1.pdf


ALF - Di 22.02.11 18:04

user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
....Und das musst du in eine Datei reinschreiben (von Hand).
:rofl:
Wolln mal so nicht sein.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
   PIni: TIniFile;
begin       //schreiben der Ini
    Pini:= TIniFile.Create(Pfad und name der ini);
    try
       Pini.WriteInteger('Spiel''Level', Level);
    finally
       Pini.Free;
    end;
end;
////
var
   PIni: TIniFile;
begin       //lesen der  Ini
    Pini:= TIniFile.Create(Pfad und name der ini);
    try
       level:= Pini.ReadInteger('Spiel''Level''');
    finally
       Pini.Free;
    end;
end;
als Beispiel!
Hoffe Du kannst damit was anfangen :wink:

Gruss ALf


KleinesPferd - Mi 23.02.11 16:07

ALFs Vorschlag ist einer der elegantereren ;)

Eine anschaulicherere Alternative wäre ein TMemo einzubinden. Dessen Inhalt kannst du mit memo1.lines.safotofile("Dateiname.txt") speichern und genauso mit loadfromfile("Dateiname") wieder laden.

Wenn du nun ein Level erfolgreich fertig hast, machst du

Delphi-Quelltext
1:
2:
3:
memo1.clear; //leert den text im memo
memo1.lines.add("4"); //fürs fertige 4. Level 
memo1.lines.safetofile("Dateiname.txt");

Zum auslesen machst du einfach beim Form1.onshow ->


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if fileexists("Dateiname") then
begin
memo1.lines.loadfromfile("Dateiname");
if memo1.lines.count>0 then 
try
level:=strtoint(memo1.lines[0]);
except
level:=0;
end;



Bei ALFs Source würde ich in Zeile 17 level:= Pini.ReadInteger('Spiel', 'Level', '0'); eintragen. Somit hat die Variable level immer einen definierten Wert.

Desweiteren solltest du Aufpassen, ich GLAUBE unter Vista und W7 hat man als normaler User keine Schreibrechte im Ordner Dokumente und Einstellungen, sowie im Ordner Programme oder Windows... So als Hinweis wo du die Datei denn nun speichern magst.

Grüße


Narses - Mi 23.02.11 16:14

Moin!

user profile iconKleinesPferd hat folgendes geschrieben Zum zitierten Posting springen:
Eine anschaulicherere Alternative wäre ein TMemo einzubinden.
Das mag zwar anschaulich sein, aber wenig zu empfehlen. Damit missbrauchst du eine visuelle Komponente für die Datenhaltung. :? Das Gleiche erreicht man auch mit z.B. einer TStringList, aber ohne den Overhead der GUI-Kompo. :idea:

cu
Narses


KleinesPferd - Mi 23.02.11 19:13

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Das ist vollkommen Richtig. Deswegen habe ich auch ALFs Vorschlag präferiert.
Und eine reine TStringList auch auch nicht sehr anschaulich.

Und wenn es um das Programm geht, wo die Maus kleine Gänge langeschoben wird, und eine Kollisionsabfrage anhand von Panels gemacht werden, oder Buttons, da spielt der Overhead auch nimmer eine große Rolle.

Sauber ist es nicht, schön auch nicht. Aber seeeeehr anschaulich :lol:

Grüße


gnomecoder - Mi 23.02.11 21:13

du könntest auch über eine Verschlüsslung nachdenken. Kann ja auch ganz simpel sein.
Wenn da eine ini datei mit dem inhalt Level=10 zb. liegt, könnte man leicht schummeln.

nur so als tipp ;)


Zlatan - Mi 23.02.11 21:40

Ist schon gut habe eine andere möglichkeit gefunden ohne eine datei zu erstellen :)