Search code examples
delphifiremonkeydelphi-xe8

Firemonkey TVertScrollBox mouse position


I have form (Height = 500) and TVertScrollBox on it (align set to TAlignLayout.Client and range is 5000px). I wrote simple method, which show position of mouse when I click on scroll box.

procedure TformMain.VertScrollBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  ShowMessage(FloatToStr(X) + '  ' + FloatToStr(Y));
end;

When the scroll bar is on top and I click on top of the scroll box, Y in message is 0. That's right. But when I scroll down to the half and click on top of the scroll box, Y in message is 0, too (not 2500). How can I get the position relative to scroll box?

This is my FMX code for TForm and TVertScrollBox:

object formMain: TformMain
  Left = 0
  Top = 0
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = Single
  Caption = 'Gear Studio 1.0'
  ClientHeight = 600
  ClientWidth = 450
  Position = DesktopCenter
  StyleBook = StyleBookPanel
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  OnCreate = FormCreate
  OnCloseQuery = FormCloseQuery
  DesignerMasterStyle = 0
  object VertScrollBox1: TVertScrollBox
    Align = Client
    Size.Width = 450.000000000000000000
    Size.Height = 576.000000000000000000
    Size.PlatformDefault = False
    StyleLookup = 'VertScrollBox1Style1'
    TabOrder = 1
    OnMouseDown = VertScrollBox1MouseDown
    Viewport.Width = 450.000000000000000000
    Viewport.Height = 576.000000000000000000
  end
  ...
  ...
end

That's how I am adding panels:

  SetLength(MyItems, i+1);
  MyItems[i] := TItem.Create(i);
  with MyItems[i] do begin
    ...
  end;

constructor TItem.Create(number: integer);
var
  ThisItem: TItem;
begin
  inherited Create(nil);
  ThisItem := Self;
  with ThisItem do begin
    if number = -1 then begin
       ... //not important
      end;
    end else if number > 0 then begin
      Width := 370;
      Height := 35;
      ...
    end;
    Position.X := 10;
    Parent := formMain.VertScrollBox1;
    PopupMenu := formMain.PopupMenu1;
    OnDblClick := DblClick;
    OnMouseEnter := MouseEnter;
    OnMouseLeave := MouseLeave;
  end;
end;

MyItems is dynamical array of TItem (it is normal TPanel with added some properties).


Solution

  • You need to add VertScrollBox1.ViewportPosition.Y property to get the absolute coordinate.

    ShowMessage(FloatToStr(X) + '  ' + FloatToStr(VertScrollBox1.ViewportPosition.Y+Y));
    

    shows correct result.