trichview.support
Re: Indenting on the fly |
Author |
Message |
Sergey Tkachenko |
Posted: 10/15/2003 22:12:16 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" <svt@trichview.com> wrote in message > news:3f8d82db$2@support.torry.net... > > 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