Jump to content


Photo

Как мне удалось управлять рабочей областью скроллбокса TUnimScrollBox


  • Please log in to reply
No replies to this topic

#1 loginov_d

loginov_d

    Newbie

  • Members
  • Pip
  • 4 posts

Posted 14 May 2018 - 12:38 PM

Как оказалось, UniGui передает высоту рабочей области скроллбокса только один раз. Используется свойство ScrollHeight, которое было определено автоматически в дизайн-тайме (в инспекторе объектов его не видно). Мне же потребовалось расположить на скроллбоксе несколько TUnimPanel со свойством Height=auto. Получилось, что реальная суммарная высота панелек отличается от размера, который был в свойстве ScrollHeight, в результате компоненты в скроллбоксе обрезались то снизу, то сверху. Я потратил почти весь день на то, чтобы решить эту проблему.

Решить её только на стороне браузера не получилось, поскольку UniGui прячет некоторые детали скроллбокса. Если я вызываю UnimScrollBox1.ScrollHeight := 1000, то видно, что UniGui обращается к какому-то дополнительному объекту и именно для него вызывает setHeight(1000). Как достучаться до этого объекта из кода JS - я не разобрался. Пришлось прибегнуть в Ajax-запросу.

 

Для UnimScrollBox1 написал клиентский обработчик:

  function resize(sender, info, eOpts)
{
    var h = MainmForm.UnimPanel1.el.dom.offsetHeight +
          MainmForm.UnimPanel2.el.dom.offsetHeight + MainmForm.UnimPanel3.el.dom.offsetHeight +
      MainmForm.UnimPanel4.el.dom.offsetHeight;
         
   ajaxRequest(MainmForm.UnimScrollBox1, 'SetScrollHeight', { "sh1": h });  
}

 

Обработка Ajax-запроса:

 

procedure TMainmForm.UnimScrollBox1AjaxEvent(Sender: TComponent; EventName: string;
  Params: TUniStrings);
begin
  if EventName = 'SetScrollHeight' then
    UnimScrollBox1.ScrollHeight := StrToInt(Params.Values['sh1']);
end;
 
Есть ли идеи как решить задачу более красиво?
Неплохо было бы, если бы данную задачу мог решить UniGui без написания дополнительного кода.

  • 0




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users