There is something funny going on with TRichEdit (D7).

When I use SelAttributes on a selected text portion with RichEdit.WordWrap 
set to false,
all the positionng is correctly done.  But when I do the same thing with 
RichEdit.WordWrap
set to true, positioning is offset by CRLF functions in SOME RichEdits, but 
not in others!

So if I turn RichEdit.WordWrap to False, then do the text selection and 
SelAttributes,
then set RichEdit.WordWrap to True (for visual readability purposes), the 
text in SOME
RichEdits goes into the formatted rich text description instead of the 
original text.

In all RichEdits, I have PlainText set to False.  I'm using four RichEdits, 
and they all have
the exact same property values, as verified in the object inspector.

Here's the latest code:

var OldStyle : TFontStyles;
    OldColor : TColor;

procedure TfmGetAllHRSectionsOfAPatentString.HighlightWord( RichEdit  : 
TRichEdit;
                                                            TotalLen  : 
Integer;
                                                            LineCount : 
Integer;
                                                            I, Len    : 
Integer );
begin
  RichEdit.SelStart  := I-1;
  RichEdit.SelLength := Len;
  RichEdit.SelAttributes.Color := clRed;
  RichEdit.SelAttributes.Style := [fsBold];

  RichEdit.SelLength := 0;
  RichEdit.SelStart  := TotalLen;
  RichEdit.SelAttributes.Style := OldStyle;
  RichEdit.SelAttributes.Color := OldColor;
end;

procedure TfmGetAllHRSectionsOfAPatentString.HighlightKeyWords( RichEdit : 
TRichEdit );
var TotalCharCount : Integer;
    LastChar       : Char;
    NextChar       : Char;
    I,L            : Integer;
    AWord          : string;
    EndOfWord      : Boolean;
    TheText        : string;
    LineCount      : Integer;
begin
  {Highlight keywords and their synonyms}
  OldStyle       := RichEdit.SelAttributes.Style;
  OldColor       := RichEdit.SelAttributes.Color;
  TheText        := RichEdit.Lines.Text;
  TotalCharCount := Length(TheText);
  NextChar       := ' ';
  I              := 1;
  LineCount      := 0;
  RichEdit.Lines.BeginUpdate;
  while (I<(TotalCharCount-1)) do
  begin
    LastChar := NextChar;
    NextChar := TheText[I];
    if   NextChar=#$D
    then LineCount := LineCount+1
    else if   IsSeparator(LastChar)
         then if   IsAlpha(NextChar)
              then begin
                     L := 1;
                     EndOfWord := False;
                     while (  ((I+L)<=TotalCharCount)
                           and(not EndOfWord)) do
                     begin
                       if   IsSeparator(TheText[I+L])
                       then begin
                              AWord := Copy(TheText,I,L);
                              if 
(KeysPlusSynonyms.IsBoundString(AWord)>-1)
                              then HighlightWord( RichEdit,
                                                  TotalCharCount,
                                                  LineCount,
                                                  I,
                                                  L);
                              EndOfWord := True;
                            end;
                       L := L+1;
                     end;
                     NextChar := TheText[I+L-1];
                     I        := I+L-1;
                   end;
    I := I+1;
  end;
  RichEdit.Lines.EndUpdate;
  RichEdit.Invalidate;
  Application.ProcessMessages;
end;


And in the main routine, three RichEdits are called:
...
           HighLightKeywords(reDescription);
           HighLightKeywords(reClaims);
           HighLightKeywords(reAbstract);
...

Here is the text copied from a RichEdit with WordWrap set to True:

BACKGROUND OF INVENTION

This invention relates generally to computer systems and more specifically 
to the memory portions of such systems. The subject matter of this invention 
is related to the subject matter of the prior inventions entitled 
GARBAGE-COLLECTING MEMORY MODULE, Ser. No. 07/994,517, filed Dec. 21, 1992 
(now U.S. Pat. No. 5,560,003, issued Sep. 24, 1996) and OBJECT SPACE MANAGER 
CIRCUIT, Ser. No. 08/176,940, filed Jan. 4, 1994, (pending).

As you can see, the red bold font only works properly for the first four 
keywords, which happen to be on the first

line of text.  After that, the red bold font is spaced away by a multiple of 
the number of lines.

If I then turn WordWrap off and back on, the formatting text appears:

--------------------------------------------------------------------------

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil MS Sans Serif;}}

{\colortbl ;\red255\green0\blue0;}

\viewkind4\uc1\pard\f0\fs16 BACKGROUND OF INVENTION

\par

\par \cf1\b This\cf0\b0 invention relates generally to computer systems 
\cf1\b and\cf0\b0 more specifically to \cf1\b the\cf0\b0 memory portions of 
such systems. \cf1\b The\cf0\b0 subject matter of th\cf1\b is i\cf0\b0 
nvention is\cf1\b r\cf0\b0 elated to th\cf1\b e s\cf0\b0 ubject matter of 
th\cf1\b e p\cf0\b0 rior inventions entitled GARBAGE-COLLECTING MEMORY 
MODULE, Ser. No. 07/994,517, filed Dec. 21, 1992 (now U.S. Pat. No. 
5,560,003, issued Sep. 24, 1996) and \cf1\b OBJ\cf0\b0 ECT SPACE MANAGER 
CIRCUIT, Ser. No. 08/176,940, filed Jan. 4, 1994, (pending).

\par

------------------------------------------------- 

Trying to do it programmatically by first setting WordWrap := False, then 
marking
the SelAttributes, then setting WordWrap := True doesn't work, as it 
generates the
formatting text instead of the readable text.

Does anyone know why this is happening, and what I can do
about it?

Thanks,
Rich

_______________________________________________
Delphi mailing list -> Delphi@elists.org
http://www.elists.org/mailman/listinfo/delphi

Reply via email to