[Delphi] RTF do databáze

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dyžon 26. 8. 2017 11:21

zdravím,
potřeboval bych dostat formátovanej text RTF do databáze a zpět.
zkoušel jsem použít DBRichEdit i obyčejný TRichEdit
Ukládal jsem ho jak do WARCHAR, tak i do BLOB, PlainText:= True i False.
TRichEdit do BLOB:
Kód: Vybrat vše
//uložit
var ms: TMemoryStream;
//         .....
  ms := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(ms);
  ms.Seek(0, soFromBeginning) ;
 
  IBQuery1.Active:= True;
  IBQuery1.Insert;
  TBlobField(IBQuery1.FieldByName('POPIS')).LoadFromStream(ms);
  IBQuery1.Post;

  FreeAndNil (ms);
end;

//načíst
var ms: TMemoryStream;
//         .....
  ms := TMemoryStream.Create;
  IBQuery1.Active:= True;
  TBlobField(IBQuery1.FieldByName('POPIS')).SaveToStream(ms);
  ms.Seek(0, soFromBeginning) ;
  RichEdit2.Lines.LoadFromStream(mS);
 
  FreeAndNil (ms);

TRichEdit do WARCHAR
Kód: Vybrat vše
//uložit
var textPopisu: AnsiString;
    ms: TMemoryStream;
//         .....
  ms := TMemoryStream.Create;
  ms.Clear;

  RichEdit1.Lines.SaveToStream(ms);
  ms.Position := 0;

  if (ms.Size > 0) then begin
    SetLength(textPopisu, ms.Size);
    if (ms.Read(textPopisu[1], ms.Size) <= 0) then
        raise EStreamError.CreateFmt('End of stream reached with %d bytes left to read.',[stream.Size]);
  end;

  ms.Free;
  IBQuery1.FieldByName('POPIS').AsAnsiString := textPopisu;

//načíst
var textPopisu: AnsiString;
    ms: TMemoryStream;
//         .....
  textPopisu := sql.FieldByName('POPIS').AsAnsiString;

  ms := TMemoryStream.Create;
  ms.Clear;
  ms.Write(PAnsiChar(textPopisu)^, Length(textPopisu));
  ms.Position := 0;
  RichEdit2.Lines.LoadFromStream(ms);

  ms.Free;

bohužel se mi nedaří do RichEdit2 dostat zformátovanej text, kterej sem napsal do RichEdit1 ..(barva písma, velikost, font)
můžete mi s tím prosím někdo pomoct, na netu jsem přečetl spoustu rad, ale žádná mi nefunguje.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar


Odeslat příspěvekod Nargon 26. 8. 2017 16:02

Delphi neznám, ale jseš si jistý že funkce: RichEdit1.Lines.SaveToStream(ms); uloží do streamu vše, včetně formátování textu?

Já dělám v C# a tam vím že RichTextBox (nejspíš obdoba RichEditu v Delphi) v "Lines" obsahuje jen a pouze holý text bez formátovacích značek. Možná to v delphi funguje jinak, ale pro jistotu si to zkontroluj. Než budeš hledat problémy někde v databázi tak si to zkus jen zobrazit na obrazovku. RFT formát je lidsky čitelný text a formátovací značky jsou tam dobře identifikovatelné. Jestli tam máš jen holý text tak to bude zdroj tvého problému.

Uvádím příklad RFT formátu:
Kód: Vybrat vše
{\rtf1\ansi\ansicpg1250\deff0\deflang1029{\fonttbl{\f0\fnil\fcharset0 Calibri;}{\f1\fnil\fcharset238 Calibri;}}
{\colortbl ;\red255\green0\blue0;}
\viewkind4\uc1\pard\highlight1\lang1033\f0\fs24 Test\highlight0\lang1029\f1\par
}

Tento zápis obsahuje slovo "Test" napsaný fontem Calibri o velikosti 12pt a pozadí textu je červené.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod dyžon 27. 8. 2017 10:21

děkuji vám oboum,
řešením bylo použít TStringStream.DataString

jen mě zmátlo, že když existuje komponenta TDBRichEdit, tak jsem myslel, že ukládání do DB v RTF už bude mít v sobě.
podle mě by šlo poupravit TDBRichEdit, aby to fungovalo rovnou, ale ikdyž se zároveň snažím učit tvořit vlastní komponenty, tak na tohle si zatím netroufám.

pokud byste měl někdo čas a chuť se tím zabývat, tak to prosím sem postněte.
myslím, že je potřeba jen změnit Value, ktery se odesílá do DB a opačně změnit Value z DB na RTF text, ale vůbec nevím, ve kterých je to procedurách.

ještě jednou díky za pomoc.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků