Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi RichEdit aus DB (Blob) einlesen (https://www.delphipraxis.net/210054-richedit-aus-db-blob-einlesen.html)

Echtet 23. Feb 2022 08:50

Datenbank: Firebird • Version: 3 • Zugriff über: IBX

RichEdit aus DB (Blob) einlesen
 
Hallo Zusammen,

Ich speichere mit Formatierungen versehenene Texte eines RichEdit in einem Blob-Feld (Subtype:Text) über eine IBQuery in einer Firebird-DB ab. Leider gelingt mir das Einlesen nicht.
Folgendermaßen speichere ich ab (funktioniert):

Delphi-Quellcode:
...
var RichEditStream : TStringStream;
...
    if frmMain.AdvRichEditorBeschreibungNeu.Text.IsEmpty = False then
    begin
      RichEditStream := TStringStream.Create;
      RichEditStream.WriteString(frmMain.AdvRichEditorBeschreibungNeu.ContentAsRTF); //Dadurch bleibt der formatierte Text erhalten
      RichEditStream.Position := 0;
      Query.ParamByName('beschreibung').LoadFromStream(RichEditStream, ftBlob);
      RichEditStream.Free;
    end
...
Mein Versuch des Einlesens sieht folgendermaßen aus:
Delphi-Quellcode:
...
var RichEditStream : TStringStream;
  RichEditStream := Query.CreateBlobStream(Query.Fields[4],bmRead);
  RichEditStream.Position := 0;
  frmMain.AdvRichEditorRTFIO.RichEditor.LoadFromStream(RichEditStream);
  RichEditStream.Free;
...
1. Beim Compilieren bekomme ich die Fehlermeldung:
"E2010 Inkompatible Typen: 'TStringStream' und 'TStream'"

2. Also ändere ich testweise folgendermaßen ab:
var RichEditStream : TStream;
Compilieren gelingt, aber ich bekomme beim Einleseversuch die Exception:
"EReadError: Ungültiges Stream-Format"

Ich komme momentan einfach nicht weiter. Kann mir hier jemand helfen?

Viele Grüße und Danke!
Echtet

Redeemer 23. Feb 2022 19:14

AW: RichEdit aus DB (Blob) einlesen
 
Zum Speichern:
Du nimmst in der Spaltendefinition und im Speichern-Code an, dass RTF ein ASCII-Format ist. Das solltest du nicht machen, denn der Inhalt von Dateien, die normalerweise nicht per Texteditor erstellt werden (niemand erstellt ein RTF von Grund auf mit Texteditor), geht dich eigentlich nichts an. Stell dir vor, der TStringStream schreibt dir eine BOM in den String - was machst du dann?
Normalerweise speichert man den Inhalt eines RichEdit so (zumindest beim Standard-RichEdit):
Delphi-Quellcode:
...
var RichEditStream : TMemoryStream;
...
    if not frmMain.AdvRichEditorBeschreibungNeu.Text.IsEmpty then
    begin
      RichEditStream := TMemoryStream.Create;
      try
        frmMain.AdvRichEditorBeschreibungNeu.Lines.SaveToStream(RichEditStream);
        RichEditStream.Position := 0;
        Query.ParamByName('beschreibung').LoadFromStream(RichEditStream, ftBlob);
      finally
        RichEditStream.Free;
      end;
    end
...
Zum Laden:
Auch beim Laden ist StringStream nicht gut, daher scheitert das: Die allermeisten Komponenten verwenden TStrings und TStream als Eigenschaften und Rückgabewerte, weil es dich als Verwender einfach nichts angeht, welcher Typ das genau ist.
Mach mal RichEditStream.SaveToFile und schau dir das Ergebnis in Word oder so an.
Spalten über die Nummer ansprechen ist auch oft keine gute Idee.

Echtet 24. Feb 2022 08:13

AW: RichEdit aus DB (Blob) einlesen
 
Hallo Janni,
Danke für die schnelle Antwort.
Ich werde jetzt erstmal einige Tests durchführen.

Ich finde es verwirrend und leider auch schlecht dokumentiert, wann man den jeweiligen Stream-Typen nimmt.
Viele Grüße,
Echtet


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 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