Перейти к содержанию
Fire Monkey от А до Я
  • 0

THorzScrollBox внутри TVerticalScrollBox, блокирует вертикальную прокрутку


snake

Вопрос

Есть VerticalScrollBox, внутри которого есть несколько панелей выравненных по Top

На одной из панелей есть HorzScrollBox.

Если начинать прокручивать VerticalScrollBox вне HorzScrollBox, то контент прокручивается, но если начать прокрутку из области HorzScrollBox, то вертикальная прокрутка не отрабатывает - только горизонтальная.

Как сделать, чтобы HorzScrollBox передавал управление прокруткой VerticalScrollBox, если это не горизонтальная прокрутка?

Screenshot_1.png

Изменено пользователем snake
добавлен скрин
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

блин, все равно - засада.
Если следовать

Цитата

- Надо убрать Pan в InteractiveGestures THorzScrollBox
- Всем внутренним объектам назначить HitTest = False

Теперь будет работать и внутренний и сквозной скроллинг

Да - супер! начинают работать оба скрола - НО, код приведенный далее с двумя фунциями AllHitTrue и AllHitFalse ни как не помогает отследить объект на котором был Tap или Click.

Цитата

Obj:= self.ObjectAtPoint(ClientToScreen(Point));  // Получаем объект

вот тут - всегда получаем объект на котором расположен HorzScrollBox, причем даже не его родителя, а родителя его родителя :((
т.е. у меня есть TabControl, на котором есть VertScrollBox, внутри которого есть TPanel на котором лежит HorzScrollBox, а объект который возвращается по ObjectAtPoint - всегда TabControl1

 

Если отключаю эти методы по нахождению объекта, и ставлю всем дочерним объектам HorzScrollBox - свойство HitTest:=true, то они отлично работают, но перестает скролится горизонтальный скрол, т.к. он не обрабатывает Pan.....

Подскажите, как же победить это??

Если бы в том примере получить объект который внутри горизонтального скрола, а не его пра-пра-пра-родителя - это решило бы проблему. Или если бы при установке HitTest для контролов внутри горизонтального скрола - работал бы и сам скрол, то тоже бы решило проблему.

 

Пожалуйста, помогите разобраться.


 

Ссылка на комментарий
  • 0

Сделал так - это швах, но работает :)

так что сильно не ругайте, лучше таки подскажите как сделать правильнее :)

 TMyFrame = class(TFrame)
....
 public
       Function GetControl(Control:TCustomScrollBox; SrcPoint:TPointF):TControl;
....
 end;

implementation

function TMyFrame.GetControl(Control: TCustomScrollBox; SrcPoint:TPointF): TControl;
var i:Integer;
    fm:TFMXObject;
    vp,tp:TPointF;

 function GetChildControl(Control:TControl):TControl;
  var i:Integer;
      c:TControl;
 Begin
   result:=nil;
     if   Control.ChildrenCount > 0 then begin
      for i:=0 to Control.ChildrenCount-1 do
        Begin
          if (Control.Children[i].Name<>'') then
          Begin
            c:=TControl(Control.Children[i]);
            if (c.position.X<tp.X) and ((c.Position.X+c.Width)>tp.X) and
               (c.position.Y<tp.Y) and ((c.Position.Y+c.Height)>tp.Y)
             then result:=c;
          End;
          if (TControl(Control.Children[i]).ChildrenCount>0) and (result=nil) then result:=GetChildControl(TControl(Control.Children[i]));
        End;
     end;
 End;

begin
 vp:=Control.ViewportPosition;
 tp.X:=SrcPoint.X+vp.X;
 tp.Y:=SrcPoint.Y+vp.Y;
 result:=GetChildControl(Control);
end;

//узнаем какой контрол под кликом мышки
procedure TMyFrame.HorzScrollBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var Point:TPointF;
    c:TControl;
begin
 Point.X:=X;
 Point.Y:=Y;
 c:=GetControl(HorzScrollBox1,point);
// if c<>nil Then form1.Debug.Add(c.Name);
end;

//узнаем какой контрол под тапком
procedure TMyFrame.HorzScrollBox1Tap(Sender: TObject; const Point: TPointF);
var c:TControl;
begin
 c:=GetControl(HorzScrollBox1,point);
// if c<>nil Then form1.Debug.Add(c.Name);
end;

 

Ссылка на комментарий
  • 0
4 часа назад, Dynamo сказал:

сам с собой беседу ведет)

так никто не отвечает. приходится искать и выдумывать самому.
хотя наверняка на эти грабли уже наступали 100500 раз.

мало того, но я написал как решил проблему сам и попросил "подскажите как сделать правильнее ", т.е. может Вы просто не внимательно читаете ;)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...