Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   String Grid speichern nur mit Fehler (https://www.delphipraxis.net/214269-string-grid-speichern-nur-mit-fehler.html)

IronBytes 13. Dez 2023 19:44

String Grid speichern nur mit Fehler
 
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

TUhr 13. Dez 2023 21:11

AW: String Grid speichern nur mit Fehler
 
Schau Dir mal die Eigenschaft vom Stringgrid : Delmiter bzw. die Methode DelimitedText an :-)

haentschman 14. Dez 2023 07:37

AW: String Grid speichern nur mit Fehler
 
Hallo und Willkommen hier...:dp:

Der Kardinalfehler deines Vorhabens sind (u.a.):
1. Visuelle Komponenten zur Datenhaltung zu benutzen. :zwinker:
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 :wink:)
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. :zwinker:

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

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. :gruebel: Aber nur mit einzeiligen Werten. Sonst stimmt evt. der Index nicht. Deshalb das Muster der Datei...:wink:

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. :zwinker:

IronBytes 15. Dez 2023 18:13

AW: String Grid speichern nur mit Fehler
 
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

IronBytes 15. Dez 2023 18:19

AW: String Grid speichern nur mit Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei mal die Oberfläche

IronBytes 15. Dez 2023 18:24

AW: String Grid speichern nur mit Fehler
 
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;

himitsu 15. Dez 2023 18:52

AW: String Grid speichern nur mit Fehler
 
PS, da es wie eine Datenbank klingt (dbs),
warum dann nicht "wirklich" Eine benutzen?

* z.B. SQLite via TSQLQuery bzw. TFDQuery

* oder TLocalSQL oder TDataSetProvider gegen eine Objekt/Record-Liste

* oder einfach TClientDataSet bzw. TSimpleDataSet (die kennen auch ein SaveToFile/LoadFromFile)


da dran dann normale TDBEdit, TDBComboBox, TDBMemo oder auch ein TDBGrid usw.




Und warum überhaupt eine unsichtbare visuelle Komponente, um interne Daten zu speichern?

Nicht nur die unnötig komplizierte/datenhungrige/langsame Datenhaltung,
sondern dann auch nochmal sinnlos manuell das alles mit den Eingabe-Controls (Edits) zu synchronisieren. :freak:

Für sowas nimmt man eben möglivhst passende Datenhaltungs-Komponenten,
oder von mit aus auch eine ObjektListe oder verschachtelte StringListen
oder z.B. eine TMemIniFile (Row-Index = Section-Name und Col-Index/Name = Value-Name)
oder XML, JSON usw.
oder ...

Delphi.Narium 15. Dez 2023 18:56

AW: String Grid speichern nur mit Fehler
 
Zitat:

Zitat von IronBytes
und es kommt nicht selten vor das es eine verhacktstückelt (Access)

Das betrifft aber nur Access und keine Datenbanken. Sowas ist mir noch nie vorgekommen, weder Oracle, noch PostGres, Ingres, MySQL, MSSQL, FireBird, Interbase, selbst dBase und Paradox sind da verlässlicher.

Ansonsten könnte man ja auch noch 'nen ClientDataSet nutzen, kann damit auch alle datensensitiven Komponenten nutzten. Speichern kann man mit ClientDataSet.SaveToFile und laden mit ClientDataSet.LoadFromFile.

https://www.tek-tips.com/viewthread.cfm?qid=1523881

Es geht also auch ohne Datenbank deutlich einfacher als mit 'nem unsichtbaren StringGrid.

haentschman 16. Dez 2023 06:30

AW: String Grid speichern nur mit Fehler
 
Moin...8-)
...ein paar Fragen:

1.
Zitat:

Wir arbeiten hauptsächlich mit Datenbanken berufsbezogen
Wer ist wir? Die Firma, 20 Entwickler? :zwinker:
2.
Zitat:

Das Project dient nur einem, mir selbst
Machst du Programmieren hauptberuflich in der Firma? (XE8)
3.
Zitat:

Ein reines Textfile kann ich händisch wieder reparieren
...was ist wenn man nichts reparieren muß? Vernünftige Datenbank oder XML? :zwinker:
4.
Zitat:

Anbei mal die Oberfläche
...die Oberfläche repräsentiert EINEN Datensatz? Was ist, wenn zu den Katzen ein Tiger (Spaß :stupid::tongue:) hinzukommt?
5.
Zitat:

Ich benutze die Stringgrid (die nicht sichtbar ist) zum Datenspeichern
Willst du über den Tellerand schauen und es richtig lernen? Hast du Zeit und den Willen dazu?


PS:
Zitat:

und es kommt nicht selten vor das es eine verhacktstückelt (Access)
...Access ist ja auch keinen Datenbank. :duck:

IronBytes 17. Dez 2023 15:23

AW: String Grid speichern nur mit Fehler
 
Hallo

Bin ja jetzt vor Gericht ;-)

1.
Zitat:
Wir arbeiten hauptsächlich mit Datenbanken berufsbezogen
Wer ist wir? Die Firma, 20 Entwickler?

Es gibt keine Entwickler sondern nur Facharbeiter für Fördertechnik (Elektriker,Mechaniker,Büroleute (Keine Programierer))

2.
Zitat:
Das Project dient nur einem, mir selbst
Machst du Programmieren hauptberuflich in der Firma? (XE8)

Nur für mich, früher mehr für andere aber immer nur so.

3.
Zitat:
Ein reines Textfile kann ich händisch wieder reparieren
...was ist wenn man nichts reparieren muß? Vernünftige Datenbank oder XML?

Wie gesagt ich wollte es einfach mit einem Textfile.

4.
Zitat:
Anbei mal die Oberfläche
...die Oberfläche repräsentiert EINEN Datensatz? Was ist, wenn zu den Katzen ein Tiger (Spaß ) hinzukommt?

Man spricht auch von einer sogenanten Laufkatze. Sie fährt an der Kranbrücke und beinhaltet das Hubwerk oder Hebezeug.

5.
Zitat:
Ich benutze die Stringgrid (die nicht sichtbar ist) zum Datenspeichern
Willst du über den Tellerand schauen und es richtig lernen? Hast du Zeit und den Willen dazu?


Ich möchte nur dieses kleine Projekt für mich machen und es dieses Jahr abschließen. Es hat keinen Nutzen sondern dient nur zum Auffrischen meines Kopfes. Besser geht es immer ;-)

PS:
Zitat:
und es kommt nicht selten vor das es eine verhacktstückelt (Access)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
Seite 1 von 3  1 23      

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