trichview.support
Re: Indenting on the fly |
Author |
Message |
David Kroll |
Posted: 10/15/2003 22:30:33 Brilliant! That works perfectly! Thanks for the help. "Sergey Tkachenko" <[email protected]> wrote in message news:[email protected]... > Loaded RTF is not necessary has 0-th paragraph style (if "Allow adding > styled dynamically" is set) > > I suggest the following code (again, it requires "Allow adding styled > dynamically"setting) > > > rtfStream := TStringStream.Create(oMessage.Text); > try > editor.Clear; > if MessageType in [mtReply, mtForward] then > begin > //This is the top of the message > editor.AddNL('', 0, 1); > editor.AddNL('', 0, 1); > > //This is the original message and will be indented > editor.AddNL('---- Original Message ----', 0, 0); > editor.AddNL('From: ' + oMessage.SenderAddress, 0, 0); > editor.AddNL('Sent: ' + DateTimeToStr(oMessage.Timestamp), 0, 0); > editor.AddNL('To: ' + GetRecipientString(oMessage), 0, 0); > editor.AddNL('Subejct: ' + oMessage.Subject, 0, 0); > editor.AddNL('', 0, 0); > > // disallowing LoadRTFFRomStream to use 0-th and 1st styles > ParaStyleCount := editor.Style.ParaStyles.Count; > editor.Style.ParaStyles[0].LeftIndent := -1000; > editor.Style.ParaStyles[1].LeftIndent := -1000; > > // inserting RTF > editor.LoadRTFFromStream(rtfStream); > > // restoring indents of 0-th and 1st styles > editor.Style.ParaStyles[0].LeftIndent := 25; > editor.Style.ParaStyles[1].LeftIndent := 0; > > // indenting loaded RTF > for i := ParaStyleCount to editor.Style.ParaStyles.Count-1 do > editor.Style.ParaStyles[i].LeftIndent := > editor.Style.ParaStyles[i].LeftIndent+25; > end; > editor.Format; > finally > rtfStream.Free; > end; > > > > > Sergey, > > > > I got it to work, almost. The first two blank lines are style 1, the > > original message is style 0. After loading the rtf, I call editor.Format, > > then set the LeftIndent of Style 0 to 25 and call editor.Format. This > works > > well, but I have one problem. If the rtf had areas that were indented, > > those areas are put back to 25. For instance, if I reply to a message > that > > had been replied to, I should have something like: > > > > > > -- Original Message -- > > From: > > Subject: > > > > Body of replied to message. > > > > -- Original Message -- > > From: > > Subject: > > > > Body of Original message. > > > > > > Any suggestions? > > > > rtfStream := TStringStream.Create(oMessage.Text); > > try > > editor.Clear; > > if MessageType in [mtReply, mtForward] then > > begin > > //This is the top of the message > > editor.AddNL('', 0, 1); > > editor.AddNL('', 0, 1); > > > > //This is the original message and will be indented > > editor.AddNL('---- Original Message ----', 0, 0); > > editor.AddNL('From: ' + oMessage.SenderAddress, 0, 0); > > editor.AddNL('Sent: ' + DateTimeToStr(oMessage.Timestamp), 0, 0); > > editor.AddNL('To: ' + GetRecipientString(oMessage), 0, 0); > > editor.AddNL('Subejct: ' + oMessage.Subject, 0, 0); > > editor.AddNL('', 0, 0); > > end; > > editor.LoadRTFFromStream(rtfStream); > > editor.Format; > > > > //This indents the original message portion > > if MessageType in [mtReply, mtForward] then > > begin > > editor.Style.ParaStyles[0].LeftIndent := 25; > > editor.Format; > > end; > > finally > > rtfStream.Free; > > end; > > > > "Sergey Tkachenko" <[email protected]> wrote in message > > news:[email protected]... > > > TRVStyle component (linked to this editor) contains collections of text > > > styles (defining text fonts, colors, etc.) and paragraph styles > (defining > > > paragraph alignments, indents, etc.). They are available as properties > > > TextStyles and ParaStyles. > > > You can edit these collections at run time or at design time. > > > For example, you can define two text styles (for normal text and for > bold > > > text) and use their indices as the second parameter of AddNL. > > > (NOTE: the second patameter of AddNL is an index in > > editor.Style.TextStyles; > > > editor.Style.ItemNo must not be used here, it is a completely different > > > value). > > > Besides, you can define a paragraph style with the proper LeftIndent and > > use > > > its index as the third parameter of AddNL. > > > > > > The main problem is identing text loaded from rtfStream. > > > I can suggest the following solution: > > > 1) Make sure that "Allow adding styles dynamically" is set in the > > component > > > editor for this TRichViewEdit (in Delphi, right click this > TRichViewEdit, > > > choose "Settings" in the context menu). > > > 2) Make sure that TRVStyle component linked to this TRichViewEdit (as > > > editor.Style) is not linked to any other TRichViewEdit > > > 3) Store the number of paragraph styles before the RTF loading in a > > > variable: > > > ParaStyleCount := editor.Style.ParaStyles.Count; > > > 4) LoadRTFFromStream will add paragraph styles in > > > editor.Style.ParaStyles.Count. After loading, increase left indent of > > these > > > styles: > > > for i := ParaStyleCount to editor.Style.ParaStyles.Count-1 do > > > editor.Style.ParaStyles[i].LeftIndent := > > > editor.Style.ParaStyles[i].LeftIndent+30; > > > > > > That's all. Well, almost all. There may be a problem: LoadRTFFromStream > > may > > > reuse some existing paragraph styles that is already in the collection > > > instead of adding new styles (if some paragraph in RTF has the same > > > attributes as existing paragraph styles). > > > You can use a trick to avoid this: > > > - after the step 3, temporary assign to existing paragraph styles some > > > properties that cannot be in RTF. For example, set LeftIndent to -1000: > > > for i := 0 to ParaStyleCount-1 do > > > editor.Style.ParaStyles[i].LeftIndent := -1000; > > > - after the step 4, restore their left indents: > > > for i := 0 to ParaStyleCount-1 do > > > editor.Style.ParaStyles[i].LeftIndent := 0; > > > > > > > > > > I am loading a TRichViewEdit and want to indent some text on the fly. > > > This > > > > is for replying to a mail message, so the original message will be > > > indented. > > > > I'm not sure how to do this. Please see the code below. > > > > > > > > > > > > |
Powered by ABC Amber Outlook Express Converter