Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Variable aus Stringlist laden (https://www.delphipraxis.net/140539-variable-aus-stringlist-laden.html)

Delphi-Narr 20. Sep 2009 11:03


Variable aus Stringlist laden
 
Moin, ich habe ein kleines Spiel programmiert. Es arbeitet hauptsächlich mit Variblen, die je nach Aktion gesetzt werden.
Jetzt wird Variable1 während des Spiels auf 100 gesetzt, Variable2 auf 10. Wenn man dann keine Lust mehr hat, kann man auf speichern klicken und die Variablen werden in einer Stringlist gespeichert:

Delphi-Quellcode:
procedure TForm1.SaveClick(Sender: TObject);

 var Save: TStringList;
begin
  Save:=TStringList.Create;

  try
    Save.Add(FloatToStr(Variable1));
    Save.Add(FloatToStr(Variable2));
    Save.SaveToFile(...\Save.txt');
  finally
    Save.free;
  end;
end;
Bis dahin klappt das auch sehr gut...

Beim nächsten Programmstart wird dann gesucht, ob die Datei ...\Save.txt vorhanden ist. Wenn ja, dann wird die Prozedur VariablenLaden aufgerufen.

Delphi-Quellcode:
  if FileExists('...\Save.txt')
  then VariablenLaden else VariablenNeu;
VariablenNeu wird also nur beim ersten Start aufgerufen und die Variablen werden am Anfang auf Standardwerte gesetzt.
VariablenLaden soll die in der Stringlist gespeicherten Variablen 1 und 2 laden. Da weiß ich jetzt nicht weiter.

In meiner .Txt steht jetzt:

100
10

__________
Doch ich weiß nicht, wie ich jetzt die Variable1 auf die erste Zeile setzten kann, die Variable2 auf die zweite Zeile.
Die Variablen sind : real, ich möchte jedoch auch einen ganzen Text einer String-Variablen in der gleichen Datei speichern.

Was muss ich tun???
Liebe Grüße!

DeddyH 20. Sep 2009 11:09

Re: Variable aus Stringlist laden
 
Wenn das Speichern mit
Zitat:

Delphi-Quellcode:
Save.Add(FloatToStr(Variable1));

geschieht, muss das Laden äquivalent mit
Delphi-Quellcode:
Variable1 := StrToFloat(Save[0]);
geschehen. Dabei musst Du aber unbedingt die gleiche Reihenfolge wie beim Speichern einhalten. Eine Alternative dazu wäre TIniFile, dabei kannst Du ohne Berücksichtigung der Reihenfolge speichern/laden, da sich der Wert über Abschnitt und Bezeichnung zuordnen lässt.

Delphi-Narr 20. Sep 2009 11:18

Re: Variable aus Stringlist laden
 
Ah, danke.
:thumb:
Ich hatte es mit runden Klammern und (1) wegen Zeile 1 versucht.

Delphi-Quellcode:
procedure TForm1.VariablenLaden;
 var Save: TStringList;
begin
  Save:=TStringList.Create;
  try
    Variable1:=StrToFloat(Save[1]);
  finally
    Save.free;
  end;

end;
Wenn ich das so mache, sagt er mir:

EStringListError: Index der Liste überschreitet das Maximum(0)

Ich muss ja auch noch diese TStringList auf ...\Save.txt setzten, wie?
:?: :?: :?:

fwsp 20. Sep 2009 11:22

Re: Variable aus Stringlist laden
 
Delphi-Quellcode:
Save.LoadFromFile(...\Save.txt');

Delphi-Narr 20. Sep 2009 11:27

Re: Variable aus Stringlist laden
 
Hm, bis gerade hatte er mir gesagt:

undefinierter Bezeichner: LoadFromFile, aber jetzt klappt es - fast...

Exception der KlasseEAccessViolation ... Zugriffsverletzung bei Adresse XYZ

DeddyH 20. Sep 2009 11:29

Re: Variable aus Stringlist laden
 
Zeig mal Deinen ganzen Code zum Laden.

jaenicke 20. Sep 2009 11:45

Re: Variable aus Stringlist laden
 
Geh doch einmal zeilenweise durch und schau nach in welcher Zeile der Fehler überhaupt auftritt.
Vermutungen:
1. Da du gar nicht genau festlegst in welchem Verzeichnis gespeichert wird, kannst du auch nicht wissen, ob du die irgendwo zufällig gespeicherte Datei auch beim Laden wieder triffst.
http://www.delphi-library.de/viewtopic.php?p=499701
2. Das Objekt ist nicht erzeugt, aber in dem bisher geposteten Quelltext ist das ja der Fall.
3. Die Zeile existiert in der Datei nicht.

Delphi-Narr 20. Sep 2009 12:16

Re: Variable aus Stringlist laden
 
Das ... bei ...\Save.txt stellt nur den vorherigen Pfad dar. Ich hab den schon korrekt eingegeben.
Die Datei existiert auch, da ich schon gespeichert habe.
Inhalt:

80
10

Diese Schreibblockade hängt nicht zufälligerweise mit Vista zusammen???

Delphi-Narr 20. Sep 2009 12:19

Re: Variable aus Stringlist laden
 
Ganzer Code:

Delphi-Quellcode:
unit StarTrek;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Gefechtsmodus: TButton;
    Label1: TLabel;
    Sensorscan: TButton;
    Maschinenraum: TButton;
    Kurseingabe: TButton;
    Sicherheit: TButton;
    Quartier: TButton;
    Sperren: TButton;
    Schliessen: TButton;
    Label2: TLabel;
    AktuellerKurs: TLabel;
    Label3: TLabel;
    AktuellerZustand: TLabel;
    Label4: TLabel;
    AnzahlMechaniker: TLabel;
    Label5: TLabel;
    Save: TButton;
    procedure FormCreate(Sender: TObject);
    procedure SchliessenClick(Sender: TObject);
    procedure KurseingabeClick(Sender: TObject);
    procedure VariablenLaden;
    procedure SaveClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  rLeben1,
  rLeben2,
  rSchaden1,
  rSchaden2,
  rGeld,
  rZufall : real;
  sKurs : string;
  rMechaniker : real;
  rTorpedos : real;
  rTorpedos2 : real;

implementation

uses Kurseingabe1;

{$R *.DFM}

procedure TForm1.VariablenLaden;
 var Save: TStringList;
begin
  Save.LoadFromFile('E:\Informatik\Delphi\Delphi\StarTrekNeu\Saves\Save.txt');
  try
    rLeben1:=StrToFloat(Save[1]);
  finally
    Save.free;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     VariablenLaden;
     rMechaniker:=5;
     rGeld:=2500;
     sKurs:=('1,782 : 3,584 : 26,047');
     AktuellerKurs.caption:=sKurs;
     AnzahlMechaniker.Caption:=FloatToStr(rMechaniker);
     AktuellerZustand.Caption:=((FloatToStr(rLeben1))+'%');
end;

procedure TForm1.SchliessenClick(Sender: TObject);
begin
     showmessage('Hauptcomputerzugang über diese Konsole wird beendet...');
     sleep(3000);
     close;
end;

procedure TForm1.KurseingabeClick(Sender: TObject);
begin
     Form1.hide;
     Form5.show;
end;

procedure TForm1.SaveClick(Sender: TObject);

     var Save: TStringList;
begin
  Save:=TStringList.Create; //Objekt erzeugen

  try //try-finally hilft, das Objekt auch dann freizugeben, wenn ein Fehler auftritt
    Save.Add(FloatToStr(rLeben1)); //Text hinzufügen
    Save.Add(FloatToStr(rMechaniker));
    Save.SaveToFile('E:\Informatik\Delphi\Delphi\StarTrekNeu\Saves\Save.txt'); //Datei speichern
  finally
    Save.free; //Objekt wieder freigeben
  end;
end;

end.

Variable1 entspricht rLeben1
Variable2 entspricht rMechaniker

DeddyH 20. Sep 2009 12:21

Re: Variable aus Stringlist laden
 
Zitat:

Delphi-Quellcode:
procedure TForm1.SaveClick(Sender: TObject);

     var Save: TStringList;
begin
  Save:=TStringList.Create; //Objekt erzeugen

  try //try-finally hilft, das Objekt auch dann freizugeben, wenn ein Fehler auftritt
    Save.Add(FloatToStr(rLeben1)); //Text hinzufügen
    Save.Add(FloatToStr(rMechaniker));
    Save.SaveToFile('E:\Informatik\Delphi\Delphi\StarTrekNeu\Saves\Save.txt'); //Datei speichern
  finally
    Save.free; //Objekt wieder freigeben
  end;
end;

...

procedure TForm1.VariablenLaden;
var Save: TStringList;
begin
  Save.LoadFromFile('E:\Informatik\Delphi\Delphi\StarTrekNeu\Saves\Save.txt');
  try
    rLeben1:=StrToFloat(Save[1]);
  finally
    Save.free;
  end;

end;

Siehst Du den Unterschied (Tipp: erste Zeile nach dem begin)?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 1 von 2  1 2      

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