![]() |
Probleme beim Hinzufügen/überschreiben
Hallo,
ich weiß nicht mehr weiter. und hoffe das ihr einen fehler findent:
Delphi-Quellcode:
Das hinzufügen funktioniert wie ich es mir vorstelle nur das ändern von texten funktioniert nicht
procedure TNote1.WriteText(Text:TStrings;id:String);
var str,str1:String; i,count:integer; c:Char; r:Boolean; oldpos:Integer; test:Boolean; TextStream:TMemoryStream; Writer:TWriter; Lesen:TReader; begin if FindItem('[TextItem='+id+']') = False then begin str:=#13#10#13#10+'[TextItem='+id+']'+#13; FileStream.WriteBuffer(str[1],Length(str)); Writer:=TWriter.Create(FileStream,10); Writer.WriteString(text.Text); Writer.FlushBuffer; end else begin r:=True; FileStream.Position:=gefundenpos; Lesen:=TReader.Create(FileStream,10); lesen.ReadString; count:=FileStream.Position; FileStream.Position:=gefundenpos; for i:=0 to count-gefundenpos do begin str:=' '; FileStream.WriteBuffer(str[1],Length(str)); end; FileStream.Position:=gefundenpos; Writer:=TWriter.Create(FileStream,10); Writer.WriteString(text.Text); Writer.FlushBuffer; end; end; // WriteText das ergbnis soll so aussehen: Zitat:
Zitat:
die datei ist zum lesen/schreiben geöffnet. vielen dank im vorraus ! |
Re: Probleme beim Hinzufügen/überschreiben
Schonmal den Debugger probiert? Das hilft in diesem Fall sicher besser als dieses Forum
|
Re: Probleme beim Hinzufügen/überschreiben
Außerdem würde die Struktur Deiner Textdatei mich zu
![]() ![]()
Delphi-Quellcode:
In Deinem Projekt wäre wahrscheinlich eine eigene Klasse - abgeleitet von TStringList und ergänzt mit dem Dateinamen und solchen Methoden wie DateiAddItem - konsequenter; aber notfalls kannst Du natürlich alles in Dein Formular mit einer Formular-eigenen sListe stecken.
procedure TForm1.DateiAddItem(id: string; value: string);
var sListe: TStringList; i0, i1: integer; section: string; bPositionErreicht: boolean; begin sListe := TStringList.Create; try sListe.LoadFromFile(sDateiname); // sDateiname als Konstante? // bestimme den Anfang der Section section := '[TextItem='+id+']'; i0 := sListe.IndexOf(section); if i0 < 0 then begin // wenn sie noch nicht vorhanden ist, dann einfügen und neuen Eintrag dahinter sListe.Add(section); sListe.Add(value); end else begin // andernfalls gibt es je nach Wunsch zwei Möglichkeiten: an beliebiger Stelle // einfügen, also z.B. direkt hinter die Section, oder an das Ende der Section; // den schwierigen zweiten Fall beschreibe ich hier: // gehe von der Position i0 weiter, bis: // das Dateiende erreicht ist oder // die nächste Leerzeile kommt oder // die nächste Section beginnt oder bPositionErreicht := false; repeat Inc(i0); if (i0 >= sListe.Count) then bPositionErreicht := true else begin if sListe[i0] = "" then bPositionErreicht := true else begin if (sListe[i0])[1] = '[' then bPositionErreicht := true; end; end; until bPositionErreicht; // jetzt einfügen an Position i0 oder anhängen if (i0 < sListe.Count) then sListe.Insert(i0,value) else sListe.Add(value); end; // Änderungen speichern sListe.SaveToFile(sDateiname); finally sListe.Free; end; end; Zusätzlich müsstest Du noch prüfen, ob value schon innerhalb der section vorhanden ist. Auch dafür gibt es Funktionen in TStringList bzw TIniFile. Ich hoffe, es hilft. Jürgen |
Re: Probleme beim Hinzufügen/überschreiben
naja ich wollte auch noch andere daten abspeichern z.b. die inhalte einer datei aber das bringt mich gerade auf eine andere idee: ich könnte ja eine klasse schreiben die dateien verwaltet und in den speicher kopiert.
diese liste übergebe ich als objekt der TStringlist. das problem bei der TSTringList ist halt nur: 1. bei größeren datenmengen dauert es evlt. zu lange weil ich kann ja erst auf die daten zugreifen wenn sie geladen sind. und ich würde gerne ein ereignis auslösen sobalt die zeile gelsen wurden ist damit ich es eine TreeView hinzufügen kann. 2. kann ich denn ohne weiters den inhalt der objekte speicheren ? auch wenn sie Bin daten erhalten ? das ist nämlich die frage. edit: ich könnte das ganze auch über ini dateien machen es gibt ja genügen units die auch mit großen dateien umgehen können. das hauptproblem währe dann nur noch: wie speichere ich objekte in einer INI datei ab z.b. bin. dateien ? edit2: ich mache das jetzt mal über ini dateien vieln dank für den tip ich habe gesehen es gibt zwei praktische proceduren die können auch binärere dateien speicheren und lesen: WriteBinaryStream und ReadBinaryStream damit werde ich es mal versuchen ob ich zum ziel komme! |
Re: Probleme beim Hinzufügen/überschreiben
die funktioen der ini datei können leider nur bis zu 1023 zeichen lesen/schreiben.
daher schließt das ini aus auf meiner suche nach einer anderen unit für ini dateien habe ich auch nichts passendes gefunden. ich verwende in einer anderen programm version SQL das funktioniert auch soweit dort. nur wollte ich es gerne mal selber übernehmen und mich um das speichern kümmern. und genau das ist das problem. ich habe ja nur zwei möglichkeiten beim speicheren: 1: ich lösche die aktuelle datei und speichere die geänderten daten nur ab(dann würde sich mein problem am schlnellsten lösen. 2: Oder ich überschreibe den aktuellen inhalt ab einer bestimmten position und genau hier liegt mein problem anscheind:. das problem ist einach dass, das entwerde zuviel überschrieben wird oder das bein schreiben was schief geht. nur ich weiß den fehler bei meinen weg leider nicht. ich wollte ja "nur" text daten ändern und keine bin(weil da würde ich sowieso die datei nur erstellen müssen). und ich würde genre das speichern/laden selbst übernhemen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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