Zeilenumbruch in einer .txt Datei ( Delphi )

Neue Frage »

Auf diesen Beitrag antworten »
Andro Zeilenumbruch in einer .txt Datei ( Delphi )

Meine Frage:
Hallo
Ich habe folgendes Problem Delphi soll in einer .txt Datei zwei Zeilen hinzufügen
bei meinem ersten Versuch hat Delphi dies auch getan nur als ich die if-Bedingung geändert hatte kam es plötzlich zu keinem Zeilenumbruch mehr in der .txt - Datei.
Damit das Programm allerdings funktioniert benötige ich diesen Zeilenumbruch.
In der Theorie sollte ja ein Zeilenumbruch für jedes list.add('text'); erscheinen.

Meine Ideen:
Mein erster Ansatz, bei dem der Zeilenumbruch erfolgte:
if length(Edit2.Text) >= 6 then
begin
list.LoadFromFile('Logs.txt');
list.add ('Benutzer: '+ nbn);
list.Add('Passwort: '+ npw);
list.SaveToFile('Logs.txt');
showmessage ('Du hast dich erfolgreich angemeldet!');
Button4.Visible := True;
Button3.Enabled := False;
Edit1.Text := '';
Edit2.Text := '';
end

Mein zweiter Ansatz bei dem komischerweise kein Zeilenumbruch erfolgt:

if Label4.Caption = 'Benutzername verfügbar' then
begin
list.LoadFromFile('Logs.txt');
list.add ('Benutzer: '+ nbn);
list.Add('Passwort: '+ npw);
//list.Add('');
list.SaveToFile('Logs.txt');
showmessage ('Du hast dich erfolgreich angemeldet!');
Button4.Visible := True;
Button3.Enabled := False;
Edit1.Text := '';
Edit2.Text := '';
end

// Vielen Dank im vorraus smile
 
Auf diesen Beitrag antworten »
eulerscheZahl

Da hat sich ja nur die Bedingung am Anfang geändert. Bei deinem Codeausschnitt kann ich mir das nicht erklären.
Zitat:
Call SaveToFile to save the strings in the list to the file specified by FileName. Each string in the list is written to a separate line in the file.
(Doku)

Wenn du willst, kannst du dein komplettes Projekt als .zip in den Anhang. Bei deinem Ausschnitt kann ich nichts finden.
Auf diesen Beitrag antworten »
Andro

Ja genau deswegen konnte ich es mir auch nicht erklären :/
Danke für die Antwort hab die Datei im Anhang hochgeladen
Auf diesen Beitrag antworten »
eulerscheZahl

Nein, hast du nicht. Hast du auf "speichern" geklickt?
 
Auf diesen Beitrag antworten »
Andro

Ich hatte das falsche Projekt hochgeladen hab es geändert jetzt sollte es richtig sein
Auf diesen Beitrag antworten »
eulerscheZahl

Mein Problem ist, wie ich in den Pfad überhaupt reinkomme.
Das ist ja beim Abschließen des Registrierungsprozesses.

code:
1:
2:
3:
4:
5:
6:
7:
8:
  kappa := list.Count div 2;
//...
          for zeilennr := 0 to kappa-1 do
            begin
              if list[zeilennr*2] = 'Benutzer: '+ nbn then showmessage ('Benutzername bereits vergeben')
              else
                Label4.Caption := 'Benutzername verfügbar';

der Nutzername ist verfügbar, wenn es einen Nutzer gibt, der anders heißt. Bei einer leeren Liste kann man sich folglich nicht registrieren. Bei zwei verschiedenen Nutzern kann man den verwendeten trotz Meldung nehmen.
Wenn ich also per Texteditor einen Nutzer ergänze, stürzt das Programm beim Versuch des erneuten Ladens ab. (if Label4.Caption = 'Benutzername verfügbar' then [...] list.LoadFromFile('Logs.txt'); )
Wenn ich das Abstürzen durch eine Neuinitialisierung (list := TStringList.CreateAugenzwinkern unterbinde, klappt das Anmelden.

So oder so hätte ich noch einiges an deinem Code auszusetzen böse
Auf diesen Beitrag antworten »
Andro

Also nach der Registrierung kommt man ja zur Anmeldung und diese gibt einem dann die Ausgabe ob die Anmeldung erfolgreich war oder nicht weiter geht es dann auch nicht.
Ich habe mit Delphi erst am Mittwoch angefangen und bin noch ein anfänger deswegen sieht der code wahrscheinlich nicht so gut aus :/
Das Programm ist ja auch noch nicht fertig ich arbeite mich von Problem zu Problem momentan verstehe ich nicht, warum kein Zeilenumbruch erfolgt Zunge raus
Auf diesen Beitrag antworten »
Andro

Also warum bei der .txt Datei kein Zeilensprung erfolgt verstehst du auch nicht ganz?
Auf diesen Beitrag antworten »
Andro

"der Nutzername ist verfügbar, wenn es einen Nutzer gibt, der anders heißt. Bei einer leeren Liste kann man sich folglich nicht registrieren."

Nicht ganz nbn ist der von dem Benutzer gewünschte Nutzername.
Jede Zeile von Benutzernamen wird in der .txt Datei kontrolliert und falls es eine Zeile gibt, in der der gewünschte Benutzername bereits existiert wird der Text ('Benutzername bereits vergeben') ausgegeben andernfalls ist der Benutzername verfügbar und die Anmeldung kann erfolgen
Damit aber nur die Zeile der Benutzernamen kontrolliert wird muss zwischen Benutzerzeile und Passwortzeile ein Zeilenumbruch in der .txt Datei erfolgen
Auf diesen Beitrag antworten »
eulerscheZahl

Das mit dem Zeilenumbruch kann ich einfach nicht reproduzieren. Bei mir funktioniert es.
Allerdings stürzt dein Programm bei mir ab, wenn ich es so lasse:
code:
1:
2:
3:
4:
list := TStringList.Create;
list.LoadFromFile('Logs.txt');
list.Free;
list.LoadFromFile('Logs.txt');

Mit Free gibst du den Speicher frei. Danach darfst du die Liste nicht mehr verwenden.
Also entweder nicht freigeben (warum machst du das überhaupt, wenn du die Liste noch verwenden willst?) oder mit list := TStringList.Create; eine neue erstellen.
Könnte sein, dass dein Speicher korrumpiert ist und du deshalb keine Zeilenumbrüche mehr kriegst.

Zitat:
Jede Zeile von Benutzernamen wird in der .txt Datei kontrolliert und falls es eine Zeile gibt, in der der gewünschte Benutzername bereits existiert wird der Text ('Benutzername bereits vergeben') ausgegeben andernfalls ist der Benutzername verfügbar und die Anmeldung kann erfolgen

Das ist was du willst. Dein Programm macht etwas anderes.
code:
1:
2:
3:
4:
5:
6:
7:
kappa := list.Count div 2;
  for zeilennr := 0 to kappa-1 do
    begin
      if list[zeilennr*2] = 'Benutzer: '+ nbn then showmessage ('Benutzername bereits vergeben')
      else
        Label4.Caption := 'Benutzername verfügbar';
    end;

Szenario 1: die Liste ist leer. Dann ist kappa=0. Die Schleife läuft von 0 bis -1 (also gar nicht, bis hierhin nicht verkehrt: wo nichts ist, kann nichts getestet werden).
Aber dadruch wird Label4.Caption := 'Benutzername verfügbar'; nie ausgeführt. Das ist aber die Bedingung, um einen neuen Nutzer anzulegen.
if Label4.Caption = 'Benutzername verfügbar' ist false, also kein neuer Nutzer, kein Schreiben in die Datei.

Szenario 2: die Liste hat 2 Nutzer: nutzer1 und nutzer2. nbn ist nutzer1 (der ja schon existiert).
Die Schleife wird zweimal ausgeführt. Beim ersten Mal kommt eine Fehlermeldung (Benutzername bereits vergeben). Beim zweiten Durchlauf ist der Benutzername ein anderer, also wird der else-Pfad ausgeführt. Es wird signalisiert, dass der Name verfügbar ist und ein zweiter nutzer1 wird angehängt.


Wie du beides beheben könntest:
code:
1:
2:
3:
4:
5:
Label4.Caption := 'Benutzername verfügbar';
for zeilennr := 0 to kappa-1 do begin
  if list[zeilennr*2] = 'Benutzer: '+ nbn then
    Label4.Caption := 'Benutzername vergeben';
end

Für so etwas nimmt man aber eigentlich Variablen, keine Label (da muss jedes Mal die Nutzeroberfläche aktualisiert werden. Bei vielen Nutzern wird das schnell sehr langsam.
Auf diesen Beitrag antworten »
Andro

Achso vielen vielen Dank Gott es lag tatsächlich daran, dass ich die Liste wieder freigegeben habe. Jetzt funktioniert es ganz normal. Stimmt ich hatte nicht daran gedacht dass kappa negativ negativ oder gleich 0 wird Forum Kloppe . Das Label hätte ich am Ende noch invisible gemacht aber ich habe gerade von Boolean gelesen. Ich glaube damit sollte es einfach zu machen sein smile
Auf diesen Beitrag antworten »
eulerscheZahl

Freut mich. Ich hatte schon Angst, dass du das überliest, bei dem vielen Text smile
Und ja, ich wollte auch boolean hinaus.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »