2011-07-08 83 views
7

我已經創建了一個TScrollBox。我在Button上點擊動態添加了Label和Edit Box。爲了設置組件的位置,我使用了組件的高度,寬度,左邊,頂部屬性。 但是當添加5個組件後屏幕上出現滾動條時,下一個組件位置會受到干擾。並且下一個組件未在ScrollBox上同步放置。如何在按鈕點擊時動態地將組件添加到TScrollBox之下?

+0

應該有ScrollBox的某些屬性,如'ScrollTop'或'ScrollWhatever'。你可以從組件的新位置中減去它。 –

+0

我找不到任何房產喜歡ScrollTop .. :( – naren

回答

10

放置在ScrollBox上的控件的Top座標需要考慮已經發生的「滾動」的數量。如果一次添加控件,這不是問題,因爲ScrollBox沒有機會「滾動」。

如果您在之後將控件添加到滾動框它有機會「滾動」,您需要考慮發生的垂直「滾動」的數量。下面是一段代碼,它將標籤添加到ScrollBox1,考慮垂直滾動,因此控件不會相互重疊。在這裏,我使用表單的「標記」屬性來爲下一個控件添加Top,並且我還使用Tag爲標籤生成唯一名稱(因此您可以看到它們正在進入ScrollBox的正確位置座標)。

procedure TForm31.Button1Click(Sender: TObject); 
var L: TLabel; 
begin 
    L := TLabel.Create(Self); 
    L.Caption := 'Test: ' + IntToStr(Tag); 
    L.Parent := ScrollBox1; 
    L.Top := Tag + ScrollBox1.VertScrollBar.Size - ScrollBox1.VertScrollBar.Position; 
    Tag := Tag + L.Height; 
end; 

的其他方法,我有時用是跟蹤最後控制的增加和基礎的座標上,去年加控制的座標,新的控制:

var LastControl: TControl; 

procedure TForm31.Button1Click(Sender: TObject); 
var L: TLabel; 
begin 
    L := TLabel.Create(Self); 
    L.Caption := 'Test: ' + IntToStr(Tag); 
    L.Parent := ScrollBox1; 
    if Assigned(LastControl) then 
    L.Top := LastControl.Top + LastControl.Height 
    else 
    L.Top := 0; 
    Tag := Tag + L.Height; 

    LastControl := L; 
end; 

然而另一方法是找到最低的控件,並根據它的座標添加控件:

procedure TForm31.Button1Click(Sender: TObject); 
var L: TLabel; 
    Bottom, TestBottom: Integer; 
    i: Integer; 
begin 
    // Find "Bottom" 
    Bottom := 0; 
    for i:=0 to ScrollBox1.ControlCount-1 do 
    with ScrollBox1.Controls[i] do 
    begin 
     TestBottom := Top + Height; 
     if TestBottom > Bottom then 
     Bottom := TestBottom; 
    end; 
    L := TLabel.Create(Self); 
    L.Caption := 'Test: ' + IntToStr(Tag); 
    L.Parent := ScrollBox1; 
    L.Top := Bottom; 
    Tag := Tag + L.Height; 
end; 
+0

非常感謝..它得到了工作.. :) – naren

+0

感謝幫助我與類似的東西。 –

相關問題