TWPRichText in Datenbankfeld speichern und wieder anzeigen

  • Guten Tag Herr Ziersch,
    ich möchte gerne das mit WPRichText erzeugte Dokument in ein Blobfeld
    der Datenbank speichern. Ich habe Interbase als Datenbank im Einsatz.
    Die Daten werden auch in das Blobfeld gespeichert,
    jedoch beim Wiedereinladen in WPRichText sind die Tabulatoren und sonstige Textkennungen nicht mehr vorhanden.
    Das Speichern erfolgt mit dem folgemdem Befehl:

    Code
    NeuesDokument.Dokument := wprchtxtSchriftVerkehr.Text;


    Die Vaiable "Dokument" ist vom Typ ein WideString.

    Öffnen mit folgendem Befehl:

    Code
    wprchtxtSchriftVerkehr.Text := Dokumente.Dokument;

    Irgendetwas mache ich falsch. Ich habe schon die unterschiedlichen
    Aufrufe für "wprchtxtSchriftVerkehr.fff" ausprobiert, bin aber nicht zum Ziel gelangt.
    Ich bin mir aber sicher ich dies schon einmal gelöst habe, weiß aber nicht mehr wie die Befehle dazu. Verdammt!!!!
    Vielleicht können Sie mir helfen??
    Mit Gruß
    Hans-Peter Bongers

    • Offizieller Beitrag

    Die property "Text" entspricht dem Aufruf von AsANSIString('ANSI') mit der aktuellen Codepage. Es wird also der ANSI text writer aufgerufen.

    Um Formatierten Text abzurfen nlesen Sie enteder die property AsString oder rufen die Funktion AsANSIString( formatstr ) auf. AsANSIString übergeben Sie das gewünschte Format, z.b. 'RTF', 'HTML' oder 'WPTOOLS'.

    Den String können Sie immer der property AsString zuweisen da hier das Format automatisch erkannt wird.

    Die Zuweisung an Text ist nicht sinnvoll. Hier wird ein TMemo emuliert.

    Für das Abspeichern in einen Blobstream empfehle ich aber SaveToStream bzw. LoadFromStream da strings ja seit Delphi 2009 doppelzeichen speichern, die von WPTools unterstützten Formate (mit Ausname von "UNICODE") aber alle auf einzel Zeichen basieren. (bei RTF sogar ASCII, bei HTML UTF8)

  • Guten Tag Herr Ziersch,
    es will einfach nicht gelingen!
    ich habe es nun mit folgendem Code versucht:

    Code
    procedure TFrmSchriftverkehr.OeffneEinVorhandenesDokument;begin  Dokumente.FindeEinDokument(DokumentID);  wprchtxtSchriftVerkehr.Clear;  wprchtxtSchriftVerkehr.AsANSIString('RTF'); // auch 'WPTOOLS' brachte kein erfolg  wprchtxtSchriftVerkehr.AsString := Dokumente.Dokument;  wprchtxtSchriftVerkehr.CPPosition := MaxInt;end;

    Beim Probieren merke ich gerade dass das Dokument richtig angezeigt wird!
    Ich habe nur diese Zeile geändert:

    Code
    Dokumente.Dokument := wprchtxtSchriftVerkehr.SaveToString('RTF');

    In das Blobfeld der Tabelle speicher ich als "WideString".

    Mit dem von Ihnen vorgeschlagenem Stream komme ich nicht nicht zurecht.
    Was nicht wie ich das programmieren soll.
    Wären Sie bitte so nett eine Demo-Procedure bereitzustellen, anhand ich genau
    sehen kann, wie das alles abzulaufen hat??
    Also eine für das Speichern und eine für das Laden. Ich möchte ja den Text in ein Feld der Datenbank speichern. Wäre wirklich nett von Ihnen.
    Mit freundlichem Gruß
    HPB
    Mit Gruß
    HPB

    • Offizieller Beitrag

    In das Blobfeld der Tabelle speicher ich als "WideString".

    Bitte beachten, RTF ist kein Unicode Format - es liegt als single Byte vor, ist also binär! Bei der Speicherung in Unicode strings kann es zu Codepage umwandlungen kommen, welche den Daten nicht guttun. Insbesondere Bilder werden dadurch zerstört. (Siehe aber property WriteObjectMode wo man das binäre speichern abstellen kann - bilder werden dann ge-hexcoded)

    Wenn Sie in einen BLOB speichern bitte SavetoStream und LoadFromStream verwenden.

    blob := TBlobStream.Create( ein_blobfeld );
    WPRichText1.SaveToStream(blob);
    blob.Free;

    Wenn es persistent nicht funktioniert stimmt vermutlich etwas an der Konfigurierung der Datenbank nicht. Sie können ein Tool wie IBExpert nehmen um mal nachzusehen was genau eigentlich in die Datenbank gespeichert wurde.