2011-07-08 14 views
7

He creado un TScrollBox. He agregado la etiqueta y el cuadro de edición dinámicamente al hacer clic en el botón. Para establecer la ubicación del componente, he usado la altura, el ancho, la izquierda, la propiedad superior de los componentes. Pero cuando aparece la barra de desplazamiento aparece en la pantalla después de agregar 5 componentes, la siguiente ubicación de componentes se altera. y el siguiente componente no se coloca de manera síncrona en ScrollBox.Cómo agregar componentes a TScrollBox dinámicamente uno debajo de otro al hacer clic en el botón?

+0

debe haber alguna propiedad del ScrollBox, como '' ScrollTop' o ScrollWhatever'. Puede restarlo de la nueva posición del componente. –

+0

No puedo encontrar ninguna propiedad como ScrollTop .. :( – naren

Respuesta

10

La coordenada Top para los controles colocados en un ScrollBox necesita tener en cuenta la cantidad de "desplazamiento" que ya tuvo lugar. Si agrega los controles de una sola vez, esto no es un problema, porque ScrollBox no tiene la posibilidad de "desplazarse".

Si agrega controles a ScrollBox después de tiene la posibilidad de "desplazarse", debe tener en cuenta la cantidad de "desplazamiento" vertical que tuvo lugar. Aquí hay una pieza de código que agregará etiquetas al ScrollBox1, teniendo en cuenta el desplazamiento vertical para que los controles no se superpongan entre sí. Aquí estoy usando la propiedad "Etiqueta" del formulario para contener el Top para el próximo control agregado, y también estoy usando Tag para generar nombres únicos para las etiquetas (para que pueda ver que están yendo al ScrollBox en el correcto coordenadas).

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; 

Un otro enfoque que utiliza a veces es no perder de vista el último control añadido y la base de las coordenadas para el nuevo control sobre las coordenadas de ese último control añadido:

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; 

Y sin embargo, otro enfoque sería encontrar bajo el control y añadir su control basado en él de coordenadas:

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

Muchas gracias ... funcionó .. :) – naren

+0

Gracias me ayudó con algo similar. –

Cuestiones relacionadas