Moving the Caret Position

General TRichView support forum. Please post your questions here
Post Reply
viperpix
Posts: 39
Joined: Sat Jan 15, 2011 9:38 am

Moving the Caret Position

Post by viperpix »

Hi, im a new fan of your products.
i've recently downloaded the trial version of trichview, that is GREAT!!!
I've also found that in a mixed text, object are known as "item"s, but only thing that i couldn't understand was that "How can i move the Caret Position before/after a specified Item?"
i would like verryy much to buy this component, but i need this ability too!
Thanks.
Sergey Tkachenko
Site Admin
Posts: 17569
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko »

If you know ItemNo in the document of rve: TRichViewEdit:
Before the item:

Code: Select all

rve.SetSelectionBounds(ItemNo, rve.GetOffsBeforeItem(ItemNo),
  ItemNo, rve.GetOffsBeforeItem(ItemNo));
After the item:

Code: Select all

rve.SetSelectionBounds(ItemNo, rve.GetOffsAfterItem(ItemNo),
  ItemNo, rve.GetOffsAfterItem(ItemNo));
----
To move the caret to the beginning of the ItemNo-th item in the table cell:

Code: Select all

uses CRVData;

var RVData: TCustomRVFormattedData;

RVData := TCustomRVFormattedData(table.Cells[r,c].Edit);
RVData.SetSelectionBounds(ItemNo, RVData.GetOffsBeforeItem(ItemNo),
  ItemNo, RVData.GetOffsBeforeItem(ItemNo));
viperpix
Posts: 39
Joined: Sat Jan 15, 2011 9:38 am

Moving the Caret Position

Post by viperpix »

Thanks for ur help, but here's the thing:
I just want to move the caret at before and after all images in rve and put those images in new lines by pressing "enter" at before and after each of them;
but i'm wondering why the Enter code (#13#10) wont work in RVE!
How can i achieve this?
Thanks.
Sergey Tkachenko
Site Admin
Posts: 17569
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko »

Code: Select all

procedure PicturesToNewLines(RVData: TCustomRVData; rve: TCustomRichViewEdit);
var i,r,c: Integer;
    table: TRVTableItemInfo;
begin
   for i := RVData.ItemCount-1 downto 0 do
     case RVData.GetItemStyle(i) of
       rvsPicture, rvsHotPicture:
         begin
           if (i<>RVData.ItemCount-1) and not RVData.IsFromNewLine(i+1) then begin
             RVData := RVData.Edit;
             TCustomRVFormattedData(RVData).SetSelectionBounds(
               i, RVData.GetOffsAfterItem(i), i, RVData.GetOffsAfterItem(i));
             SendMessage(rve.Handle, WM_KEYDOWN, VK_RETURN, 0);
           end;
           if not (RVData.IsFromNewLine(i) or ((i>0) and (RVData.GetItemStyle(i-1)=rvsListMarker))) then begin
             RVData := RVData.Edit;
             TCustomRVFormattedData(RVData).SetSelectionBounds(
               i, RVData.GetOffsBeforeItem(i), i, RVData.GetOffsBeforeItem(i));
             SendMessage(rve.Handle, WM_KEYDOWN, VK_RETURN, 0);
           end;
         end;
       rvsTable:
         begin
           table := TRVTableItemInfo(RVData.GetItem(i));
           for r := 0 to table.RowCount-1 do
             for c := 0 to table.ColCount-1 do
               if table.Cells[r,c]<>nil then
                 PicturesToNewLines(table.Cells[r,c].GetRVData, rve);
         end;
     end;
end;
Call:

Code: Select all

  PicturesToNewLines(RichViewEdit1.RVData, RichViewEdit1);
PS: rve.InsertText(#13#10) can be used instead of SendMessage(rve.Handle, WM_KEYDOWN, VK_RETURN, 0). But in the current version, InsertText has a little problem, so results will not be optimal with it.
viperpix
Posts: 39
Joined: Sat Jan 15, 2011 9:38 am

Moving the Caret Position

Post by viperpix »

Thanks again for ur answer, thats helpful. but i really need to have "Enter" ability, so maybe i should use the sendmessage function instead of inserttext! but its not a good idea in all times!
maybe i should wait for an update for RVE which solves this problem.
but for now i think i can handle it by message function.
Thanks for ur guidance.
Sergey Tkachenko
Site Admin
Posts: 17569
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko »

Actually, the only problem with InsertText(#13#10) after a picture is that it adds unnecessary empty text item after the picture. It is not noticeable - you will not see the difference if you replace SendMessage to InsertText in the code above.
But the condition for checking if the picture already ends a paragraph (not RVData.IsFromNewLine(i+1)) does not work with this empty text line, so when this code is called for the second time, empty lines are added after pictures.
A fix will be added in a beta version for registered users later in this weak.
As for the trial version, we plan to update it in the end of this month or at the beginning of the next month.
Post Reply