Einzelnen Beitrag anzeigen

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