当Anchors设置为[]时,TScrollBox将不起作用

时间:2015-11-10 20:45:27

标签: delphi delphi-xe7

我有一个装满控件的大面板,我希望在滚动框的中间保持居中。在高分辨率下,面板完全可见。但如果用户的分辨率非常小(1024x768),他可能会调整我的应用程序大小,面板将不会完全可见&无障碍。这是我需要滚动条出现的地方。该计划就像这样简单:

UNIT Unit1;

INTERFACE
USES
...

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Button1: TButton;
    Panel1: TPanel;
    procedure Button2Click(Sender: TObject);
  end;

VAR
   Form1: TForm1;

IMPLEMENTATION  {$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 Panel1.Left:= 9999;    // Try move the panel 'out of view' 
end;

end.

Button1和Panel1都是ScrollBox1中的父级。

当我将Panel移出屏幕(Panel1.Left:= 9999)并且Panel1.Anchors设置为 [akLeft] 时,滚动条会出现在ScrollBox1中。但如果Panel1.Anchors设置为 [] ,则不会显示滚动条。

如何让ScrollBox与Anchors设置为[]?

的控件一起使用

2 个答案:

答案 0 :(得分:3)

根据您正在使用的当前设置,我不认为按设计可以自动处理滚动条。

你可以在

中看到原因
unit Vcl.Forms;
...
procedure TControlScrollBar.CalcAutoRange;
var
  I: Integer;
  NewRange, AlignMargin: Integer;

  procedure ProcessHorz(Control: TControl);
  begin
    if Control.Visible then
      case Control.Align of
        alLeft, alNone:
          if (Control.Align = alLeft) or (Control.Anchors * [akLeft, akRight] = [akLeft]) then
            NewRange := Max(NewRange, Position + Control.Left + Control.Width);
        alRight: Inc(AlignMargin, Control.Width);
      end;
  end;

当滚动条alignalNonealLeftalRight时,只有潜在的NewRange更新。 对于alNone,它取决于锚点。因此,如果未设置锚点,则不会更新NewRange。

一种解决方案是将滚动条的align更改为alLeftalRight。或者至少在scrollbox子控件上设置锚akLeft

或者我看到可以手动设置ScrollBox滚动条范围。

然后它可以通过f.ex

工作
ScrollBox1.HorzScrollBar.Range := Panel1.Left + Panel1.Width;

并概括它以覆盖所有包含的控件。

答案 1 :(得分:0)

我现在看到你已经添加了一个原始问题的解释,你一直试图解决没有锚点和滚动框。我会这样做:

通过将TForm.AutoScroll设置为True,跳过滚动框并使用表单的内置滚动条。您可能还想设置表单HorzScrollBarVertScrollBar的部分属性。通常我会设置SmoothTracking

然后,让小组设置akLeftakTop个锚点,然后将其放在表单上,​​并为表单添加一个简单的OnResize处理程序

procedure TForm1.FormResize(Sender: TObject);
begin
  if ClientWidth > Panel1.Width then
    Panel1.Left := (ClientWidth - Panel1.Width) div 2;
  if ClientHeight > Panel1.Height then
    Panel1.Top := (ClientHeight - Panel1.Height) div 2;
end;

通过这两项更改,面板在高分辨率屏幕上的窗体中居中,同时在低分辨率屏幕上滚动。