2012-01-27 76 views
3

這似乎是一個非常簡單的問題,但我無法使用滾動條來顯示滾動條,這讓我發瘋。爲什麼我的TScrollBox不顯示滾動條?

這是情況。我需要在表單的一部分中顯示可變數量的幀。正在顯示這些幀的區域可以通過TSplitter或調整窗體大小來調整大小。

我動態生成基於數據庫中的記錄的幀創建的形式時。這些框架是由一個FlowPanel負責框架放置的。 FlowPanel位於ScrollBox中。

由於FlowPanel,當用戶使用TSplitter或調整大小的形式中,該幀可以重新對準自己。如果任何框架重新定位在窗體視圖之外,我期望滾動框顯示滾動條,以便用戶可以向下滾動到那些不可訪問的框架。這不會發生。位於滾動框尺寸之外的流程面板區域中的這些框架不可訪問。

我已經建立了一些測試,在一個滾動框簡單的對象,以及滾動框正確地放置滾動條,如果任何包含的對象出現在滾動框的尺寸之外。

如果flowpanel對準clClient(在滾動框),或固定在滾動框,或沒有這些兩側沒關係。

我意識到我可以使用TPanel來替代面板的OnResize事件處理程序中的代碼執行框架的放置和重新定位,但這是FlowPanel的用途。

這是怎麼回事?我已經擺弄了許多不同的滾動框屬性,但仍然無法使其工作。有什麼問題,並有解決方案嗎?


好的。我選擇埃維的答案是正確的,但做這項工作的訣竅是在他的一個評論中,我對結果還沒有完全滿意。

這是瓢。我的ScrollBox和FlowPanel按照Ewe的建議進行了配置,但是由於該配置無法正常工作,因此需要使用其他一些設置。我很肯定這是由於表單用戶界面的複雜性,它在面板中有很多面板,很多分離器,而且表單本身是Patrol到PageControl的TabSheet中的(我將這個表格作爲一個表單測試,所以省略了這個事實獨自形式產生了相同的結果)。

什麼做了工作,儘管在一個笨重的時尚,是埃維的建議來切換FlowPanel的AutoWrap關機並重新開機。我下面的代碼添加到滾動框的onResize受到事件處理程序:

procedure TCurrentJobsForm.ScrollBox1Resize(Sender: TObject); 
begin 
    Flowpanel1.Autowrap := False; 
    FlowPanel1.AutoWrap := True; 
end; 

調整時有一個明顯的閃爍,但我可以忍受的,因爲它產生預期的效果。用戶調整表單大小後,將始終使用這些維度重新創建,因此調整大小是用戶不常使用的操作。

回答

7

的滾動框將只顯示滾動條時,方含控制超出可見矩形。由於您的滾動框內唯一的控件是流程面板,因此它不會幫助客戶端將滾動框內的流程面板對齊。這將始終使流水盤等於滾動框的大小,因此不需要滾動。

如果你想f.i.垂直滾動,使流動盤頂部對齊並自動調整大小。當放置更多的框架時,這應該使流動面板的高度更大。

以防萬一:檢查垂直滾動條的Visible屬性是否設置爲true。

+0

TFlowPanel現在對齊了clTop,而VertScrollBar.Visible屬性設置爲True。那沒有做到。實際上,FlowPanel停止重新定位其中的控件,並且不出現水平或垂直滾動​​條。假設我一路搞亂了一些屬性,我刪除了流程面板和滾動框,並放置了新的實例。 ScrollBox與alClient對齊,AutoScroll設置爲True,VertScrollBar.Visible爲True。 FlowPanel Align設置爲alTop,AutoSize爲True。仍然沒有快樂。沒有滾動條出現,並且流程面板不流動。嗯。 – 2012-01-27 17:31:57

+0

在這裏完美的作品。您應該知道AutoSize選項會阻礙流控面板在調整滾動條大小時對其控件重新排序(但與滾動條無關)。您可以在滾動框大小調整後將AutoWrap切換爲false並返回true。 – 2012-01-27 18:11:27

+0

我相信你的答案是正確的,如果別人沒有拿出解決方案,我會在第二天接受它。我仍然有這個問題,但我的表單很複雜。它有8個面板,4個分離器,4個DBGrids,以及多達20個框架(在流程面板中)。 FlowPanel位於ScrollBox上,與另一個面板中的客戶端對齊。與ScrollBox相同的面板是另一個頂部對齊的面板。我簡單的測試工作,但這些測試都沒有重複這種特殊形式的複雜性。 – 2012-01-27 19:41:48

1

我沒有Autosize true。
我在滾動框上有流動面板。 流動平面對齊設置爲leftRightTopBottom。

在formresize事件我這樣做:

procedure TForm2.FormResize(Sender: TObject); 
var 
i,h:integer; 
begin 
h:=0; 
for i:=0 to FlowPanel1.ControlCount - 1 do 
    h:=Max(FlowPanel1.Controls[i].BoundsRect.Bottom,h); 
ScrollBox1.VertScrollBar.Range:=h; 
end; 

的偉大工程。

0

我有類似的問題,我用@ Mark的代碼修改了它。考慮到你有FlowPanel1並在您Form1一個ScrollBox1,你可以嘗試:

  • 設置ScrollBox1Align財產alClient;
  • FlowPanel1放在ScrollBox1;
  • FlowPanel1FlowStyle屬性設置爲fsLeftRightTopBottom

現在,在OnResize事件Form1的,只是做:

procedure TForm1.FormShow(Sender: TObject); 
var 
    I: Integer; 
    VButton: TButton; 
begin 
    for I := 1 to 10 do 
    begin 
    VButton := TButton.Create(FlowPanel1); 
    VButton.Parent := FlowPanel1; 
    VButton.Name := 'Button' + I.ToString; 
    VButton.Height := 200; 
    VButton.Width := 200; 
    end; 
end; 

見下面的圖片結果:

FlowPanel with scroll bars

HTH。

0

所有努力獲得TScrollBox工作失敗,但我很高興地發現,將AutoSize和AutoWrap設置爲true並將其對齊方式設置爲alTop並將Orientation = soVertical設置爲TPageScroller的TFlowPanel工作得相當好。隨後滾動。

您可能希望embiggen pagescroller的ButtonSize以使其突出。 18似乎是正確的。