Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Beste Speicherart ? (https://www.delphipraxis.net/39085-beste-speicherart.html)

PierreB 28. Jan 2005 14:02


Beste Speicherart ?
 
Moin :hi: ,

ich beschäftige mich gerade damit eine gute Möglichkeit zur Speicherung von Spielständen (für mein Spiel EliteHacker *Klick*).Ich hab schon ein bissl in der DP gesucht und bin dabei auf *.ini, *.txt-Dateien, usw. gestoßen.

Jetzt meine Frage: Welche ist die beste (und einfachste) Möglichkeit Spielstände zu speichern ?


Vielen Dank,

freak4fun 28. Jan 2005 14:04

Re: Beste Speicherart ?
 
Ich würde sagen das hängt davon ab was und wieviel du speichern willst. :gruebel:

MfG
fR34k

PierreB 28. Jan 2005 14:07

Re: Beste Speicherart ?
 
Eigentlich nur einen kurzen String, indem dann ein Code steht den mein Spiel zum Laden eines Levels braucht.

Elite 28. Jan 2005 14:08

Re: Beste Speicherart ?
 
Ich stehe in der Hinsicht auf Streams. Kannst einfach wie in eine Riesenbockwurst alles an Material reindrücken, unabhängig von Variablentypen etc. und es dann dann beim Lesen schön der Reihe nach wieder rausziehen.

freak4fun 28. Jan 2005 14:09

Re: Beste Speicherart ?
 
Ich denke da reicht eine einfache textdatei. Allerdings weiß ich nicht ob du ihn im Klartext in der Textdatei stahen haben willst. Da musst du dann auch noch eine Lösung finden. :zwinker:


MfG
fR34k

PierreB 28. Jan 2005 14:12

Re: Beste Speicherart ?
 
Zitat:

Zitat von freak4fun
Ich denke da reicht eine einfache textdatei. Allerdings weiß ich nicht ob du ihn im Klartext in der Textdatei stahen haben willst. Da musst du dann auch noch eine Lösung finden. :zwinker:

Nein, den Code werde ich noch irgendwie verschlüsseln, sonst würden diese ganze Cheater ja einfach die Datei editieren. :warn: :mrgreen:

Was ist denn eigentlich der Unterschied zw. ini- und txt-Dateien ??

Maximus 28. Jan 2005 14:17

Re: Beste Speicherart ?
 
.ini hat einen strukturierten aufbau

Code:
[PersonA]
Name=Max Mustermann
Alter=89
[PersonB]
Name=Hans Mustermann
Alter=2
Man kann dem Programm jetzt sagen: "Lese mir das Alter von PersonA aus" und man bekommt "89" zurückgeliefert

Bei Textdateien muss man eben selber parsen :P

Zur Verschlüsselungen, schau mal hier in der CodeLib da müsste negaH mal eine sichere 1024 (oder wars 2048?) Bit Verschlüsselung gepostet haben!

MFG
Maximus

maximov 28. Jan 2005 14:32

Re: Beste Speicherart ?
 
Zitat:

..Nein, den Code werde ich noch irgendwie verschlüsseln, sonst würden diese ganze Cheater ja einfach die Datei editieren. :warn: :mrgreen:
...
da haben wir was von unserem negaH-Guru -> http://www.delphipraxis.net/internal...ct.php?t=30830 - sehr praktisch und relativ sicher, für deine zwecke allemal.

DelphiFreund 28. Jan 2005 14:38

Re: Beste Speicherart ?
 
Hi,
ich bin auch Elites Meinung, an Streams ist das Gute, dass sie wenig Festplatte benötigen, und die Daten leicht dynamisch angeordnet werden können, das wäre bei .txt oder .ini Dateien schwieriger zu lösen, und sie für unwissende Computerspieler unkenntlich zu machen, dürfte auch kein Problem sein (Zahlen vertauschen, oder Werte doppelt speichern, etc).


Gruß DelphiFreund


//Edit1: Immer diese Tippfehler!

Thorben86 28. Jan 2005 14:53

Re: Beste Speicherart ?
 
Naja, dann müsstest du es schaffen, dass deine Daten im arbeitspeicher liegen bleiben und zwar nach dem neustart des Programms /Computers so Positioniert, dass du sie direkt wieder einlesen könntest. :)
Ne mal im ernst, die Stream müsstest du ja auch irgendwo speichern. (also warscheinlich in ner txt) :warn:

