height of paragraph at position

General TRichView support forum. Please post your questions here
Post Reply
blsstdok
Posts: 25
Joined: Tue Jun 07, 2011 2:36 pm

height of paragraph at position

Post by blsstdok » Mon Nov 28, 2011 11:04 pm

What is the best way to get the pixel height of a paragraph at any given point in the document? I assume this would be two steps -- 1. Get the paragraph and 2. find it's height.

Thanks.

Sergey Tkachenko
Site Admin
Posts: 13158
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko » Tue Nov 29, 2011 7:10 am

It's possible by calculating positions of all items, but may be a more simple solution possible.
What do you want to implement?

blsstdok
Posts: 25
Joined: Tue Jun 07, 2011 2:36 pm

Post by blsstdok » Tue Nov 29, 2011 3:04 pm

It's complicated, but basically I want to make subtle adjustments to the indentation, reformat, and test to be sure I haven't changed the vertical size of the paragraph due to wrapping. I also need to know the horizontal size of each line in the paragraph.

Sergey Tkachenko
Site Admin
Posts: 13158
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko » Sun Dec 04, 2011 8:48 pm

This calculation requires using "drawing items" which are undocumented.

The example is shown below. It calculates the height of the current paragraph (the paragraph containing the caret).
If you have the specified position in the document - (RVData, ItemNo), you can use them instead of (rve.RVData, rve.CurItemNo).

Code: Select all

uses DLines;

var FirstItemNo, LastItemNo: Integer;
    i, FirstDItemNo, LastDItemNo: Integer;
    rve: TCustomRichViewEdit;
    Top, Bottom: Integer;
    DrawItem: TRVDrawLineInfo;
    ParaStyle: TParaInfo;
begin
  rve := RichViewEdit1.TopLevelEditor;
  rve.RVData.ExpandToPara(rve.CurItemNo, rve.CurItemNo, FirstItemNo, LastItemNo);
  rve.RVData.Item2FirstDrawItem(FirstItemNo, FirstDItemNo);
  rve.RVData.Item2LastDrawItem(LastItemNo, LastDItemNo);
  DrawItem := rve.RVData.DrawItems[FirstDItemNo];
  Top := DrawItem.Top-DrawItem.ExtraSpaceAbove;
  Bottom := DrawItem.Top+DrawItem.Height+DrawItem.ExtraSpaceBelow;
  for i := FirstDItemNo+1 to LastDItemNo do begin
    DrawItem := rve.RVData.DrawItems[i];
    if Top>DrawItem.Top-DrawItem.ExtraSpaceAbove then
      Top := DrawItem.Top-DrawItem.ExtraSpaceAbove;
    if Bottom<DrawItem.Top+DrawItem.Height+DrawItem.ExtraSpaceBelow then
      Bottom := DrawItem.Top+DrawItem.Height+DrawItem.ExtraSpaceBelow;
  end;
  ParaStyle := rve.Style.ParaStyles[rve.GetItemPara(FirstItemNo)];
  dec(Top, ParaStyle.SpaceBefore);
  inc(Bottom, ParaStyle.SpaceAfter);

  Caption := 'Current paragraph height: '+IntToStr(Bottom-Top);
end;
A document must be formatted when you call this procedure. This procedure ignores left- and right-aligned objects.

Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 4 guests