Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme beim Hinzufügen/überschreiben (https://www.delphipraxis.net/78767-probleme-beim-hinzufuegen-ueberschreiben.html)

mimi 10. Okt 2006 22:47


Probleme beim Hinzufügen/überschreiben
 
Hallo,
ich weiß nicht mehr weiter. und hoffe das ihr einen fehler findent:
Delphi-Quellcode:
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 hinzufügen funktioniert wie ich es mir vorstelle nur das ändern von texten funktioniert nicht
das ergbnis soll so aussehen:
Zitat:

[ItemList]
Dies=49575053554956525749=08.10.2006=16:13:11
ist=50494950495550574956=08.10.2006=16:13:13
ein=49504955525649545055=08.10.2006=16:13:15
test=49515055495049505054=08.10.2006=16:13:18
von=51514954495149494949=08.10.2006=16:13:21
heute=49534949504950544955=08.10.2006=16:13:234

[TextItem=49575053554956525749]
Test1
Test2
Test3

[TextItem=50494950495550574956]
Hallo1
Hallo2
Hallo3
aber leider sieht es nach DEM bearbeiten so aus:
Zitat:

[ItemList]
Dies=49575053554956525749=08.10.2006=16:13:11
ist=50494950495550574956=08.10.2006=16:13:13
ein=49504955525649545055=08.10.2006=16:13:15
test=49515055495049505054=08.10.2006=16:13:18
von=51514954495149494949=08.10.2006=16:13:21
heute=49534949504950544955=08.10.2006=16:13:234

[TextItem=49575053554956525749]
Test1
Test2
Test3
Test4 tem=50494950495550574956]
Hallo1
Hallo2
Hallo3
ich habe dem ersten eintrag(49575053554956525749) einen eintrag hinzugefügt.
die datei ist zum lesen/schreiben geöffnet.
vielen dank im vorraus !

bttb930 10. Okt 2006 23:16

Re: Probleme beim Hinzufügen/überschreiben
 
Schonmal den Debugger probiert? Das hilft in diesem Fall sicher besser als dieses Forum

Jürgen Thomas 11. Okt 2006 08:34

Re: Probleme beim Hinzufügen/überschreiben
 
Außerdem würde die Struktur Deiner Textdatei mich zu Delphi-Referenz durchsuchenTStringList führen, auch wenn die Sektionen und Einträge etwas vom Schema wie bei Ini-Dateien abweichen - sonst könntest Du direkt Delphi-Referenz durchsuchenTIniFile verwenden:
Delphi-Quellcode:
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;
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.

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

mimi 11. Okt 2006 11:41

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!

mimi 11. Okt 2006 12:40

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 10:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz