Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Auslesen .ini (https://www.delphipraxis.net/178064-auslesen-ini.html)

MoBe13 15. Dez 2013 11:43

Auslesen .ini
 
Hallo alle miteinander,
ich hoffe ich bin in der richtigen Kategorie gelandet! Ich versuche seit einigen Tagen in ein Unterrichtsprojekt eine Speicherfunktion einzubauen. Das ganze wird ein Spiel und das Speichern in einer Inidatei funktioniert auch spitze. Ich habe nur ein Problem mit dem Reinladen der Daten. Es wird keine Fehlermeldung ausgegeben allerdings werden die Werte nicht für das Programm übernommen.
Hier Ausschnitte aus dem Code:

Die Funktion zum Laden der Elemente:
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
begin
filename := ExtractFilePath(ParamStr(0)) + 'Gesamt.ini';
ini := TIniFile.Create(filename);

eost := ini.ReadFloat('ost', 'eost', eost);
xost := ini.ReadFloat('ost', 'xost', xost);

ini.Free;

if xost > 0 then tost1.Interval:=5000;
if xost > 0 then tost1.Enabled:= true;

timer1.Interval:=1000;
timer1.Enabled := true;
timer2.Interval:=5000;
timer2.Enabled := true;
end;
Dort sollen die Werte verwendet werden:

Delphi-Quellcode:
procedure TForm1.sostClick(Sender: TObject);
begin
if g<50
then ShowMessage('Sie haben zu wenige Geld.');
if g>=50
then g:= g-50;
xost:= xost+1;
tost1.Interval:=5000;
tost1.Enabled:= true;
end;
Ich hoffe ihr könnt mir helfen! Danke.

Sir Rufo 15. Dez 2013 12:23

AW: Auslesen .ini
 
Wenn man den Quellcode mal formatiert, dann fällt folgendes auf:
Delphi-Quellcode:
procedure TForm1.sostClick(Sender: TObject);
begin
  if g < 50
  then
    ShowMessage('Sie haben zu wenige Geld.');

  if g >= 50
  then
    g := g - 50;

  // Der Rest hier wird immer ausgeführt, egal ob genug Geld da war oder nicht
  // Soll das so sein?

  xost := xost + 1;
  tost1.Interval := 5000;
  tost1.Enabled := true;
end;
Kann ich mir ja nicht vorstellen.

Vorstellen kann mich mir aber eher, dass diese Codezeilen, des Öfteren bei dir auftauchen (wobei der Wert 50 wohl eher variiert)
Delphi-Quellcode:
  if g < 50
  then
    ShowMessage('Sie haben zu wenige Geld.');

  if g >= 50
  then
    g := g - 50;
Warum dann nicht eine Methode, die die Kosten automatisch abzieht und das Resultat als Boolean zurückliefert.
Es wäre auch schön, wenn die Variable einen sprechenden Namen bekommen würde.
Delphi-Quellcode:
g
ist wenig aussagekräftig.
Delphi-Quellcode:
Geld
würde da schon eher passen. Ist aber Kosmetik, die nicht die Funktion aber die Pflege des Programms beeinträchtigt.
Delphi-Quellcode:
function TForm1.ErfolgreicheZahlung( const Kosten : Integer ) : Boolean;
begin
  Result := ( g >= Kosten );
  if Result
  then
    begin
      g := g - Kosten;
    end
  else
    begin
      ShowMessage( 'Sie haben zu wenig Geld' );
    end;
end;

procedure TForm1.sostClick(Sender: TObject);
begin
  if ErfolgreicheZahlung( 50 )
  then
    begin
      xost := xost + 1;
      tost1.Interval := 5000;
      tost1.Enabled := true;
    end;
end;
alternativ geht dann auch (wahrscheinlich sogar übersichtlicher)
Delphi-Quellcode:
procedure TForm1.sostClick(Sender: TObject);
begin
  if not ErfolgreicheZahlung( 50 )
  then
    Exit; // Die Methode wird einfach verlassen

  xost := xost + 1;
  tost1.Interval := 5000;
  tost1.Enabled := true;
end;
Auch dieses Konstrukt ist eher unüblich (obwohl nicht wirklich falsch)
Delphi-Quellcode:
if xost > 0 then tost1.Interval:=5000;
if xost > 0 then tost1.Enabled:= true;
Besser
Delphi-Quellcode:
if xost > 0 
then
  begin
    tost1.Interval := 5000;
    tost1.Enabled := true;
  end;
Warum er aus deiner Ini-Datei nichts ausliest, können wir aber nicht sagen, weil wir nicht sehen wie du in diese Datei speicherst bzw. nicht den Inhalt der Datei kennen.

Eventuell liest du aus der falschen Datei, die falsche Section, den falschen Wert aus ...

MoBe13 15. Dez 2013 12:52

AW: Auslesen .ini
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank!
Ich vermute ein Experte würde einen Schreikrampf bei meinem Quelltext bekommen ;)
Wie deklariere ich die Funktion richtig und wo?

Und zu meiner Ausgangsfrage:
Delphi-Quellcode:
procedure TForm1.Button7Click(Sender: TObject);
begin
  filename := ExtractFilePath(ParamStr(0)) + 'Spielstand.ini';
  ini := TIniFile.Create(filename);
  ini.WriteInteger('Geld', 'g', g);
  ini.WriteFloat('ost', 'eost', eost);
  ini.WriteFloat('ost', 'xost', xost);
  ini.Free;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
if z = 0 then ComboBox2.Items.Delete(0);
if zi = 0 then ComboBox2.Items.Delete(2);
end;

himitsu 15. Dez 2013 13:09

AW: Auslesen .ini
 
Tipp: Schau dir mal die Dateinamen an, in deiner Speichern- und Laden-Funktion.

Mach dir besser eine Konstante mit dem Namen, dann hast du überall das Gleiche.



Und warum sind alle Variablen global, bzw. wo sind diese deklariert?

z.B.
Delphi-Quellcode:
ini
und
Delphi-Quellcode:
filename
, welche ja nur in den Funktionen verwendet werden, also gehören Diese auch lokal in die jeweiligen Funktionen rein :!:

MoBe13 15. Dez 2013 13:13

AW: Auslesen .ini
 
Ok die function hab ich deklariert bekommen! Hatte es an der falschen Stelle.

MoBe13 15. Dez 2013 13:16

AW: Auslesen .ini
 
Ok das hab ich nicht gesehen! Vielen Danke euch beiden! Jetzt geht alles!


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