AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Formatierten Text in PostgreSQL 9 speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Formatierten Text in PostgreSQL 9 speichern

Ein Thema von FBrust · begonnen am 20. Dez 2015 · letzter Beitrag vom 21. Dez 2015
Antwort Antwort
Seite 2 von 3     12 3      
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#11

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 07:30
Mal ne Frage:

Wie groß ist den der Text im RichEdit?

Per Default kann das RichEdit nur 64K aufnehmen. Vielleicht wird zwar mehr Text angezeigt, aber beim Speichern nur die 64K exportiert.
Zu Bedenken ist hier der Unterschied zwischen Text und RTF.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 08:15
Es ist schon sehr abenteuerlich, was du da mit dem Stream veranstaltest (casten des Stream-Inhalts mit PChar ).

Wenn du den RTF-String haben möchtest, dann nimm doch einfach
Delphi-Quellcode:
function TfrmMain.GetRTFText: string;
begin
  Result := redt1.Lines.Text;
end;
Wenn du in ein Blob-Feld speichern möchtest, dann nimm doch die einfache Variante:
Delphi-Quellcode:
// DataSet und Name des Felds musst du anpassen
MyDataSet.FieldByName( 'MyRtfBlobField' ).Assign( redt1.Lines );
und das Lesen geht ähnlich kompliziert
Delphi-Quellcode:
// DataSet und Name des Felds musst du anpassen
redt1.Lines.Assign( MyDataSet.FieldByName( 'MyRtfBlobField' ) );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#13

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 09:14
Hmm..

ich glaube es könnte am fehlenden

ARichEdit.PlainText := False; liegen


http://www.swissdelphicenter.ch/de/showcode.php?id=843

Delphi-Quellcode:
function GetRTFText(ARichEdit: TRichedit): string;
var
  ss: TStringStream;
  emptystr: string;
begin
  emptystr := '';
  ss := TStringStream.Create(emptystr);
  try
    ARichEdit.PlainText := False;
    ARichEdit.Lines.SaveToStream(ss);
    Result := ss.DataString;
  finally
    ss.Free
  end;
end;

@Sir Rufo

Meines Wissens liefert

Result := redt1.Lines.Text;

nur den reinen Text, ohne RTF-Formatierungen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 10:59
wenn ich mal aus der OH zitieren darf:
Zitat:
Die Eigenschaft PlainText gibt an, ob das Steuerelement den Text beim Lesen oder Schreiben einer Datei als normalen Text oder als Rich Text behandelt.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#15

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 11:49
Bevor jetzt noch mehr Verwirrung entsteht: Das oben angehängte Projekt arbeitet mit TRichEdit, also den mitgelieferten VCL-Komponenten. Diese arbeiten bei größeren RTF-Dateien nicht mehr fehlerfrei, was an der erwähnten 64-KB-Grenze liegen mag. Verwendet man stattdessen die RichEdit-Komponenten der Jedi-Sammlung, die da heißt TJvRichEdit, lassen sich auch größere RTF-Dateien fehlerfrei einlesen, abspeichern und zwischen zwei Komponenten via Stream kopieren. Natürlich sollte das Property PlainText stets auf false stehen, wenn man Textformatierungen benötigt, sonst hätte man nur den reinen Text, wie er im Property Text der Lines-Eigenschaft vorliegt.

