| Autor |
Beitrag |
LeXang
Hält's aus hier
Beiträge: 7
|
Verfasst: 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:
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);
if StrToInt(stFile) < hitcounter
then begin counterpoints.add(IntToStr(hitcounter)); counterpoints.SaveToFile(Textdatei); end;
procedure TAnwendung.Laden(pMode: 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
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: 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 
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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...
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; if stfileint < hitcounter then begin counterpoints.add(IntToStr(hitcounter)); counterpoints.SaveToFile(Textdatei); end;
|
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
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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!
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
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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
Delphi-Quelltext
die Funktion
Delphi-Quelltext
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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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):
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; procedure FormDestroy; private highscore:integer; end;
implementation
procedure TForm1.FormCreate; var ini:TIniFile; begin ini:=TIniFile.Create(Paramstr(0)+'\bestenliste.ini'); highscore:=ini.ReadInteger('Punktestand',0); ini.Free; end;
procedure TForm1.FormDestroy; var ini:TIniFile; begin 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
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: So 07.01.07 13:25
Ja okay es Funkt! Vielen Dank!
|
|