2015-11-10 2 views
0

У меня есть большая панель с элементами управления, которые я хочу сосредоточить в середине окна прокрутки. При высоком разрешении панель полностью видима. Но если пользователь имеет очень маленькое разрешение (1024x768), он, вероятно, изменит размер моего приложения, и панель не будет полностью видна &. Здесь мне понадобятся полосы прокрутки. Программа проста:TScrollBox не будет работать, если для Anchors установлено значение []

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.

Когда я двигаю панель из экрана (Panel1.Left: = 9999) и Panel1.Anchors устанавливается в [akLeft] полоса прокрутки появляется в ScrollBox1. Но если для параметра Panel1.Anchors установлено значение [], полосы прокрутки не будут отображаться.

Как заставить ScrollBox работать с элементом управления, установленным на []?

+0

Может быть связано с этим? http://qc.embarcadero.com/wc/qcmain.aspx?d = 98555 – Ampere

+0

BTW, какое поведение вы ожидаете достичь, установив якорь ни в одном случае? – kobik

+0

@kobik - У меня есть панель, которую я хочу держать в центре окна прокрутки. Если пользователь использует очень маленькое разрешение (1024x768), он, вероятно, изменит размер приложения, и панель не будет полностью видимой и доступной. Здесь мне нужны полосы прокрутки. – Ampere

ответ

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; 

Существует только потенциальное обновление NewRange когда scrollbox align является alNone, alLeft или alRight. Для alNone это зависит от анкеров. Поэтому, если Anchors не установлены, обновление NewRange не будет обновлено.

Одним из решений может быть изменение align прокрутки к alLeft или alRight. Или установите хотя бы анкер akLeft на элементы управления прокруткой.

В качестве альтернативы, я вижу, что можно установить диапазон полос прокрутки ScrollBox вручную.

Тогда она могла бы работать по f.ex

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

И обобщать перейти на все содержащиеся в нем элементы управления.

+0

@kobik спасибо за ваше примечание, я обновил ответ с вашей коррекцией. –

+0

Иисус! Что случилось с этой реализацией? Почему они (Embarcadero) не будут обрабатывать alNone? – Ampere

+0

@ ChristianHolmJørgensen - Привет, христианин. Я ДОЛЖЕН иметь привязку привязанных к «нет», чтобы удерживать панель в середине «экрана» (в этом случае в середине ScrollBox). – Ampere

0

Теперь я вижу, что вы добавили объяснение исходной проблемы, которую вы пытались решить без привязок и прокрутки. Я бы сделал это следующим образом:

Пропустить прокрутку и использовать встроенные полосы прокрутки формы, установив TForm.AutoScroll на номер True. Вы также можете установить некоторые свойства форм и 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; 

С этими двумя пересадками панель сосредоточенных в виде на экранах с высоким разрешением, прокручиваемых на экранах с низким разрешением.

+0

Спасибо Том. К сожалению, это не сработает. Приложение, которое я разместил, является минимальным приложением, необходимым для воспроизведения этой ошибки Delphi. По сути, это почти пустое приложение. Реальное приложение намного сложнее. Есть множество элементов управления, закрепленных и выровненных во всех комбинациях. Панель, создающая проблему, не может быть просто помещена в основную форму. – Ampere

+0

@Frosty Ну, конечно, вы можете применить одно и то же решение, если поместить панель на ScrollBox. Дело в том, что для показа полос прокрутки вам необходимо установить левый и верхний привязки. Поэтому вам необходимо центрировать панель вручную. Или используйте христиане. –

Смежные вопросы