![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Datasnap
[Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Es ist mir ein wenig peinlich, aber ich kriege es nicht gebacken: ich habe hier eine Firebird-Tabelle, die in einem BLOB-Feld RichText enthält. Die Datenbank importiere ich per Datasnap auf ein Android-Smartphone, das klappt auch gut. Da ich aber auf dem Gerät mit RichText wenig anfangen kann, würde ich den BLOB-Inhalt eben gern im Klartext haben. Wie gehe ich da nun vor, wenn ich diese Arbeit vom Datasnap-Server erledigen lassen möchte? Die Originaldaten sollen auf dem PC natürlich RichText bleiben, also dachte ich in Richtung berechnetes Feld, nur wie?
Ich bin für jeden Tipp dankbar, Performance ist übrigens eher zweitrangig, da es sich um eher geringe Datenmengen handelt und der Import selbst auch nur sporadisch ausgeführt werden wird, da darf das ruhig ein paar Sekunden dauern. P.S.: Nicht, dass das falsch verstanden wird: es geht mir nicht um RichEdit und dessen PlainText-Property, sondern darum, dass mir der Server per REST ein (in der Tabelle nicht existierendes) Feld mit dem Klartext übermittelt. |
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Und was spricht dagegen, den von Dir beschriebenen Weg über das RichEdit zu gehen?
Musste vor Jahren mal "on the fly" aus Datenbankdaten Grafiken generieren, die dann per Webserver an die anfordernden Browser geliefert wurden. Die TeeChart-Komponente war dazu hervorragend geeignet. Also wurde zur Laufzeit in der ISAPI-DLL ein Formular erstellt, das TeeChart mit Daten befüllt, die entstandene Grafik als JPeg per Stream ausgeliefert, Formular freigegeben. Funktionierte über Jahre hinweg problemlos, auch dort galt: Die Grafiken wurden ab und an mal benötigt, auf Tempo kam es nicht an. Würde bei Deiner Aufgabenstellung auch so in der Art vorgehen und erst wenns nicht funktioniert nach 'nem komplizierteren Weg suchen. Das TeeChart verweigerte ohne Formular seine Arbeit, wenn das RichEdit ohne Formular auskommt, müsste das doch eigentlich relativ einfach zu implementieren sein. MS schlägt für C# diesen Weg vor: ![]() Ansonsten mit 'ner Word-Fernsteuerung im Hintergrund? Escheint mir dann aber deutlich aufwändiger. Haben die eventuell eine Ideenvorlage für Dich? ![]() ungetestet würd' ich das so in der Art versuchen:
Delphi-Quellcode:
Aufruf:
function RTFToText(s : String) : String;
var re : TRichEdit; begin re := TRichEdit.Create(Nil); re.WordWrap := false; re.Lines.Text := s; re.PlainText := true; Result := re.Text; re.Free; end;
Delphi-Quellcode:
AusgabevariabelAttributOderWieAuchImmer := RTFToText(Blobfeld.AsString);
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Danke, aber wie ich im Postscriptum schon schrieb, geht es nicht um die Konvertierung (wenn man ein RichEdit mit CreateParented(HWND_MESSAGE) erzeugt, kommt man auch ohne Formular aus), sondern darum, dass es mir nicht gelingt, ein berechnetes Feld mit dem Klartext liefern zu lassen. Das kann eigentlich nur eine simple Property des Datasets sein, die ich übersehe, aber das nervt ungemein.
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Zitat:
Zeig doch mal, was du schon hast. |
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Ich habe in meinem Datasnap-Server dem entsprechenden Dataset mit dem Feldeditor ein Feld hinzugefügt (Name PlainText, BlobType ftMemo, FieldKind fkInternalCalc). Im OnCalcFields des Dataset steht momentan dieser Code:
Delphi-Quellcode:
Damit ernte ich bei der Ausführung "Datenmenge weder im Editier- noch im Einfügemodus". Füge ich ein Dataset.Edit ein, enthält es keine Daten.
procedure TServerMethods1.TexteTableCalcFields(DataSet: TDataSet);
var RE: TRichEdit; Stream, PlainStream: TStream; begin RE := TRichEdit.CreateParented(HWND_MESSAGE); try Stream := DataSet.CreateBlobStream(DataSet.FieldByName('Text'), TBlobStreamMode.bmRead); try Stream.Seek(0, TSeekOrigin.soBeginning); RE.PlainText := false; RE.Lines.LoadFromStream(Stream); RE.PlainText := true; PlainStream := TStringStream.Create; try RE.Lines.SaveToStream(PlainStream); PlainStream.Seek(0, TSeekOrigin.soBeginning); (DataSet.FieldByName('PlainText') as TBlobField) .LoadFromStream(PlainStream); finally PlainStream.Free; end; finally Stream.Free; end; finally RE.Free; end; end; |
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Irgendwie schwebt mir im Kopf herum, dass ein
Delphi-Quellcode:
nicht berechnet werden kann.
TBlobField
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Das wär aber ausgesprochen blöd, dann müsste ich mir was anderes überlegen.
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Wie wäre es mit einem TStringField?
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Damit geht es, nach kurzer Recherche sind das maximal 8000 Zeichen, das sollte aber genügen.
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Ein Textblobfeld sollte sich, wenn es kleiner 32KB ist als Textfeld ansprechen lassen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz