TRichViewedit, clear and LoadFromStream

General TRichView support forum. Please post your questions here
Post Reply
Fab85
Posts: 31
Joined: Tue Apr 09, 2024 6:02 am

TRichViewedit, clear and LoadFromStream

Post by Fab85 »

Hello,

In my software, I use a TRichViewEdit to load and save event details in RTF or plainText format from my database. My process is as follows :

Code: Select all

 // saving
 MyTrichviewEdit.clear;
 MyTrichviewEdit.LoadFromStream(AMyStream);
 
And after my end-user can modify it.
Save save result I do a :

Code: Select all

 // loading
 MyTrichviewEdit.SaveToStream(AMyStream);
However, after multiple save/load cycles—especially when using numbered lists—the RTF content grows exponentially. Here is an example of the issue:

Code: Select all

{\rtf1\fbidis\ansi\ansicpg0\uc1\deff0\deflang0\deflangfe0\notvatxbx{\fonttbl{\f0\fnil Arial;}}{\colortbl;}{\stylesheet}{\*\listtable{\list\listtemplateid1938667455
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'02\'03.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'02\'04.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'02\'05.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'02\'06.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'02\'07.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'02\'08.;}{\levelnumbers\'01;}\f0\fs20}
\listid310613696}
{\list\listtemplateid1884369858
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'04\'00.\'01.;}{\levelnumbers\'01\'03;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'06\'00.\'01.\'02.;}{\levelnumbers\'01\'03\'05;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'08\'00.\'01.\'02.\'03.;}{\levelnumbers\'01\'03\'05\'07;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'0A\'00.\'01.\'02.\'03.\'04.;}{\levelnumbers\'01\'03\'05\'07\'09;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'0C\'00.\'01.\'02.\'03.\'04.\'05.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'0E\'00.\'01.\'02.\'03.\'04.\'05.\'06.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'10\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'12\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F\'11;}\f0\fs20}
\listid1180602062}
{\list\listtemplateid335005709
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'02\'03.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'02\'04.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'02\'05.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'02\'06.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'02\'07.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'02\'08.;}{\levelnumbers\'01;}\f0\fs20}
\listid1466835013}
{\list\listtemplateid872348512
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'04\'00.\'01.;}{\levelnumbers\'01\'03;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'06\'00.\'01.\'02.;}{\levelnumbers\'01\'03\'05;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'08\'00.\'01.\'02.\'03.;}{\levelnumbers\'01\'03\'05\'07;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'0A\'00.\'01.\'02.\'03.\'04.;}{\levelnumbers\'01\'03\'05\'07\'09;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'0C\'00.\'01.\'02.\'03.\'04.\'05.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'0E\'00.\'01.\'02.\'03.\'04.\'05.\'06.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'10\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'12\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F\'11;}\f0\fs20}
\listid1621159140}
{\list\listtemplateid1886844539
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'02\'03.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'02\'04.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'02\'05.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'02\'06.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'02\'07.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'02\'08.;}{\levelnumbers\'01;}\f0\fs20}
\listid491438188}
{\list\listtemplateid85046302
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'04\'00.\'01.;}{\levelnumbers\'01\'03;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'06\'00.\'01.\'02.;}{\levelnumbers\'01\'03\'05;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'08\'00.\'01.\'02.\'03.;}{\levelnumbers\'01\'03\'05\'07;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'0A\'00.\'01.\'02.\'03.\'04.;}{\levelnumbers\'01\'03\'05\'07\'09;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'0C\'00.\'01.\'02.\'03.\'04.\'05.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'0E\'00.\'01.\'02.\'03.\'04.\'05.\'06.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'10\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'12\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F\'11;}\f0\fs20}
\listid1395687578}
{\list\listtemplateid52343049
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'02\'03.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'02\'04.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'02\'05.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'02\'06.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'02\'07.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'02\'08.;}{\levelnumbers\'01;}\f0\fs20}
\listid993172786}
{\list\listtemplateid1050614780
{\listlevel\levelnfc0\leveljc0\li360\fi-360\jclisttab\tx360\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1080\fi-360\jclisttab\tx1080\levelstartat1{\leveltext\'04\'00.\'01.;}{\levelnumbers\'01\'03;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li1800\fi-360\jclisttab\tx1800\levelstartat1{\leveltext\'06\'00.\'01.\'02.;}{\levelnumbers\'01\'03\'05;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li2520\fi-360\jclisttab\tx2520\levelstartat1{\leveltext\'08\'00.\'01.\'02.\'03.;}{\levelnumbers\'01\'03\'05\'07;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3240\fi-360\jclisttab\tx3240\levelstartat1{\leveltext\'0A\'00.\'01.\'02.\'03.\'04.;}{\levelnumbers\'01\'03\'05\'07\'09;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li3960\fi-360\jclisttab\tx3960\levelstartat1{\leveltext\'0C\'00.\'01.\'02.\'03.\'04.\'05.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li4680\fi-360\jclisttab\tx4680\levelstartat1{\leveltext\'0E\'00.\'01.\'02.\'03.\'04.\'05.\'06.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li5400\fi-360\jclisttab\tx5400\levelstartat1{\leveltext\'10\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F;}\f0\fs20}
{\listlevel\levelnfc0\leveljc0\li6120\fi-360\jclisttab\tx6120\levelstartat1{\leveltext\'12\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08.;}{\levelnumbers\'01\'03\'05\'07\'09\'0B\'0D\'0F\'11;}\f0\fs20}
\listid192020465}
...
Read your documentation calling Clear does not delete styles, causing an accumulation of redundant \listtable entries (numbering case).

I noticed that your TDBRichViewEdit component includes the method:

Code: Select all

 MyTrichviewEdit.DeleteUnusedStyles(True, True, True);
Would calling this method be enough to solve the problem?

Or would it be better to completely clear all styles before loading new content, before LoadFromStream, like this ?

Code: Select all

  MyTrichviewEdit.Style.ListStyles.Clear
What would be the recommended approach to prevent this excessive growth of RTF data in a savefromStream/loadFromStream context and keep better performances ?
Sergey Tkachenko
Site Admin
Posts: 17805
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: TRichViewedit, clear and LoadFromStream

Post by Sergey Tkachenko »

Yes, list styles may be accumulated when loading RTF and DocX, and DeleteUnusedStyles is the solution.
Call it just after loading the document, before calling Format.
If you use "save-and-exit" command, you can also call it just before saving. It's not recommended to call DeleteUnusedStyles if you continue editing, because this method makes information in the undo buffer incorrect (and requires calling DeleteUndo).

Resetting styles before loading may be mainly useful to speed up loading, but is not necessary.
Post Reply