RichEdit w D2007 i XE2.

0

Witam,
mam taki problem z RichEdit przechodzę z Delphi 2007 na XE2, potem może wyżej teraz mam taką wersje i to jest dla mnie wyzwanie techniczne.
Chętnie zapytam się Was o podpowiedź, mam jakieś przemyślenia na ten temat ale może ten temat jest wam lepiej znany.

W aplikacji D2007 wprowadzam tekst do RichEdit i zapisuje w bazie:
//zapisuje do MemoryStream

ms := TMemoryStream.Create;
RichEdit1.Lines.SaveToStream(ms);

i jako insertuje do bazy ms sql.

W bazie wygląda to tak - przykładowy fragment z kolumny:

<ort>{\rtf1\fbidis\ansi\ansicpg1250\deff0\deflang1045{\fonttbl{\f0\froman\fprq2\fcharset238{*\fname Times New Roman;}Times New Roman CE;}{\f1\fswiss\fprq2\fcharset238 Calibri;}{\f2\fnil Tahoma;}}
\viewkind4\uc1\pard\ltrpar\lang1024\b\f0\fs22 P4219 32 C00 AL 2 EU TAB LH/RH (nowy projekt) MFA - wykonalne z propozycj'b9
\par \ul\b0 SOP:\lang1045\f1 \lang1024\strike\f0 2015-10-01\strike0 2016-05-01 Volume: 163.000 rok EOP : 01.11.2021 Tkaniny: NC 031 PP 8.2015
\par PSW - BRAK
\par
\par \ulnone 2015-07-27 - PPAP zaplanowany na 2015-08-07
\par 03.08.2015 Wyci'eate, PPAP w toku. Odp.
\par 10.08.2015 PPAP wys'b3any odp.
\par 17.08.2015 PSW brak odp.
\par 24.08.2015/31.08.2015/07.09.2015 PSW brak odp.
\par \tab Zam'f3wienia seryjne od 07.09.2015 odp.
\par 14.09.2015 PSW Brak - odp. A.D'b9
\par Do wyja'9cnienia zam'f3wienia odp
\par 28.09.2015 PSW Dost'eapne odp. A.D'b9d
\par Brak zam'f3wie'f1 seryjnych odp. R.Ko
\par 05.10.2015/12.10.2015/26.10.2015/02.11.2015/09.1 /23.11.2015/30.11.2015 Brak zam'f3wie'f1 odp.
\par 14.12.2015/21.12.2015 Zam'f3wienia od stycze'f1 2016 odp. R.Kopcik
\par 11.01.2016/18.01.2016/25.01.2016/01.02.2016/08.02.2016/15.02.2016/29.02.2016 Brak zam'f3wie'f1 odp. .
\par Info z Jest ju'bf indeks E00.
\par \pard\ltrpar\lang1045\f2\fs16
\par }
</ort>

Potem odczytuje te dane, funkcją load z bazy

ms:= TMemoryStream.Create;
ms.Clear;
ms.Write (PAnsiChar(rtfString)^, Length(rtfString));
ms.Position:= 0;
RichEdit1.PlainText:= False;
RichEdit1.Lines.LoadFromStream(ms);

i jest ok, ładnie się wyświetla, trzyma format wprowadzonego tekstu.

Niestety po zmianie na DelphiXE2 odczyt z bazy jest niepoprawny, jakby kody znaków zostały pozmieniane.
w okienku Richtext mam niesformatowany tekst:

{\rtf1\fbidis\ansi\ansicpg1250\deff0\defla                                           ng1045{\fonttbl{\f0\froman\fprq2\fcharset2                                                                                  38{\*\fname Times New Roman;}Times New                             Roman CE;}{\f1\fswiss\fprq2 \fcharset238 Calibri                                         ;}{\f2\fnil Tahoma;}}                                             \viewkind4\uc1\pard\ltrpar\lang1024\b\f0\ fs22 P4219331C00/P4219332 C00 ALFA 952                                                      EU TAB LH/RH (nowy projekt) MFA - wykonalne z propozyc                                                j\'b9            \par \ul \b0 SOP:\lang1045\f1                         \lang1024          \strike\f0 2015-10-01\strike0   2016-05-01                                                                                    Volume: 163.000 rok EOP : 01.11.2021 T                                        kaniny: NCV 99040  07.0          

Droga Redakcjo i Czytelnicy! co robić?
Pozdrawia
Piotr

2

W nowych Delphi (zdaje się od 2009) jak wiadomo jest Unicode więc pewnie należałoby kombinować w tym kierunku. Może coś takiego:

ms.Write(TEncoding.Unicode.GetBytes(rtfString), Length(rtfString) * SizeOf(Char));
0

Udało mi się w Delphi XE2 odczytać do pola richedit, nadal musze utrzymywać dwa środowiska równocześnie: delphi 2007 i delphi xe.
Muszę przerobić procedurę w delphi 2007 - i tu jest problem w d2007 nie ma takiego unitu: TEncoding.ANSI, google mówi że od wersji 2009 i w ogóle nie można tego obejść.

 ms := TStringStream.Create(rtfstring, TEncoding.ANSI);
    ms.Seek(0, TSeekOrigin.soBeginning);
    RichEdit1.Lines.LoadFromStream(ms);
4

Skoro masz poprawny kod dla obu środowisk do stosuj dyrektywy kompilatora i umieść w nich odpowiednie fragmenty kodu:

  {$IF CompilerVersion > 19}
  //kod dla Delphi 2009 i nowszych
  {$ELSE}
  //kod dla starszych wersji Delphi
  {$IFEND}
0

tak juz wcześniej uczyniłem, i udało się skompilować. Zastanawiam się nad automatycznym przełączaniem, jeśli będą dwie wersje zapisywać do bazy jedna w ansi a druga w unicode to wersja Delphi2007 powinna sobie poradzić z odczytem unicode - a ona tego nie wspiera - nad tym teraz rozmyślam.
Dziękuje za dobre podpowiedzi.

1

Tutaj nie ma dobrej odpowiedzi można wymusić używanie AnsiString w nowych Delphi ale to bezsensu gdyż Unicode zapewnia poprawne kodowanie znaków i szkoda z tego rezygnować. Dla starych wersji Delphi które natywnie nie wspiera Unicode są kontrolki firm trzecich np. http://www.yunqa.de/delphi/products/tntunicodecontrols/index w Jedi też jest jakiś moduł od obsługi Unicode https://sourceforge.net/projects/jcl/ nie wiem po co masz RichEdit może dałoby się użyć zamiast niego SynEdit https://sourceforge.net/projects/synedit/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.