我有一个装满控件的大面板,我希望在滚动框的中间保持居中。在高分辨率下,面板完全可见。但如果用户的分辨率非常小(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设置为[]?
的控件一起使用答案 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;
当滚动条align
为alNone
,alLeft
或alRight
时,只有潜在的NewRange更新。
对于alNone
,它取决于锚点。因此,如果未设置锚点,则不会更新NewRange。
一种解决方案是将滚动条的align
更改为alLeft
或alRight
。或者至少在scrollbox子控件上设置锚akLeft
。
或者我看到可以手动设置ScrollBox滚动条范围。
然后它可以通过f.ex
工作ScrollBox1.HorzScrollBar.Range := Panel1.Left + Panel1.Width;
并概括它以覆盖所有包含的控件。
答案 1 :(得分:0)
我现在看到你已经添加了一个原始问题的解释,你一直试图解决没有锚点和滚动框。我会这样做:
通过将TForm.AutoScroll
设置为True
,跳过滚动框并使用表单的内置滚动条。您可能还想设置表单HorzScrollBar
和VertScrollBar
的部分属性。通常我会设置Smooth
和Tracking
。
然后,让小组设置akLeft
和akTop
个锚点,然后将其放在表单上,并为表单添加一个简单的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;
通过这两项更改,面板在高分辨率屏幕上的窗体中居中,同时在低分辨率屏幕上滚动。