AGB  ·  Datenschutz  ·  Impressum  







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

String Grid speichern nur mit Fehler

Ein Thema von IronBytes · begonnen am 13. Dez 2023 · letzter Beitrag vom 23. Dez 2023
Antwort Antwort
Seite 2 von 3     12 3      
IronBytes

Registriert seit: 13. Dez 2023
Ort: bei Sigmaringen
9 Beiträge
 
Delphi XE8 Professional
 
#11

AW: String Grid speichern nur mit Fehler

  Alt 17. Dez 2023, 20:00
Hallo Zusammen

Weis jemand wie ich die Strings wieder untereinander ins Memofeld bekomme ? Danke im Vorfeld.
Einzelne Zeilen gehen gut. nur das aneinanderreihen von Memozeilen geht warum auch immer nicht.

Grüße von der schwäbischen Alb.

Delphi-Quellcode:
procedure TForm2.BitBtn6Click(Sender: TObject);

 var
  F: TStringList;
  x1,y1,a,ie: Integer;
  strV: string;


begin
OpenDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
if Opendialog1.Execute then begin;
  strV:='';
  a:=-1;
  F := TStringList.Create;
  try
    F.LoadFromFile(opendialog1.FileName);
    for y1 := 1 to 499 do begin;

    for x1 := 1 to 70 do begin;
    a:=a+1;
    edit28.text:=inttostr(a);

repeat
     strV:=strV+F.Strings[a];

     a:=a+1;
until F.Strings[a]='#Q#Q';


stringgrid1.cells[x1,y1]:= strV ;
 strV:='';
        end;


       end;
  finally
    F.Free;
     end;
   end;
 end;
Thomas S.
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: String Grid speichern nur mit Fehler

  Alt 18. Dez 2023, 00:26
Moin,

so wie du das machst (StringGrid zum Datenspeichern) habe ich vor kurzen auch noch gemacht. Ich selber speichere meine Daten immer noch (meistens) in CSV-Dateien auf der Platte. Das einzige was ich jetzt anders mache ich das ich die Daten selber in TStringList vorhalte und dafür eine paar Routinen habe mit denen ich eine CSV-Liste bearbeiten kann.

Wenn wie bei dir das einfach mit den Mitteln löschen soll die man kennt und nicht groß was neu lernen will dann würde ich wahrscheinlich für die Memos eine separate Textdatei machen bei der die erste Zeile eines Absatzes der Verweis auf den eigentlichen Datensatz ist.

Wie gesagt, das geht 1000mal besser, sicherer, moderner … aber um das ganze neue zu lernen muss man auch erst einmal die Nerven und die Zeit dafür haben.

Gruß
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#13

AW: String Grid speichern nur mit Fehler

  Alt 18. Dez 2023, 11:04
Ich glaube Du kannst "Memo" Einträge nicht mit TStrings.SavetoFile und TStrings.LoadfromFile abspeichern und wieder zurück laden.
LoadFromFile benutzt
Code:
#13#10
als trennzeichen und
Code:
"
als QuoteChar und
beide können in einem Memo in verschiedensten Kombinationen auftreten.


Es kann helfen, wenn du vor dem Speichern die Strings ersetzt die dein Speicherformat durcheinander bringen.
Delphi-Quellcode:
 
AStrings.Add(Replace(Zelle, Astrings.Linebreak, '~newline~', [rfReplaceAll] );
Und dann nach dem Einlesen auf alle Gitterzellen

Zelle := Replace(Zelle,'~newline~', Astrings.Linebreak, [rfReplaceAll] );
Andernfalls hilft nur ein Dateiformat das NICHT das TStrings dateiformat ist.
TiniFile z.b. könnte helfen. Und ist auch humanreadable.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (18. Dez 2023 um 12:55 Uhr)
  Mit Zitat antworten Zitat
IronBytes

Registriert seit: 13. Dez 2023
Ort: bei Sigmaringen
9 Beiträge
 
Delphi XE8 Professional
 
#14

AW: String Grid speichern nur mit Fehler

  Alt 18. Dez 2023, 16:01
Hallo Ihr Zwei

Vielen lieben Dank für eure Antworten. Hier muß ich mal nochmal in mich gehen und probieren was noch möglich ist. Es ist eigentlich der letzte große Posten.
Ob ich mich mal etwas tiefer in die Programmierung einarbeiten soll, das sagt mir die Zeit. Habe ja auch noch mein Haus zu richten.
Aber Programmieren macht halt auch Spaß und hält das Hirn fit.
Probiere mal eure ansätze durch und gebe Bescheid.

Grüße und Danke
Thomas
Thomas S.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: String Grid speichern nur mit Fehler

  Alt 18. Dez 2023, 16:23
Du musst vor dem Speichern, im Memo-Text CR/LF (#13#10) mit etwas anderem ersetzen (siehe z.B. Post von QuickAndDirty). Beim Laden machst du das umgekehrte und wandelst die Zeichenfolge, die du für CR/LF genutzt hast, wieder in die richtige CR/LF (#13#10) Zeichenfolge um.
  Mit Zitat antworten Zitat
IronBytes

Registriert seit: 13. Dez 2023
Ort: bei Sigmaringen
9 Beiträge
 
Delphi XE8 Professional
 
#16

AW: String Grid speichern nur mit Fehler

  Alt 18. Dez 2023, 20:04
Meine derzeitige Lösung sieht so aus:
Der Vorgang geht natürlich zu lange, was die Progessbar auch anzeigt, da es sich auch um 35000 Einträge handelt. Wartezeit beim Laden sind ca 3 Sekunden. Ist nicht Super aber ich hatte auch nichts erwartet.
Zum Darstellen habe ich mir eine Memo4 unsichtbar auf das Formfeld geholt und von dort aus wieder eingelesen.

Ich lege das hier mal ab als Beispiel wie man es nicht macht

Delphi-Quellcode:

var
  F: TStringList;
  x1,y1,a,ie,bV,aha,z: Integer;
  strV: string;


begin
OpenDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
if Opendialog1.Execute then begin;
  strV:='';
  a:=-1;
  F := TStringList.Create;
  try
    F.LoadFromFile(opendialog1.FileName);


    for y1 := 1 to 500 do begin;
     progressbar1.Position:=Y1;
     for x1 := 1 to 70 do begin;
     a:=a+1;
     edit28.text:=inttostr(a);
     bv:=1;
     memo4.Lines.Clear;
repeat
     strV:=strV+F.Strings[a];
     memo4.Lines.add (F.Strings[a]);
     bv:=bv+1;
     a:=a+1;
until F.Strings[a]='#Q#Q';

if bv >2 then stringgrid1.Cells[x1,y1]:=memo4.text

else stringgrid1.cells[x1,y1]:= strV ;
  strV:='';
        end;


       end;
  finally
    F.Free;
     end;
   end;
 progressbar1.Position:=0;
Thomas S.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: String Grid speichern nur mit Fehler

  Alt 19. Dez 2023, 16:45
Für was brauchst du eigentlich das Memo? Zeigst du damit irgendwas an oder ist das nur für diese Routine? Was du damit in deinem Code machst, ist unsinnig und sehr langsam. Dann hast du vermutlich nicht verstanden, was wir mit "Ersetzen von CR/LF" genau meinen. Ich nehme an, du hast das mit dem "#Q#Q" versucht zu steuern oder ist das was anderes? Gehe ich richtig der Annahme, dass du da pro Gridzelle eine Zeile im File willst? Das folgende Beispiel basiert auf diese Annahme.

Du weisst sicher in welchen Spalen dein Memo drin ist oder? Dann musst du diese Spalte speziell behandeln wie im foglenden Beispiel. Beim Speicher musst du genau das umgekehrte machen. Aber achtung dieer Ansatz ist generell sehr schlecht und du wirst grosse Probleme bekommen, wenn das dein Grid mal eine anderen Aufbau bekommen soll. Dann passen deine Dateien nicht mehr zum Grid und sind wertlos.

Hier mal ein Beispiel wie du es sinnvoler machen kannst:
Delphi-Quellcode:
procedure LoadData;
var
  F: TStringList;
  x1,y1,a: Integer;
  strCell: string;
begin
  OpenDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
  if Opendialog1.Execute then
  begin;
    strV:='';
    a:=-1;
    F := TStringList.Create;
    try
      F.LoadFromFile(opendialog1.FileName);

      for y1 := 1 to 500 do
      begin;
        progressbar1.Position:=y1;

        for x1 := 1 to 70 do
        begin;
          a:=a+1;
          edit28.text:=inttostr(a);

          strCell := F.Strings[a];
          { In Spalte 50 soll das Memo rein. Die Zeilen (Spalten), die wir beim Speichern von #13#10 (CR/LF)
            in '#13#10' (String) umgewandelt haben, müssen nun wieder in korrektet CR/LF zurückgewandelt werden. }

          if x1 = 50 then
            strCell := StringReplace(strCell, '#13#10', #13#10, [rfReplaceAll]);

          stringgrid1.cells[x1,y1]:= strCell;
        end;
      end;
    finally
      F.Free;
    end;
  end;
  progressbar1.Position:=0;
end;

Beim Speichern der Datei müsstest du die mehrzeiligen Zellen (hier im Beispiel Spalte 50) wie folgt umwandeln, damit das Laden richtig funktioniert:
Delphi-Quellcode:
  { Beim Speichern der Spalte 50, müssen Zeilenumbruche (CR/LF) in Stringkonstanten umgewandelt werden }
  strCell := stringgrid1.cells[x1,y1];
  if x1 = 50 then
    strCell := StringReplace(strCell, #13#10, '#13#10', [rfReplaceAll]);
  ...

Geändert von Rolf Frei (19. Dez 2023 um 16:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#18

AW: String Grid speichern nur mit Fehler

  Alt 19. Dez 2023, 17:17
... da es sich auch um 35000 Einträge handelt. Wartezeit beim Laden sind ca 3 Sekunden.
Du veräppelst uns, oder?

35 TAUSEND Einträge.

Datenbank. Punkt.
Alles andere ist Irrsinn bei der Menge an Daten, egal ob privates Spielprojekt oder nicht!
Für kleine Projekte wo man nur eine Tabelle braucht nehme ich gerne eine Memtable. CSV zum speichern und laden. Macht die Memtable (KbmMemtable) selber.
Für alles andere gibt es sicher schöne schlanke embedded Lösungen. Ich habe bisher Absolute Database verwendet, das ist aber wohl vorbei das ist mir jetzt zu teuer!
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: String Grid speichern nur mit Fehler

  Alt 20. Dez 2023, 13:28
Für ihn ist jede Gridzelle ein Datensatz, was natürlich Quatsch ist. Sein Grid hat 35'000 Zellen (500 Zeilen X 70 Spalten).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#20

AW: String Grid speichern nur mit Fehler

  Alt 20. Dez 2023, 14:29
Das TStringGrid ist dann intern auch mehrere StringListen, also pro Zeile eine TStringList und je Column Cell ein String.

Auch wenn es hier zum Glück "aktuell" geht, so ist es mit mehreren "Zeilen" je Cell (ListenZeile) eher als problematisch anzusehen.

Hier gleich mal ein gutes Beispiel, dass der Unterschied zwischen Daten-Komponente und GUI-Komponente schnell relevant sein kann.
Also TMemo (Memo.Lines = TMemoStrings) versus TStringList :

* das Memo speichert eigentlich alles in einem Stream ... also quasi in .Text, was "ein" String ist
* übergibt man einem Lines[i] einen mehrzeiligen String, dann
* * wird das in mehrere Zeilen aufgetrennt (nachfolgende Zeilen verschieben sich)
* * man muß aufpassen welche Zeilenumbrüche man benutzt, denn #13#10, #10 und #13, aka CRLF, LF und CR, werden vom Memo unterschiedlich behandelt
* * ändert man eine Line (egal ob mehrzeilig oder nicht), wird der komplette Stream und womöglich auch die ganze Speicherverwaltung umgeschrieben, wenn sich der gesamte Stream/String sich ändert
* * und bei vielen Zeilen / größeren Änderungen wird das TMemo extrem unperformant

* bei der TStringList dagegen ist/bleibt jede Line ein eigener String, auch wenn Mehrzeiliges zugewiesen wird.
* aber beim Zugriff .Text wird dann alles wieder zu einem String und die Lines trennen sich auf, vor allem auch beim SaveToFile/LoadFromFile
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Dez 2023 um 14:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

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 01:41 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