Cómo mostrar barras de desplazamiento en TScrollBox después de que se ha hecho visible de nuevo?

StackOverflow https://stackoverflow.com/questions/2662974

  •  27-09-2019
  •  | 
  •  

Pregunta

He encontré con un pequeño problema. Estoy generando dinámicamente algunos controles y los colocan en un componente TScrollbox. Pero me di cuenta de que si el scrollbox es visible, el usuario puede ver claramente cada uno de los controles que se crean y colocan. Así que parece que un montón de trabajo que se está haciendo y es lento.

Me ocultaba el scrollbox y genera todos los controles en él, que tuvo mucho menos tiempo y no parpadea, y similares. Pero aquí está el problema. Cuando le muestro la scrollbox de nuevo, su barra de desplazamiento no aparece hasta que realmente cambiar el tamaño de la forma. (La alineación de scrollbox es alClient)

¿Alguna idea sobre cómo solucionar este problema?

repintado intentado, pero no funcionó. De actualización no funciona bien.

Gracias

EDIT:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;

El código anterior muestra cómo ocultar y mostrar la scrollbox.
fNaujasTermas genera un panel con varias barras de seguimiento, imágenes y ediciones.

No estoy seguro acerca de qué explicación paso a paso que pudiera haber. Sólo hacer un procedimiento en el que se generaría algún panel con muchos controles en él y establecer el ScrollBox como padre. Ocultar scrollbox antes de generar y mostrar nada, después de todo está hecho.
Ah por cierto, el panel se alinea alTop. Así se crea cada nuevo panel de tiempo y se coloca en scrollbox, que aparecerá en la parte superior, mientras que todos los demás paneles se moverán hacia abajo.

Esto es cómo creé el scrollbox sí

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;

Edit2: Creo que sé cómo reproducir este
. Parece que cuando se añade un nuevo panel a la scrollbox, que no cuenta en la altura total de todos los controles que ya se encuentran en esa scrollbox.

Así que para dar ejemplo. Digamos que 1 Panel tiene una altura de 200 píxeles.
ScrollBox altura es de 300 px.

Así que después de la creación de 2 paneles que suman 400 píxeles de altura, scrollbox no muestra las barras de desplazamiento, a pesar de que la mitad del segundo panel no está visible. Si añado una más Panel = 600px total scrollbox mostrará la barra de desplazamiento que parece que sólo se desplazarse por 2 paneles, no 3. Cuando se trata de desplazarse tales ventana, los valores quedan recalculan y todo se muestra muy bien.

Así que el problema principal es, cómo hacer un espectáculo scrollbox barra de desplazamiento "en el tiempo" por lo que no hay paneles son un medio de corte?

¿Fue útil?

Solución

Se puede solicitar la scrollbox para volver a calcular sus propiedades barra de desplazamiento mediante una llamada al método Realign() que hereda de TWinControl. Para minimizar el parpadeo se debe hacer esto mientras todavía es invisible, así:

ScrollBox.Visible := False;
try
  // create your new panel ...
finally
  ScrollBox.Realign;
  ScrollBox.Visible := True;
end;

Otros consejos

Como ya he dicho en los comentarios, no soy capaz de reproducir el problema. Sería de gran ayuda si usted dio instrucciones paso a paso sobre cómo reproducir el problema.

Pero si usted dice que el problema desaparece si cambia el tamaño la forma, ¿por qué no simplemente cambiar el tamaño de la forma? Tal vez usted podría tratar de cambiar su tamaño 0 píxeles utilizando SetWindowPos. También puede intentar ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top