Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie? (https://www.delphipraxis.net/186657-%5Bsolved%5Ddatasnap-rtf-text-fly-plaintext-konvertieren-wie.html)

DeddyH 20. Sep 2015 12:57

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.

nahpets 20. Sep 2015 14:13

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: https://msdn.microsoft.com/de-de/library/cc488002.aspx

Ansonsten mit 'ner Word-Fernsteuerung im Hintergrund? Escheint mir dann aber deutlich aufwändiger.

Haben die eventuell eine Ideenvorlage für Dich? http://stackoverflow.com/questions/3...rt-rtf-to-text

ungetestet würd' ich das so in der Art versuchen:
Delphi-Quellcode:
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;
Aufruf:
Delphi-Quellcode:
AusgabevariabelAttributOderWieAuchImmer := RTFToText(Blobfeld.AsString);

DeddyH 20. Sep 2015 14:19

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.

Uwe Raabe 20. Sep 2015 14:24

AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Zitat:

Zitat von DeddyH (Beitrag 1316387)
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

Wo liegt denn nun genau das Problem? Bekommst du kein berechnetes Feld in das DataSet oder kannst du dessen Inhalt nicht setzen?

Zeig doch mal, was du schon hast.

DeddyH 20. Sep 2015 14:53

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:
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;
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.

Sir Rufo 20. Sep 2015 15:39

AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Irgendwie schwebt mir im Kopf herum, dass ein
Delphi-Quellcode:
TBlobField
nicht berechnet werden kann.

DeddyH 20. Sep 2015 15:57

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.

Dejan Vu 20. Sep 2015 16:22

AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Wie wäre es mit einem TStringField?

DeddyH 20. Sep 2015 16:34

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.

mkinzler 20. Sep 2015 17:08

AW: Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Ein Textblobfeld sollte sich, wenn es kleiner 32KB ist als Textfeld ansprechen lassen.

bernd2015 20. Sep 2015 17:23

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?

nahpets 20. Sep 2015 17:43

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.

DeddyH 20. Sep 2015 18:28

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) ;) .

arnof 20. Sep 2015 21:07

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
mit einem kleinen Eingriff kann man die größte erhöhen ....

hoika 21. Sep 2015 02:25

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Hallo,
wie kommst du auf 8000?
http://www.firebirdfaq.org/faq61/

Das ist allerdings noch abhängig vom Zeichensatz.


Heiko

arnof 21. Sep 2015 06:32

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Zitat:

Zitat von hoika (Beitrag 1316433)
Hallo,
wie kommst du auf 8000?
http://www.firebirdfaq.org/faq61/

Das ist allerdings noch abhängig vom Zeichensatz.


Heiko

das ist in Delphi definiert, ich glaube das war in der DB unit, das hatte ich D5 Zeiten schon mal hochgesetzt .....

Wenn von der Datenbank größerer Feldinhalt kommt, dann fliegt die Anwendung weg ...

DeddyH 21. Sep 2015 07:38

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Sry, mein Fehler, ich hatte das hier nur überflogen. Bei genauerem Hinschauen gelten die 8000 Zeichen aber wohl eher für MSSQL (6.5).

Jumpy 21. Sep 2015 09:49

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Zitat:

Zitat von DeddyH (Beitrag 1316410)
(es handelt sich um ein rein privates Projekt, nämlich eine Rezeptesammlung, die ich ihr auch mobil zur Verfügung stellen will) ;) .

Könntest du dir vorstellen, dass später mal als Projekt zur Verfügung zu stellen? Oder etwas dazu sagen, wie du das umgesetzt hast?
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?

mkinzler 21. Sep 2015 09:56

AW: [Solved]Datasnap: RTF-Text "on the fly" in PlainText konvertieren, wie?
 
Eine Mutli-Tier-Anwendung mit Webservice.

DeddyH 21. Sep 2015 12:08

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