Zum Testen hab ich nochmal eine kompilierte Exe mit JediRichEdits angefügt.
Angehängte Dateien
Dateityp: zip RtfStream.zip (458,5 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 14:54
Hallo zusammen,

danke für Eure Antworten und Testprojekte.

Das Testprojekt von Perlsau funktioniert einwandfrei. Wenn aus dem gleichen Stream wieder ausgelesen wird, klappt das auch bei mir. Sobald ich aber den Inhalt des Streams zwischenspeichere (deswegen der Cast nach PChar), wird er abgeschnitten. Ich weiss jetzt allerdings auch nicht, wie ich aus dem Stream etwas erhalte, was ich in einer Datenbank speichere, ggf. mit Assign?

@HolgerX: Der Text, den ich zum Test verwende, ist nur ca. 100 Zeichen lang, damit sollte es keine Probleme geben, Plaintext steht auch immer auf false.

Ich forsche weiter.


Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#17

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 15:05
Hmm..

Kann es sein, das in deinem Rückgabe-String (RTF-String) an der Stelle, an der abgeschnitten wird ein #0 vorkommt?

Ein PChar endet beim ersten Vorkommen eines #0-Zeichens

Bei einem String kann es aber weiter gehen ..

Verwende doch statt des MemoryStreams einen StringSteam, wie aus dem Source von meinem Post #13,
dann fällt die Verwendung des PChar wegs.

Außerdem liefert glaube ich ein SaveToStream eines RichEdits einen AnsiString und das würde weitere Probleme mit Pchar geben, da dies als UniCode eine WideChar und kein AnsiChar ist..
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 15:54
Hallo,

ich habe jetzt innerhalb des Programms eine Testmethode zum Experimentieren erstellt, dabei wird der Inhalt eines JvRichEdits in einen Stream und von da aus in eine String-Variable geschrieben.

Anschließend wird mit der String-Variable ein Stream gefüllt und dieser wiederum in ein zweites JVRichedit geladen.

Dabei wird aus
Zitat:
Pimpernelle Zwiebelhaut (Hans Adolf Halbey)

Kennt ihr schon die Hexenbraut
Pimpernelle Zwiebelhaut?
ein Text, der zwar mit den RTF-Formatierungen beginnt, aber am Schluss mit "Zwiebelhau" endet. Außerdem folgt nach jedem Zeichen ein Leerzeichen. Ich hab ein Bild angefügt, da sich der Text nicht in die Zwischenablage einfügen lässt.

Hier die Testmethode:

Delphi-Quellcode:
procedure TfrmMain.btn5Click(Sender: TObject);
var
  FStream: TStringStream;
  strtest: widestring;
  teststring: string;
begin
  // Zuerst in Stream umwandeln:
  try
    FStream := TStringStream.Create(teststring);
    FStream.Clear;
    edt1.Lines.SaveToStream(FStream);
    FStream.Position := 0;
    strtest := FStream.DataString;
  finally
    FStream.Free;
  end;

  // und wieder zurück:
  edt2.lines.clear;
  try
    FStream := TStringStream.Create(teststring);
    FStream.Clear;
    FStream.WriteBuffer(strtest[1], Length(strtest));
    FStream.Position := 0;
    edt2.Lines.LoadFromStream(FStream);
  finally
    FStream.Free;
  end;
end;
Sehr seltsam das ganze...irgendwo ist der Wurm drin..

Gruß
Frank
Miniaturansicht angehängter Grafiken
rtfproblem.png  
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#19

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 16:36
Du mußt den Inhalt des Streams doch nicht in einem PChar zwischenspeichern. Ich kann mir dafür keinen zwingenden Grund vorstellen. Belasse doch den Inhalt im Stream, nenne in meinetwegen MeinGlobalerMemoryStream und deklariere ihn global bzw. wenn du ihn nur in dieser Unit benötigst, im Private-Abschnitt. Den Inhalt des Streams kannst du dann auch wunderbar in ein Blobfeld schreiben bzw. umgekehrt ein Blobfeld in einen Stream gießen. Natürlich kommt es zu Verlusten, wenn du Inhalte in Typen speicherst, die dafür nicht geeignet sind. Die Leerzeichen zwischen jedem einzelnen Zeichen sind ein Signal dafür, daß du ehemaligen Unicode-Text mit einer nicht unicodefähigen Komponente darstellst oder sicherst. Das heißt, jedes zweite Zeichen ist nicht darstellbar, weil Unicode hier zwei Byte pro Zeichen belegt und das zweite Byte ein nicht darstellbares Zeichen ist, jedoch zum ersten Byte gehört und in Unicode-Darstellung auch korrekt dargestellt würde. Laß also einfach diesen Unsinn mit dem Typecast nach PChar weg, behalte das Zeug im Stream und gut ist.

Geändert von Perlsau (21. Dez 2015 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 21. Dez 2015, 16:51
Hallo Perlsau,

in der Methode oben ist doch gar kein Typecast mehr drin... , aber das mit dem Unicode leuchtet mir ein.

Üblicherweise baue ich meine SQLs als String zusammen (ich verwende keine Datasets), so dass ich halt vor dem Problem stehe, den Inhalt des Streams in ein SQL einfügen, da fehlt mir wohl das Wissen.

Also (verkürzt) so:

Code:
SQL := 'insert into notes (notizfeld) values (<hier sollte der Stream dann hin...>)';
ExecSQL;
Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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