Thorben

maximov 28. Jan 2005 15:00

Re: Beste Speicherart ?
 
Zitat:

Zitat von Thorben86
...Ne mal im ernst, die Stream müsstest du ja auch irgendwo speichern. (also warscheinlich in ner txt) :warn:

Thorben

Warum? Gerade wenn man es verschlüsselt, macht txt doch keinen sinn mehr. Text macht nur sinn, wenn man es lesen soll :wink:

DelphiFreund 28. Jan 2005 15:05

Re: Beste Speicherart ?
 
Wer kommt auf die Idee einen Stream in einer Textdatei zu speichern, die Endung spielt ja eigentlich keine Rolle, aber ein Stream ist kein Text, du könntest eine Zahl, die du nicht als String im Stream speicherst garnicht als Textdatei lesen.

Gruß DelphiFreund

PierreB 28. Jan 2005 16:26

Re: Beste Speicherart ?
 
Also erstmal vielen Dank für eure Antworten.
ich versuche das jetzt mal mit ner *.txt Datei zu realisieren.

Zitat:

und sie für unwissende Computerspieler unkenntlich zu machen, dürfte auch kein Problem sein
Dann nehm ich für die unwissenden User halt als Dateinamen 'KEINESFALLS ÖFFNEN'. :mrgreen:

jfheins 28. Jan 2005 16:28

Re: Beste Speicherart ?
 
Du könntest die Daten auch hinten an die Exe dranhängen ...

PierreB 28. Jan 2005 16:31

Re: Beste Speicherart ?
 
Zitat:

Du könntest die Daten auch hinten an die Exe dranhängen ...
:shock: Wie geht das denn ??
Das hört sich jedenfalls ziemlich kompliziert an und ich glaube für mein kleines, billiges Spiel reichen Textfiles. ;)

jfheins 28. Jan 2005 16:32

Re: Beste Speicherart ?
 
http://www.swissdelphicenter.ch/de/showcode.php?id=815

Ich weis aber nicht, ob's auch geht, wenn die exe ausgeführt wird ...

Jens Schumann 28. Jan 2005 16:43

Re: Beste Speicherart ?
 
Zitat:

Zitat von delphman
Zitat:

Du könntest die Daten auch hinten an die Exe dranhängen ...
:shock: Wie geht das denn ??
Das hört sich jedenfalls ziemlich kompliziert an und ich glaube für mein kleines, billiges Spiel reichen Textfiles. ;)

Das ist ganz einfach. Anstatt .txt im Dateinamen verwendest Du .exe :cyclops:

P.S. Die Dateiendung bestimmt nicht das Dateiformat

DelphiFreund 28. Jan 2005 16:47

Re: Beste Speicherart ?
 
Die beste und bei den meisten Spielen verwendete Methode ist nach wie vor das Speichern in einfachen Hex-Dateien via Streams.


Gruß DelphiFreund

PierreB 28. Jan 2005 16:53

Re: Beste Speicherart ?
 
So, mit Textfiles das Speichern hab ich jetzt soweit.
Funktioniert ganz gut soweit.

Also gut, DelphiFreund, da ich von Streams keine Ahnung habe, hast du mal ein kleines Beispiel ?

Jens Schumann 28. Jan 2005 16:53

Re: Beste Speicherart ?
 
Zitat:

Zitat von DelphiFreund
Die beste und bei den meisten Spielen verwendete Methode ist nach wie vor das Speichern in einfachen Hex-Dateien via Streams.
Gruß DelphiFreund

