AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Hinzufügen/überschreiben

Ein Thema von mimi · begonnen am 10. Okt 2006 · letzter Beitrag vom 11. Okt 2006
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Probleme beim Hinzufügen/überschreiben

  Alt 10. Okt 2006, 22:47
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 !
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: Probleme beim Hinzufügen/überschreiben

  Alt 10. Okt 2006, 23:16
Schonmal den Debugger probiert? Das hilft in diesem Fall sicher besser als dieses Forum
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Probleme beim Hinzufügen/überschreiben

  Alt 11. Okt 2006, 08:34
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Probleme beim Hinzufügen/überschreiben

  Alt 11. Okt 2006, 11:41
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!
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Probleme beim Hinzufügen/überschreiben

  Alt 11. Okt 2006, 12:40
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 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