![]() |
E/A beim Textspeichern
Ein Hallo an ALLE,
Ich versuche einen Text zu speichern und bekomme immer - je nachdem welche Variante ich probiere, E/A 32, 104, 105. Ich seh aber den Fehler nicht! Könnt Ihr mal kurz einen Blick drauf werfen, vielleicht sieht ja jemand, woran es hakt! Viele Grüsse, moperswings
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Memo1.SelStart := 3; end; procedure TForm1.Memo1OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var selstart: integer; TempStr2: PChar; begin if key = VK_RETURN then begin tempStr2 := '</p>'; SendMessage(Memo1.Handle, EM_Getsel, longint(@selstart), 0); SendMessage(Memo1.Handle, EM_Replacesel, 0, LongInt(TempStr2)); SendMessage(Memo1.Handle, EM_Setsel, selstart + 4, Selstart + 4); key := 0; end; end; procedure TForm1.Memo1OnKeyUP(Sender: TObject; var Key: Word; Shift: TShiftState); var selstart: integer; TempStr1: PChar; begin if key = VK_RETURN then begin tempStr1 := ' '; SendMessage(Memo1.Handle, EM_Getsel, longint(@selstart), 0); SendMessage(Memo1.Handle, EM_Replacesel, 0, LongInt(TempStr1)); SendMessage(Memo1.Handle, EM_Setsel, selstart + 4, Selstart + 3); key := 0; end; end; procedure TForm1.Button1Click(Sender: TObject); var f: textfile; dateiname: string; count: integer; p: string; begin dateiname := 'daten.html'; Assignfile(f, dateiname); {$i-} rewrite(f); {$i+} If IOResult <> 0 then begin ShowMessage('Fehler1'); Exit; End; Writeln(f, Memo1.Text); closefile(f); count := 0; Assignfile(f, dateiname); FileMode := fmOpenRead; {$i-} reset(f); {$i+} If IOResult <> 0 then begin ShowMessage('Fehler2'); Exit; End; While not EOF(f) do begin readln(f); inc(count); p := '</p>'; if count = 0 then begin Writeln(f, Memo1.Text + p); closefile(f); end else if count >= 1 then begin Memo1.Lines.Delete(Memo1.Lines.Count - 1); Writeln(f, Memo1.Text + p); closefile(f); end; end; end; end. |
Re: E/A beim Textspeichern
Geb mal den vollen Pfad an.
|
Re: E/A beim Textspeichern
Am Pfad liegt´s nicht!
Der Debugger springt jetzt zum letzten Writeln mit E/A 105! |
Re: E/A beim Textspeichern
Zitat:
|
Re: E/A beim Textspeichern
Ich habe mir die Fehlermeldungen schon angesehen.
Nur weiss ich nicht, wo mein Fehler im Code ist. Entweder ist er generell falsch oder es ist nur eine Kleinigkeit, die ich übersehe! |
Re: E/A beim Textspeichern
Vielleicht das CloseFile innerhalb der Schleife?
|
Re: E/A beim Textspeichern
Closefile habe ich schon rausgenommen.
Es hat was mit Fallunterscheidung zu tun, wie das Dokument abgespeichert werden soll. Nehme ich das zweite writeln raus, läufts! |
Re: E/A beim Textspeichern
Am writeln liegt es nicht!
Es hat was damit zu tun, wie das Dokument zum zweiten mal geöffnet und zum Verarbeiten bereit gestellt wird. So würde ich das Laienhaft einschätzen
Delphi-Quellcode:
Jetzt springt er auch zum writeln mit E/A 105
...
if count = 0 then Memo1.Lines.Add(</p>) else Memo1.Lines.Delete(Memo1.Lines.Count - 1); end; writeln(f, Memo1.Text); Closefile(f); |
Re: E/A beim Textspeichern
Mit den beiden folgenden Funktionen, wird das Laden und Speichern zum Kinderspiel:
Delphi-Quellcode:
Man kann übrigens Daten in einem TMemo ganz einfach laden und speichern
function FileToString(const FileName: string): AnsiString;
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.ReadBuffer(Result[1], Len); finally fs.Free; end; end; procedure StringToFile(const FileName: string; const Contents: AnsiString); var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmCreate); try Len := Length(Contents); if Len > 0 then fs.WriteBuffer(Contents[1], Len); finally fs.Free; end; end;
Delphi-Quellcode:
Memo1.lines.LoadFromFile('datei.html');
Memo1.lines.Add('<body>'); Memo1.lines.Add('</body>'); Memo1.lines.SaveToFile('datei.html'); |
Re: E/A beim Textspeichern
Ok, ich beschreibe das Problem! Vielleicht gibt es ja eine ganz andere Lösung!
Ich hab nen Memo mit einem . Mit der Enter-Taste füge ich ein </p> ein, d.h. die Tags sind geschlossen und ein neues wird bereit gestellt. 1. Fall: Der Nutzer schreibt eine Zeile und speichert ohne Enter-Taste, d.h. mir fehlt das </p>, also Memo1.Lines.Add(</p>); 2. Fall: Der Nutzer schreibt mehr und wenn ich speichere ist meine letzte Zeile ja </p>. Und diese überflüssige Zeile will ich weg haben, also Memo1.Lines.Delete(Memo1.Lines.count - 1). Schreibt er aber nur eine Zeile mit Inhalt, würde mir der zweite Fall den Inhalt löschen. Und aus der Nummer muss ich halt raus kommen! Andere Vorschläge sind erwünscht! Ziel: Die Tags sind geschlossen und keine überflüssigen Tags! |
Re: E/A beim Textspeichern
Wie es aussieht, fange ich mit dieser Lösung - bis jetzt - jeden Fall auf:
Delphi-Quellcode:
Tschüss, moperswings
Memo1.Lines.Add('</p>');
Writeln(f, Memo1.Text); closefile(f); Memo1.Lines.LoadFromFile('d:\editor2\daten.html'); Memo1.Text := StringReplace(Memo1.Text, ' ' + #13#10 + '</p>', '', [rfreplaceall]); Memo1.Text := StringReplace(Memo1.Text, #13#10, '', [rfreplaceall]); Memo1.Text := StringReplace(Memo1.Text, ' </p>', '', [rfreplaceall]); umbruch := '</p>' + #13#10 + ' '; Memo1.Text := AnsiReplaceText(Memo1.Text, '</p> ', umbruch); Memo1.Lines.SaveToFile('d:\editor2\daten.html'); |
Re: E/A beim Textspeichern
Zitat:
Fangen wir mal so an: Du hast ein TMemo völlig ohne HTML-Tags. Der Benutzer gibt 3 Zeilen ein: Zitat:
Dein Programm schreibt nun folgendes: Zitat:
Das Programm muss dann die Daten als String einlesen und alle Tags entfernen und die ursprünglichen Zeilenumbrüche wiederherstellen. Ist es das, was du erreichen möchtest? Vorteil wäre, dass der Benutzer überhaupt nicht mit den HTML-Tags in Berührung kommt. Das ganze Gedöns mit OnKeyDown kann man sich sparen. |
Re: E/A beim Textspeichern
@moperswings: Du hast dir die Fehlermeldungen schon durchgelesen und es liegt nicht daran? Dann mal kurz Schritt für Schritt:
1. Du öffnest zu Schreiben, schreibst was rein, schliesst die Datei wieder. 2. Du öffnest zum Lesen, liest was aus und danach schreibst in der Schleife in den selben Stream? Du wunderst dich warum der Fehler 105 bei einem WriteLn() kommt? Und die Beschreibung zum Fehler 105 hilft dir nicht weiter? Zitat:
|
Re: E/A beim Textspeichern
@shima, ja so könnte es mal aussehen. Ich taste mich da halt langsam vor, damit ich mit dem Umgang mit Strings mehr Übung erlange.
@muetze: Ich habe - zugegeben - nach dem guten alten Trail and Error-Prinzip mit mehreren Filemodes und Ein/Ausgaberoutinen gearbeitet, bin aber nicht weiter gekommen. Sonst hätte ich ja nicht gepostet! Aber letztendlich habe ich es selber so hinbekommen, wie ich es im Moment brauche! Bestimmt gibt es bessere Lösungen - ich bin für alles offen und dankbar! |
Re: E/A beim Textspeichern
Zitat:
FileMode ist nicht der Auslöser sondern die Wahl der Funktion zum Lesen bzw. Schreiben. Also die richtige Auswahl bei Reset, Append und Rewrite. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz