![]() |
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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 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