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
IronBytes

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

String Grid speichern nur mit Fehler

  Alt 13. Dez 2023, 19:44
Hallo Zusammen

Ich bin schon länger auf der Suche nach einem Code eine StringGrid abzuspeichern und wieder genau so einzulesen. Leider gelingt mir das nicht mehr.
In meiner Stinggrid werden auch drei Memos eingetragen wo vermutlich auch das Problem passiert, da nach dem Memo immer min. ein Absatz existiert

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

var
  F: TStringList;
  x1,y1: Integer;
begin

  F := TStringList.Create;
  SaveDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
  if savedialog1.Execute then begin;

  try
    //F.Add(IntToStr(StringGrid1.RowCount));
    //F.Add(IntToStr(StringGrid1.ColCount));
    for y1 := 1 to 500 do begin;

    for x1 := 1 to 70 do begin;

      F.Add(StringGrid1.cells[x1,y1]);
  end;
  end;



    F.SaveToFile(savedialog1.FileName+'.dbs');
  finally
    F.Free;
  end;
  end;
  end;




procedure TForm2.BitBtn6Click(Sender: TObject);

 var
  F: TStringList;
  x1,y1,a: Integer;


begin
OpenDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
if Opendialog1.Execute then begin;

  a:=0;
  F := TStringList.Create;
  try
    F.LoadFromFile(opendialog1.FileName);
    for y1 := 1 to 500 do begin;

    for x1 := 1 to 70 do begin;
     a:=a+1;
                StringGrid1.cells[x1,y1]:= F.Strings[a-1];
  end;


  end;
  finally
    F.Free;
  end;
end;
 end;
Hat jemand eine Idee wie man das Grid genau so lesen kann wie es gespeichert wird ?.

Grüße Thomas
Thomas S.
  Mit Zitat antworten Zitat
TUhr

Registriert seit: 25. Sep 2021
17 Beiträge
 
#2

AW: String Grid speichern nur mit Fehler

  Alt 13. Dez 2023, 21:11
Schau Dir mal die Eigenschaft vom Stringgrid : Delmiter bzw. die Methode DelimitedText an
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.303 Beiträge
 
Delphi 12 Athens
 
#3

AW: String Grid speichern nur mit Fehler

  Alt 14. Dez 2023, 07:37
Hallo und Willkommen hier...

Der Kardinalfehler deines Vorhabens sind (u.a.):
1. Visuelle Komponenten zur Datenhaltung zu benutzen.
2. ein Text Format zur Speicherung zu nutzen. XML als "Datenbank" zu benutzen ist OK durch die Struktur und Erweiterbarkeit. (PS: ich stehe auf richtige Datenbanken. Es kommt immer auf die Menge an Daten an )
3. Wenn dir die Optik deiner Oberfläche nicht mehr gefällt und du die Spalten anders anordnest, passen die Daten nicht mehr.

Tipps:
1. Trennung in Oberfläche, Logic, Daten
-> Form mit Stringgrid - Logic lädt die Daten - Logic übergibt der Form die Daten zum Darstellen
-> Speicherung1: die Logic liest das Grid aus - überträgt das in z.B. XML - Speicherung in Datei
-> Speicherung2: die Logic bekommt den aktuell geänderten Wert der Zelle - überträgt das direkt in z.B. XML -> Speicherung in Datei nach Wunsch direkt oder komplett
2. ein geeignetes Dateiformat (für zukünftige Änderungen, imho kein Binärformat)
3. Bitte den Quellcode ordentlich formatieren. Dann ist es besser für Andere zu lesen. Es hilft dir ob z.B. die begin/end zusammenpassen wenn sie untereinander stehen.

zur Frage:
Vieleicht kannst du mal anhängen was du erwartest. (Bild vor Speicherung, die Datei, Bild nach dem Einlesen)

Im ersten Durchlauf:
Delphi-Quellcode:
a := 0; // A = 0
F := TStringList.Create;
try
  F.LoadFromFile(opendialog1.FileName);
  for y1 := 1 to 500 do
  begin
    for x1 := 1 to 70 do
    begin
      a := a + 1; // A = 1
      StringGrid1.cells[x1,y1] := F.Strings[a - 1]; // Index = 0
    end;
  end;
...sollte eigentlich passen. Aber nur mit einzeiligen Werten. Sonst stimmt evt. der Index nicht. Deshalb das Muster der Datei...

Zitat:
Schau Dir mal die Eigenschaft vom Stringgrid : Delmiter bzw. die Methode DelimitedText an
Der Hinweis ist richtig für mehrzeilige Werte, aber: Delimiter bei TStringlist und nicht Stringgrid.

Geändert von haentschman (14. Dez 2023 um 08:13 Uhr)
  Mit Zitat antworten Zitat
IronBytes

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

AW: String Grid speichern nur mit Fehler

  Alt 15. Dez 2023, 18:13
Hallo

Entschuldigung das ich mich erst jetzt melde. Liege mit Corona flach und kann mich derzeit nicht immer aufraffen am Project weiter zu wurschteln.
Ich benutze die Stringgrid (die nicht sichtbar ist) zum Datenspeichern. Bisher hatte ich nie Probleme da ich ja keine Memofelder reinbastelte. Das Project dient
nur einem, mir selbst. Es ist ohne weiterem Nutzen. Eine Datenbank wollte ich nicht, was vermutlich einfacher geht (Zumindest aus meiner Erinnerung heraus), aber was
auch schlechte Eigenschaften hervorruft wenn jene auch mal kaputt geht. Wir arbeiten hauptsächlich mit Datenbanken berufsbezogen, und es kommt nicht selten vor das es eine verhacktstückelt (Access).
Ein reines Textfile kann ich händisch wieder reparieren. Wenn ich das nun richtig verstehe, geht es so einfach nicht.
Ich werde jetzt mal versuchen jeden Datensatz mit einer Soderzeichencombi zu trennen, und hoffen das ich es wieder zusammenbekomme.

Grüße Thomas
Thomas S.
  Mit Zitat antworten Zitat
IronBytes

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

AW: String Grid speichern nur mit Fehler

  Alt 15. Dez 2023, 18:19
Anbei mal die Oberfläche
Angehängte Grafiken
Dateityp: jpg INV.jpg (308,6 KB, 51x aufgerufen)
Thomas S.
  Mit Zitat antworten Zitat
IronBytes

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

AW: String Grid speichern nur mit Fehler

  Alt 15. Dez 2023, 18:24
Ich versuche nun immer zwischen den Feldern ein Absatzzeichen einzufügen, um es danach wieder besser aufzusplitten.



Delphi-Quellcode:
var
  F: TStringList;
  x1,y1: Integer;
begin

  F := TStringList.Create;
  SaveDialog1.Filter := 'Datenbank (*.dbs)|*.DBS';
  if savedialog1.Execute then begin;

  try
    //F.Add(IntToStr(StringGrid1.RowCount));
    //F.Add(IntToStr(StringGrid1.ColCount));
    for y1 := 1 to 500 do begin;

    for x1 := 1 to 70 do begin;

      F.Add(StringGrid1.cells[x1,y1]);
      F.Add('#Q#Q');
  end;
  end;



    F.SaveToFile(savedialog1.FileName+'.dbs');
  finally
    F.Free;
  end;
  end;
  end;
Thomas S.
  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 00:04 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