Dafür müsste delpman aber wissen, wie man einen String in einen Stream schreibt und aus einem Stream liest.
Hier mal ein TFileStream Nachfahre der einen String schreiben und lesen kann.
Delphi-Quellcode:
  TFileStreamExt = class(TFilestream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;

{ TFileStreamExt }

procedure TFileStreamExt.WriteStringToStream(aStr : String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;

function TFileStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;
Ach ja - Die Methoden lesen und schreiben natürlich immer ab der aktuellen Position

DelphiFreund 28. Jan 2005 17:03

Re: Beste Speicherart ?
 
Jens hat schon ein Beispiel gegeben, aber hier ein Einfaches zum verstehen:

Delphi-Quellcode:
procedure WriteSave(SavePath, PlayerName: String; LevelStatus: Byte; Money: Integer);
var
  Stream: TFileStream;
begin
  Stream:= TFileStream.Create(SavePath, fmCreate);
  Stream.WriteBuffer(PlayerName, SizeOf(PlayerName));
  Stream.WriteBuffer(LevelStatus, 1));
  Stream.WriteBuffer(Money, 4));
  Stream.Free;
end;
Das ist nur ein einfaches Beispiel, wenn beispielsweise eine Variable Länge des Namens, müsste beispielsweise ein Header geschrieben werden. Ich habe das ohne Delphi geschrieben, da ich es nicht installiert habe, deshalb könnte ein Fehler drinn sein.

Elite 28. Jan 2005 17:03

Re: Beste Speicherart ?
 
Ich kann dir nur dieses Tutorial ans Herz legen. Damit hast du blitzschnell begriffen, wie du Streams für deine Anwendungen benutzen kannst und das beste ist: Alles ist wesentlich einfacher als du dir momentan vorstellst. In Wahrheit kann man nämlich schon mit 2 Zeilen einfachem Code solch einen ominösen Stream erzeugen und darin einen Integer o.Ä. speichern.
Schnuper mal rein!

Jens Schumann 28. Jan 2005 17:31

Re: Beste Speicherart ?
 
Hallo,
dann darf natürlich auch die dpcollection.pas nicht fehlen. Damit könnt Ihr n-dimensionale Datenstrukturen speichern. Das coole ist, dass Bitmaps, Stringlisten, Strings, Integer, Float's usw einfach so gespeichert werden. Ohne weiteres zutun Eurer seits.

MiniKeks 28. Jan 2005 17:32

Re: Beste Speicherart ?
 
Machs wie ich mit einer einfachen Blowfish verschlüsselung (128). Das geht Blitzschnell und ist sicher. Den Public Key bauste einfach in die exe ein. Wenn du willst helfe ich dir dabei!

Meld dich einfach!

mfg MiniKeks,
Nieberle Software Solutions Admin

malo 28. Jan 2005 18:27

Re: Beste Speicherart ?
 
Für kurze Strings würd ich mit der Registry arbeiten. Wobei du da aufpassen musst, dass du alles in HKEY_Current_User schreibst, weil du sonst nicht ohne Adminrechte drauf zugreifen kannst ;)

Jens Schumann 28. Jan 2005 18:30

Re: Beste Speicherart ?
 
Zitat:

Zitat von malo
Für kurze Strings würd ich mit der Registry arbeiten. Wobei du da aufpassen musst, dass du alles in HKEY_Current_User schreibst, weil du sonst nicht ohne Adminrechte drauf zugreifen kannst ;)

:shock: :shock: :shock: Bitte nicht - auf gar keinen Fall die Registry verwenden um anwendungspezifische Daten zu speichern. Da steht schon genug "Müll" drin.

arbu man 28. Jan 2005 18:31

Re: Beste Speicherart ?
 
Zitat:

So, mit Textfiles das Speichern hab ich jetzt soweit.
Funktioniert ganz gut soweit.
Dann verschlüssel es doch einfach mit XOR

