Autor Beitrag
LeXang
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 02.01.07 22:29 
Hallo,
ich komme total nicht mehr klar (liegt nicht an Silvester!)
bin ein ziemlicher Neuling bei Delphi.

habe eine Unit:

ausblenden volle Höhe Delphi-Quelltext
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:
private
        highscore      : Tstringlist;
        counterpoints  : Tstringlist
        stFile         : string;
        hitcounter     : Integer;

  privat //...
  procedure laden(pMode: string);

// ...
//wenn spielzeit um ist... Highscore saven falls größer als in textfile

if StrToInt(stFile) < hitcounter

   then
     begin
       counterpoints.add(IntToStr(hitcounter));
       counterpoints.SaveToFile(Textdatei);
     end;


//...

procedure TAnwendung.Laden(pMode: string);  //ist das richtig mit "string"???

 var i : integer;
begin
  Highscore := TStringlist.Create;
  Highscore.LoadFromFile('Bestenliste.txt');
  for i := 0 to Highscore.Count - 1
  do
      stFile := Highscore.Strings[i];       
end;




So siehts bei mir aus. Er compiliert das zwar mitlerweile aber wenn er dann speichern muss sagt er das "" kein gültiger Integerwert ist und stürtzt ab.

Es wäre nett wenn ihr mir konkret helfen könntet auch wenns totaler Anfängerkram ist. Danke!!!!

Gruß LeXanG // FrOhEs NeUeS
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Di 02.01.07 22:35 
Wahrscheinlich ist am Ende deiner Datei ein Zeilenumbruch, folglich ist die Letzte Zeile leer, auf die wird stFile dann gesetzt (die Schleife kannste dir sparen, übernommen wird sowieso nur der letzte Wert) und eine leere Zeichenkette ist nunmal keine Zahl :wink:

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 03.01.07 09:35 
Richtig, die Schleife in der Laden-Prozedur ist völlig unnütz, da hier I-mal die Variable STFILE einen anderen Wert zugewiesen bekommt, aber abstürzen sollte er da nicht. ;)
LeXang schreibt ja, dass es beim Speichern passiert. LeXang, gehe doch mal mit dem Debugger (Programm mit F7 starten statt über den grünen Pfeil) Zeile für Zeile durch und schau nach, an welcher Stelle genau der Absturz passiert. Vielleicht ist da irgendeine Variable nicht richtig initialisiert.
Ein Tipp noch: Gewöhne Dir an, in einem Block (Prozedur od. Methode) eine lokale Variable, die Du mit Create erstellst, auch mit Free am Schluss wieder freizugeben.

_________________
Es gibt keine Probleme - nur Lösungen!
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 03.01.07 09:50 
Ersetze mal Dein StrToInt durch ein TryStrToInt und gib als Defaultwert 0 oder so ein. StrToInt macht in der Tat solche Meldungen, wenn z.B. ein leerer String übergeben wird.

_________________
Es gibt keine Probleme - nur Lösungen!
LeXang Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 03.01.07 13:23 
Danke erstmal für die Antworten! bekomms leider immer noch net zum laufen...
zu jakobwenzel:
wenn du mit Datei die Textdatei meinst, da ist nur eine Zahl in der obersten Zeile und dahinter kommt auch kein absatz mehr...

zu Logikmensch:
habe es ein wenig umgeschrieben ich weiß nur noch net so ganz was du mit defaultwert meinst...

ausblenden volle Höhe Delphi-Quelltext
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:
type
   TAnwendung = CLASS
private
        highscore      : Tstringlist;
        counterpoints  : Tstringlist;
        stFile         : string;
        hitcounter, stfileint : Integer;
public
        constructor init;
        procedure laden(pMode: string);
        procedure run;
const
     Textdatei = 'bestenliste.txt';

implementation

constructor TAnwendung.init;
begin
    //....
    stFileint       := 10;
    hitcounter      := 0;
    Counterpoints   := TStringlist.Create;
    Highscore       := TStringlist.Create;
end;


procedure TAnwendung.Laden(pMode: string);
var i : integer;
begin
   try
     Highscore := TStringlist.Create;
     Highscore.LoadFromFile('Bestenliste.txt');
     i := 0   ;
     stFile := Highscore.Strings[i];

   except
     ShowMessage('das geht net');
   end;
end;


procedure TAnwendung.run; 
//....

StrToInt(stFile) := stfileint;   //hier zeigt der Compiler die Fehlermeldung an
if stfileint < hitcounter
   then
     begin
       counterpoints.add(IntToStr(hitcounter));
       counterpoints.SaveToFile(Textdatei);
     end;

// ... restliche Prozeduren und destructor


Die Fehlermeldung ist mit dem try/except nach wie vor die selbe (" ist kein gültiger Integerwert)... dann habe ich das mit dem StrToInt nochmal aufgeteilt, jetzt sagt compiler : [Fehler] mTAnwendung.pas(199): Der linken Seite kann nichts zugewiesen werden

Mhh vielleicht hilft euch die Quelltext zusammenfassung weiter... ach ja bei F7 bleibt er nachher inner schleife hängen sucht immer wieder das selbe ab...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.01.07 13:43 
Die Funktion StrToInt liefert dir etwas zurück, nämlich den Integer-Weert zu einem String. Du kannst einer Funktion aber nichts zuweisen. Eine Funktion ist ja "nur" Quelltext und keine Variable, wo sollte sie die Daten speichern?

Was ich mich frage:
Was willst du eigentlich in Laden machen? Nur die Datei in die StringList laden und einen Eintrag in stFile tun? Oder nicht eher alle Einträge irgendwo anzeigen lassen?
Denn nur dafür brauchst du die Schleife: Um alle Einträge durchzugehen. Nur musst du dann auch bei jedem Schleifendurchlauf etwas mit dem i-ten Eintrag machen.

Wenn du es aber in ein Memo laden willst, dann gibt es dort Memo1.Lines.LoadFromFile(DeineDatei);...
Und sonst schreib doch bitte, was du eigentlich in Laden machen möchtest ;-).

Und noch was: Du musst immer den Pfad der Datei mit angeben!
ausblenden Delphi-Quelltext
1:
Highscore.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Bestenliste.txt');					


Dann erzeugst du die StringList zweimal. Einmal in Laden und einmal in init. Einmal reicht ;-).
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 03.01.07 13:58 
Ich muss jaenicke in allen Punkten Recht geben.

Was ich mit dem Try und Defaultwert meinte war, dass Du grundsätzlich Statt
ausblenden Delphi-Quelltext
1:
StrToInt					

die Funktion
ausblenden Delphi-Quelltext
1:
TryStrToInt					

verwendest. Diese erwartet noch einen Vorgabewert (Default), der als Ergebnis rüberkommt, falls der String nicht korrekt in eine Zahl konvertiert werden kann. Ich verwende die fehleranfällige StrTo... Funktionen gar nicht mehr.

_________________
Es gibt keine Probleme - nur Lösungen!
LeXang Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 04.01.07 14:14 
Es soll total einfach geschrieben sein... und muss "nur" eine zahl aus einer Textdatei mit dem aktuellen punktestand vergleichen, ist die aktuelle zahl größer soll er die abspeichern(dabei wird dann ja automatisch die alte gelöscht) des wars schon.
wegen dem StrToInt / TryStrToInt reicht das also aus wenn ich das einfach austausche?
sry aber ich "lerne" delphi in der schule, normalerweise mache ich das sont über tutorials aber jetzt sind wir mittendrin angefangen (objekt orientiert).
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 05.01.07 06:35 
Ja, kannst StrToInt einfach durch TryStrToInt ersetzen.

Aber, wenn es wirklich nur um das Abspeichern EINER Zahl geht, kannst Du auch folgendes tun (ist einfach einfacher):

ausblenden volle Höhe Delphi-Quelltext
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:
{...}
interface

uses 
  IniFiles;

type
  TForm1=class(TForm)
    {...}
    procedure FormCreate; //Im Objektinspektor hinzufügen
    procedure FormDestroy; //dito
  private
    highscore:integer;
  end;

implementation

{...}

procedure TForm1.FormCreate;
var
  ini:TIniFile;
begin
  ini:=TIniFile.Create(Paramstr(0)+'\bestenliste.ini');
  highscore:=ini.ReadInteger('Punktestand',0); //0=Vorgabewert für das allererste Mal
  ini.Free;
end;

procedure TForm1.FormDestroy;
var
  ini:TIniFile;
begin
  {... Prüfen, ob ein neuer Highscore da ist und Highscore auf den Höchstwert setzen ...}
  ini:=TIniFile.Create(Paramstr(0)+'\bestenliste.ini');
  ini.WriteInteger('Punktestand',hiscore);
  ini.Free;
end;

{...}


Probier's aus. Da sparste Dir viel Arbeit!

_________________
Es gibt keine Probleme - nur Lösungen!
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Fr 05.01.07 06:38 
Ich hab noch vergessen zu erwähnen, dass ich Dir mit meinem Beispiel oben ans Herz legen möchte, ruhig ein Formular in Deine Anwendung hinzuzufügen. Oder brauchst Du gar kein Formular für Deine Anwendung? Der Rahmencode für das Formular wird dabei so ziemlich automatisch erstellt.

_________________
Es gibt keine Probleme - nur Lösungen!
LeXang Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 07.01.07 13:25 
Ja okay es Funkt! Vielen Dank!