Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TRichEdit RTF Laden und Speichern in DB (https://www.delphipraxis.net/167329-trichedit-rtf-laden-und-speichern-db.html)

Meta777 24. Mär 2012 12:44

TRichEdit RTF Laden und Speichern in DB
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DPler,

ich versuche den Inhalt eines TRichedit in eine DB zu speichern und später auch wieder zu laden.
Das Speichern funktioniert problemlos. In der DB liegt in meinem Feld für "TEST" folgendes:

Code:
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
{\colortbl ;\red153\green137\blue137;}
\viewkind4\uc1\pard\cf1\lang1031\b\f0\fs16 TEST\b0\par
}
in der IB-Expert Hex-Ansicht kann ich auch klar sehen das es sich um nicht-Unicode daten handelt (keine 0-Bytes).

Wenn ich das nun lade bekomm ich aber das ganze Unicode präsentiert (mit 0-Byte nach jedem Byte) womit das Richedit aber nichts anfangen kann (siehe Anhang). Ich habe auch mal versucht mit TEncoding in ANSI-Code umzuwandeln aber dann bekomm ich nur "Chinesisch" ins Richedit...

Was mache ich flasch?

Vielen Dank schonmal im Voraus




Der code zum Speichern:

Delphi-Quellcode:
  ...
  //um RTF zu bekommen muss .PlainText auf FALSE
  FEditorForm.RichEdit1.PlainText := False;
  //RTF in MemoryStream speichern
  FEditorForm.RichEdit1.Lines.SaveToStream(LText);

  //Ab in die DB damit...
  LIBDS.SelectSQL.Text := 'EXECUTE PROCEDURE ' +
    'PROCSAVEMISCDATA(:KEYVALUE, :TEXTData)';
  LIBDS.Params[0].AsString := FUId;
  LIBDS.Params[1].LoadFromStream(LText);
  LIBDS.ExecSQL;
  ...

Der code zum laden der auch mit TEncoding nicht funktioniert:

Code:
var
  LText: TMemoryStream;
  LBytes: TBytes;
  E: TEncoding;
begin
  LText := TStringStream.Create;
  E := TMBCSEncoding.Create(28591);//ISO 8859-1 Latin 1 Western European (ISO)
  try
    LoadBlob(GReqDB2, 'MISCDATA', 'TEXTDATA', '(KEYVALUE = '''+FUId+''') '+
      'ORDER BY Id DESC ROWS 1', LText, False);
    FEditorForm.RichEdit1.PlainText := False;
//    SetLength(LBytes, LText.Size);
//    LText.Read(LBytes[0], LText.Size);
//
//    LBytes := E.Convert(TEncoding.Unicode, E, LBytes);
//
//    LText.Size := 0;
//    LText.Write(AnsiString(LBytes), Length(AnsiString(LBytes)));
//    LText.Position := 0;

//    FEditorForm.RichEdit1.PlainText := TRUE;
    FEditorForm.RichEdit1.Lines.LoadFromStream(LText);
  finally
    E.Free;
    LText.Free;
  end;
end;
Die Methode "LoadBlob" macht im prinzip folgendes:

Delphi-Quellcode:
      ...
      ibqBlob.SQL.Text := Format('SELECT %s FROM %s WHERE %s', [AFieldName,
        ATableName, ACondition]);
      ibqBlob.Open;
      if ibqBlob.RecordCount = 0 then
        if ARaiseExIfNotFound then
          raise EDaDBError.Create(SDBENoResults)
        else
          EXIT;
      helpStream := ibqBlob.CreateBlobStream(ibqBlob.FieldByName(AFieldName), bmRead);
      AOutput.CopyFrom(helpStream, helpStream.Size);
      AOutput.Seek(0, soFromBeginning);
      ...

DeddyH 24. Mär 2012 13:40

AW: TRichEdit RTF Laden und Speichern in DB
 
Klappt es evtl. mit
Delphi-Quellcode:
FEditorForm.RichEdit1.Lines.Text := LText.DataString;
:?:

Bummi 24. Mär 2012 22:53

AW: TRichEdit RTF Laden und Speichern in DB
 
Ich mache derartiges mir allen möglichen Arten von Daten ständig, allerdings mit MSSQL (IB konnte ich für mich bisher vermeiden), zudem verwende ich keine StringStream und Blobfields.
Hast Du es mal mit Speicherung in ein VarBinary- Feld, so es dort so heißt versucht

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
 ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  try
   Richedit1.Lines.SaveToStream(ms);
   ms.Position := 0;
   DS.Edit;
   TBlobField(DS.FieldByName('TEXT')).LoadFromStream(ms);
   DS.Post;
  finally
    ms.Free;
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
 ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  try
   TBlobField(DS.FieldByName('TEXT')).SaveToStream(ms);
   ms.Position := 0;
   Richedit2.Lines.LoadFromStream(ms);

  finally
    ms.Free;
  end;
end;

Mavarik 26. Mär 2012 10:02

AW: TRichEdit RTF Laden und Speichern in DB
 
Warum nimmst Du nicht einfach direkt ein DBRichEdit?

Grüsse

Meta777 26. Mär 2012 14:31

AW: TRichEdit RTF Laden und Speichern in DB
 
Hallo DeddyH,


Zitat:

Zitat von DeddyH (Beitrag 1158322)
Klappt es evtl. mit
Delphi-Quellcode:
FEditorForm.RichEdit1.Lines.Text := LText.DataString;
:?:


Das funktioniert leider nicht, da zeigt er mir dann das RTF mark-up an.


Die Lösung: Ich lese das field jetzt .AsString in einem TStringStream und rufe dann RichEdit1.Lines.LoadFromStream() auf.
TIBQuery.CreateBlobStream() was von meiner LoadBlob() aufgerufen wird macht aus dem TextBlob-Feld automatisch Unicode.


@Mavarik: Ich verwende den DB-Zugriff gewrapped zur Laufzeit und habe kein Dataset-Komponente.


Danke euch allen für die Tipps

Shalom

mschaefer 10. Jan 2017 13:05

AW: TRichEdit RTF Laden und Speichern in DB
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

auch wenn das schon etwas länger her ist, lege ich mal meine TDBRichMemo Komponente bei. Sicherlich ausbaufähig, aber einige Ideen finden sich auch darin.

Grüße // Martin


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