Coordinate of Controls whicht are inside table cells

General TRichView support forum. Please post your questions here
Post Reply
BernhardRoos
Posts: 104
Joined: Mon Nov 26, 2007 1:49 pm

Coordinate of Controls whicht are inside table cells

Post by BernhardRoos »

Hello,

we have problem to determine the y coord of controls which are inside a table cell, which are longer than the screen height of the Richview.

We are using

TRichView(c.Parent).GetItemCoords(TRichView(c.Parent).FindControlItemNo(c), x, y);

y has the correct value if the height of the table cell isn't higher than the height of the Richview component. Otherwise I get a wrong value.

Any ideas?

What I want to do is, that the Richview scroll to the control if the control get the focus. Can I do this with another method like for example Richview.ControlInView(c) or something else?

Best wishes
Bernhard
Sergey Tkachenko
Site Admin
Posts: 17561
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Post by Sergey Tkachenko »

GetItemCoords returns coordinates related the cell inplace editor.
They can be recalculated, but I suggest this method:

Code: Select all

var RVData:TCustomRVData;
     ItemNo: Integer;

FindControlLocation(RichViewEdit1.RVData, c, RVData, ItemNo);
RichViewEdit1.GetItemCoordsEx(TCustomRVFormattedData(RVData), ItemNo, 0, True, ControlCoords)
// if you need client coordinates in RichViewEdit:
R.TopLeft := RichViewEdit1.DocumentToClient(R.TopLeft);
R.BottomRight := RichViewEdit1.DocumentToClient(R.BottomRight);
where

Code: Select all

function FindControlLocation(RVData: TCustomRVData; ctrl: TControl; 
                              var CtrlRVData: TCustomRVData; 
                              var CtrlItemNo: Integer): Boolean; 
var i,r,c: Integer; 
    table: TRVTableItemInfo; 
begin 
  Result := False; 
  for i := 0 to RVData.Items.Count-1 do 
    case RVData.GetItemStyle(i) of 
      rvsComponent: 
        begin 
          Result := TRVControlItemInfo(RVData.GetItem(i)).Control=ctrl; 
          if Result then begin 
            CtrlRVData := RVData.GetSourceRVData; 
            CtrlItemNo := i; 
            exit; 
          end; 
        end; 
      rvsTable: 
        begin 
          table := TRVTableItemInfo(RVData.GetItem(i)); 
          for r := 0 to table.Rows.Count-1 do 
            for c := 0 to table.Rows[r].Count-1 do 
              if table.Cells[r,c]<>nil then begin 
                Result := FindControlLocation(table.Cells[r,c].GetRVData, ctrl, CtrlRVData, CtrlItemNo); 
                if Result then 
                  exit; 
              end; 
        end; 
    end; 
end;
Post Reply