Ich glaub bei Delphi-Source.de gibt es en Quellcode um dateien zu verschlüsseln

edosoft 28. Jan 2005 18:58

Re: Beste Speicherart ?
 
es geht so:

Delphi-Quellcode:
FS{tfilestream} := TFileStream.Create(FileName{string, name unter welchem die datei geschbeichert werden soll}, fmCreate);

    //Text(string) speichern
    Buffer{string} := "text";
    FS.Write(Buffer[1], SizeOf(Buffer));

    //Zahl(integer) speichern
    //Tipp: ein integer verbraucht 4 bytes speicherplatz, wird also auf diese weise mit lediglich 4 byte speicherverbrauch gespeichert und ist mit notepad&co nicht darstellbar, schon das sürfte solche total-noobs abschrecken ;)
    BufferI{Integer} := 123;
    FS.Write(BufferI, SizeOf(Integer));

//text der variabel lang ist kann z.b. so gespeichert werde:
    Buffer := "Hallo. Dies ist ein Text, er kann beliebig lang sein.";
    {er kann natürlich net beliebig lang sein, nur 4 gigabyte groß!! ansonsten muss unten statt Integer Int64 verwendet werden, dann braucht das ganze ding mehr speicherplatz! und delphi hat glaubich auch ne maximallänge für strings oder?}
    BufferSize{Integer, wenn Buffer>4gb dann Int64} := Length(Buffer);
    FS.Write(BufferSize, SizeOf(Integer{/Int64}));
    FS.Write(Buffer[1], BufferSize);
//hier werden also zuerst in 4 bytes die länge des strings gespeichert und dann kann er spöäter nach bedarf ausgelesen werden.
//Diese methode braucht keinen Terminator und ich finds besser weil man _alle_ buchstaben speichern kann und nicht einen escapestring oder so hat.

//datei schließen
FS.Free;


////datei lesen
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);

{buffer: struing}
{buffersize: integer}

//in der datei "rumspulen" - geht auch beim schreiben;)
FS.Seek(0, soFromBeginning); //an anfang der datei
FS.Seek(0, soFromEnd); //ans ende der datei
FS.Seek(8, soFromCurrent); //8 buchstaben weiter
FS.Seek(-3, soFromEnd); //3 buchstaben vorm ende
FS.Seek(-12, soFromCurrent); //12 buchsteben zurück

//string lesen
SetLength(Buffer, 5{wie lang ist der string?});
FS.Read(Buffer[1], 5{wie lang ist der string?});

//integer lesen
FS.Read(BufferI, SizeOf(Integer));

//lies die konstrkution von vorher wieder aus, also zuerst 4 bytes längenindikator, dann den string selber
    FS.Read(BufferSize{<-so lang ist der string}, SizeOf(Integer));
    SetLength(Buffer, BufferSize); //buffer mit #0's füllen
    FS.Read(Buffer[1], BufferSize); //buffer auslesen
//wenn man vorher In64 genommen hat muss man hier natürlich auch Int64 einsetzen!

fs.free;

//wenn man z.b. inner datei unbekannt viele integers speichert kann mans ja so machen alle auszulesen:
while FS.Position < FS.Size do
  FS.Read(BufferI, SizeOf(Integer));
  //mach was mit bufferI
end;
Also: wenn man 5 buchstaben liest oder schreibt(.Write/.Read) dann spults in der datei automatisch 5 buchstaben weiter, man braucht nicht immer mit .Seek rumspulen.

Tipp: dauerndes rumspulen mahcts programm langsam!!

Tipp2: nemht den TMemoryStream statt den Filestream(ist genau gleich, nur dass kein dateiname angegeben werden muss)->bedienung genau gleich aber alles wird statt inner datei nur im RAM gespeichert.
Es gibt ja auch noch den TZipStream(oder so ähnlich) der speichert alles glaub wie der memory stream im ram bloß er verpackts gleich mit ZIP ;)
-Dominik


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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