![]() |
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.
|
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Habe von Nicht-Windows null Ahnung, aber wie wärs mit einem unsichtbaren Memo, in das man den Text des RichEdits rüberkopiert?
Und dann halt wieder zurück? |
AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Textmemos (Blobs) spreche ich immer mit .AsString an, außer bei Postgres habe ich damit noch nie irgendwelche Größenbeschränkungen erlebt.
Sprich: Es waren durchaus schonmal 4, 5 und auch mehr MB Text, die so in ein Blobfeld der Datenbank "gewandert" sind. |
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Ich wollte es als BLOB haben, weil ich nicht weiß, wie groß die Texte so werden können. Aber mit den 8000 Zeichen, die FB für VARCHAR-Felder zulässt, kann ich durchaus leben, wenn es mal länger werden sollte, muss meine Frau sich eben kurz fassen (es handelt sich um ein rein privates Projekt, nämlich eine Rezeptesammlung, die ich ihr auch mobil zur Verfügung stellen will) ;) .
|
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
mit einem kleinen Eingriff kann man die größte erhöhen ....
|
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Hallo,
wie kommst du auf 8000? ![]() Das ist allerdings noch abhängig vom Zeichensatz. Heiko |
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Zitat:
Wenn von der Datenbank größerer Feldinhalt kommt, dann fliegt die Anwendung weg ... |
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Sry, mein Fehler, ich hatte
![]() |
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Zitat:
Ich plane sowas auch für die Rezeptesammlung meines Vaters, als App auf seinem Tablet. Derzeit liegt das noch in einer MS-Access Datenbank und jeder Menge Word-Dateien vor, wo ich im Moment daran arbeite, dass die Word-Dateien "ungefähr" einen gleichen Aufbau haben, damit ich deren Inhalt (Grafiken, Einkaufsliste, Arbeitsanweisung) erstmal automatisiert in eine Datenbank bekomme. Mein Ansatz wäre jetzt gewesen, dass alles in eine SQL-Lite DB zu packen, die dann bei der App auf dem Tablet liegt. Dein Ansatz klingt jetzt aber eher so, dass du eine Client-Server-Geschicht entwickelst, wo die DB auf dem Server liegt? |
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Eine Mutli-Tier-Anwendung mit Webservice.
|
AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
Halt, Hooo, Brrrr, interpretiert da jetzt nicht zuviel hinein. Die Sache ist ganz einfach: ich hatte vor Jahren für meine Frau ein kleines VCL-Programm geschrieben, mit dem sie ihre Rezeptsammlung verwalten kann, im Hintergrund werkelt eine FB-Datenbank. Das Ding ist ganz simpel: Kategorien, Rezepte, Texte und Bilder, zwischen Kategorie und Rezept besteht eine m:n-Beziehung. Und das Progrämmchen wollte ich ihr mobil zur Verfügung stellen, dort allerdings mit SQLite. Und damit sie nicht alles erneut eintippen muss, importiere ich die Daten per Datasnap von der FB- in die SQLite-DB. Das ist alles.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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