2011-07-08 4 views
7

Stworzyłem jeden TScrollBox. Dodałem dynamicznie pole Etykieta i Edycja po kliknięciu przycisku. Aby ustawić położenie komponentu, użyłem wysokości, szerokości, lewej i najwyższej właściwości komponentów. Po pojawieniu się paska przewijania na ekranie po dodaniu 5 komponentów, lokalizacja kolejnych komponentów zostaje zakłócona. a następny komponent nie jest umieszczany synchronicznie na ScrollBox.Jak dodawać komponenty do TScrollBox dynamicznie jeden pod drugim na przycisku?

+0

Powinny istnieć pewne właściwości ScrollBox, takie jak 'ScrollTop' lub' ScrollWhatever'. Możesz po prostu odjąć ją od nowej pozycji komponentu. –

+0

Nie mogę znaleźć żadnej właściwości, takiej jak ScrollTop .. :( – naren

Odpowiedz

10

Współrzędne dla kontrolek umieszczonych na ScrollBox muszą uwzględniać ilość "przewinięcia", które już miało miejsce. Jeśli dodasz wszystkie kontrolki naraz, nie stanowi to problemu, ponieważ ScrollBox nie ma możliwości "przewinięcia".

Po dodaniu elementów sterujących do ScrollBox po ma szansę "przewinąć", należy wziąć pod uwagę ilość pionowego "przewijania", które miało miejsce. Oto przykładowy fragment kodu, który doda etykiety do ScrollBox1, biorąc pod uwagę pionowy zwój, aby kontrolki się nie nakładały. Tutaj używam właściwości "Tag" formularza do przechowywania Top dla następnej kontroli dodanej, a także używam Tag do generowania niepowtarzalnych nazw dla etykiet (dzięki czemu można zobaczyć, że wchodzą do ScrollBox na poprawne współrzędne).

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; 

Innym podejściem czasami używany jest do śledzenia ostatniej kontroli dodaje baza współrzędnych dla nowej kontroli na współrzędne tego ostatniego dodanego sterowania:

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; 

a jednak inny podejście polegałoby na znalezieniu najniższej kontroli i dodaniu kontroli w oparciu o jej współrzędne:

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

Wielkie dzięki .. to zadziałało .. :) – naren

+0

Dzięki pomogło mi coś podobnego. –