2015-11-10 42 views
0

我有一個完整的控制面板,我想在滾動框中間保持居中。在高分辨率下,面板完全可見。但是,如果用戶的分辨率非常低(1024x768),他可能會調整我的應用程序的大小,並且該面板不會完全可見&可訪問。這是我需要滾動條出現的地方。該程序就像這樣簡單:當錨點設置爲[]時,TScrollBox將不起作用

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

可能與此有關? http://qc.embarcadero.com/wc/qcmain.aspx?d = 98555 – Ampere

+0

順便說一句,在這種情況下,通過將Anchors設置爲none,你期望達到什麼樣的行爲? – 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的唯一潛在更新時,滾動框alignalNonealLeftalRight。 對於alNone它取決於錨。所以如果錨沒有設置,NewRange將不會更新。

一種解決方案可能是將滾動框的align更改爲alLeftalRight。或者至少在滾動框兒童控件上設置錨點akLeft

或者我看到它可以手動設置ScrollBox滾動條範圍。

然後,它可以通過f.ex

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

工作,並推廣它去對所有包含的控件。

+0

@kobik謝謝你的提示,我已經用你的更正更新了答案。 –

+0

耶穌!那個實現有什麼問題?爲什麼他們(Embarcadero)不會處理無人? – Ampere

+0

@ChristianHolmJørgensen - 嗨Christian。我必須將Anchors設置爲'none',以便將Panel保持在'屏幕'中間(在這種情況下是ScrollBox的中間)。 – Ampere

0

我現在看到你已經添加了原始問題的解釋,你一直在試圖解決沒有錨點和滾動框。我會這樣做:

跳過滾動條並使用窗體的內置滾動條,將TForm.AutoScroll設置爲True。您可能還需要設置和VertScrollBar表單的一些屬性。通常我設置了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; 

有了這兩個變化面板的形式爲中心在高分辨率屏幕上可以在低分辨率屏幕上滾動。

+0

謝謝湯姆。不幸的是,這是行不通的。我發佈的應用程序是重現此Delphi錯誤所需的最小應用程序。基本上,這是一個幾乎空的應用程序。真正的應用程序要複雜得多。有很多控件在所有類型的組合中錨定和對齊。造成問題的面板不能簡單地放置在主窗體上。 – Ampere

+0

@Frosty那麼,如果你把面板放在ScrollBox上,你當然可以應用相同的解決方案。無論如何,讓滾動條顯示您必須設置左側和頂部錨點。因此,您需要手動將面板居中。或者使用基督徒解決方案。 –

相關問題