Hello serge,
I am trying to do something that must be very simple but I am not getting it and I need your help.
I have a text with 3 or more pages, there is a word in my text named “sightseeing” that appears 9 times in all my text. When I highlight the word I need to know what word “sightseeing” was selected / highlighted among other words “sightseeing”.
Getting the word position in my text I will keep the coordinates in a table and when I close the text any change on it will be discarded. When I open the text again, the word that was selected / highlighted must be found and be highlighted automatic.
Why should I keep the word highlighted in a list table?
Because the text will be used for many users and the words highlighted can’t change the original document, in this table that I will keep the words and positions of them highlighted will be kept with a user code.
How can I do that?
Thanks
Alexandre
Get the word selected
-
- Site Admin
- Posts: 17602
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
Sorry, I am not sure that I understand the problem.
Do you simply need to select all occurrences of the same word?
1) The simplest way is using TRichViewEdit, and a cycle
ApplyStyleConversion requires implementation of OnStyleConversion event.
If you use RichViewActions, you can use TrvActionFontEx instead:
If the document must be read-only, you can temporary assign rve.ReadOnly = False while executing this code.
This method modifies the document. However, as I understand, you can simply discard these changes.
Do you simply need to select all occurrences of the same word?
1) The simplest way is using TRichViewEdit, and a cycle
Code: Select all
while rve.SearchText(...) do
rve.ApplyStyleConversion(...)
If you use RichViewActions, you can use TrvActionFontEx instead:
Code: Select all
rvActionFontEx1.UserInterface := False;
rve.BeginUpdate;
while rve.SearchText(...) do
begin
rvActionFontEx1.Font.Color := clYellow;
rvActionFontEx1.BackColor := clBlue;
rvActionFontEx1.ValidProperties := [rvfimColor, rvfimBackColor];
rvActionFontEx1.ExecuteTarget(rve);
end;
rve.EndUpdate;
rvActionFontEx1.UserInterface := True;
This method modifies the document. However, as I understand, you can simply discard these changes.
-
- Site Admin
- Posts: 17602
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
2) Another option to mark words with color.
RichViewActions includes MarkSearch.pas unit. It has the function MarkSubStringW:
This unit can be used separately from RichViewActions.
It does the same work as the solution (1), but faster, and it does not require TRichViewEdit (it can work both for TRichView and TRichViewEdit).
Disadvantage: it searches in each item separately, so it cannot find words written using multiple fonts.
RichViewActions includes MarkSearch.pas unit. It has the function MarkSubStringW:
Code: Select all
function MarkSubStringW(const s: TRVUnicodeString; Color, BackColor: TColor;
IgnoreCase, WholeWords: Boolean; rv: TCustomRichView;
RVData: TCustomRVData = nil): Integer;
It does the same work as the solution (1), but faster, and it does not require TRichViewEdit (it can work both for TRichView and TRichViewEdit).
Disadvantage: it searches in each item separately, so it cannot find words written using multiple fonts.
-
- Site Admin
- Posts: 17602
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
3) This solution highlights words using the same mechanism that is used to draw wavy underlines for misspelled words.
http://www.trichview.com/support/files/rectmarks.zip contains a unit with the following functions:
procedure AddRectMark(RVData: TCustomRVData; ItemNo, Offs, Len: Integer; Color: TColor); - adds a mark at the specified position. A mark is displayed as a rectangle of the specified Color.
procedure MarkSubstring(rv: TCustomRichView; const s: String; Color: TColor); - marks all occurences of s. This is a sample function, it does not have necessary options (case sensitivity, whole words, etc.). You can modify it yourself.
procedure ClearRectMarks(rv: TCustomRichView); - clears all marks.
Unlike the previous methods, this methods does not change a document structure.
This example draws rectangles around words. I can modify it to shade words (drawing a semitransparent rectangle above them)
Disadvantage: it searches in each item separately, so it cannot find words written using multiple fonts
http://www.trichview.com/support/files/rectmarks.zip contains a unit with the following functions:
procedure AddRectMark(RVData: TCustomRVData; ItemNo, Offs, Len: Integer; Color: TColor); - adds a mark at the specified position. A mark is displayed as a rectangle of the specified Color.
procedure MarkSubstring(rv: TCustomRichView; const s: String; Color: TColor); - marks all occurences of s. This is a sample function, it does not have necessary options (case sensitivity, whole words, etc.). You can modify it yourself.
procedure ClearRectMarks(rv: TCustomRichView); - clears all marks.
Unlike the previous methods, this methods does not change a document structure.
This example draws rectangles around words. I can modify it to shade words (drawing a semitransparent rectangle above them)
Disadvantage: it searches in each item separately, so it cannot find words written using multiple fonts
-
- Posts: 184
- Joined: Wed Jan 18, 2012 6:22 pm
Hello Sergey
I am returning this issue, thanks for your help so far.
But my needs are different from those solutions, although it also helped me with another task.
explanation the problem
I have a text in 3 pages and in all this text the word "sightseeing" appears 9 times in all text. When I click on the word "sightseeing" I collect the word and put in a StringList that will be saved into a table, any change will happen in the original text. Now, imagine that I only collected 5 words "sightseeing" from all my text and all of them were collected from page 2 and 3. In the page 1 there are also the same words, but I didn't collect them.
Now I close the editor and open it again with that same text, I will also open the table that the list of my collected words saved and I want to find those words in the text and color them. Remember that, none word from page 1 were collected, only from page 2 and 3.
to do that, I need something like this:
I need to collect the word with an id or some position of it in my text, so that when I will highlight the words that were collected, I need to know exactly what word must be highlighted.
did you understand?
I am returning this issue, thanks for your help so far.
But my needs are different from those solutions, although it also helped me with another task.
explanation the problem
I have a text in 3 pages and in all this text the word "sightseeing" appears 9 times in all text. When I click on the word "sightseeing" I collect the word and put in a StringList that will be saved into a table, any change will happen in the original text. Now, imagine that I only collected 5 words "sightseeing" from all my text and all of them were collected from page 2 and 3. In the page 1 there are also the same words, but I didn't collect them.
Now I close the editor and open it again with that same text, I will also open the table that the list of my collected words saved and I want to find those words in the text and color them. Remember that, none word from page 1 were collected, only from page 2 and 3.
to do that, I need something like this:
I need to collect the word with an id or some position of it in my text, so that when I will highlight the words that were collected, I need to know exactly what word must be highlighted.
did you understand?
-
- Site Admin
- Posts: 17602
- Joined: Sat Aug 27, 2005 10:28 am
- Contact:
What's the problem exactly, how to store position in a file?
You can use the functions from RVLinear.pas, they allow to get selection as two values: SelStart and SelLength. Use RVGetSelection function.
If you need to convert position specified as (RVData, ItemNo, OffsetInItem) to a numeric position (which can be used as SelStart), use RichViewToLinear function (the second parameter must be rv.RVData, where rv is TRichView passed to the first parameter)
You can use the functions from RVLinear.pas, they allow to get selection as two values: SelStart and SelLength. Use RVGetSelection function.
If you need to convert position specified as (RVData, ItemNo, OffsetInItem) to a numeric position (which can be used as SelStart), use RichViewToLinear function (the second parameter must be rv.RVData, where rv is TRichView passed to the first parameter)
-
- Posts: 184
- Joined: Wed Jan 18, 2012 6:22 pm