Como mostrar as barras de rolagem no TScrollbox depois de ter sido visível novamente?
-
27-09-2019 - |
Pergunta
Eu encontrei um pequeno problema. Estou gerando dinamicamente alguns controles e os coloco em um TScrollbox
componente. Mas notei que, se a caixa de rolagem estiver visível, o usuário poderá ver claramente cada um dos controles sendo criados e colocados. Parece que muito trabalho está sendo feito e é lento.
Eu escondi a caixa de rolagem e gerei todos os controles nela, o que levou muito menos tempo e sem tremores e da mesma forma. Mas aqui está o problema. Quando mostro a caixa de rolagem novamente, sua barra de rolagem não aparece até eu realmente redimensionar o formulário. (O alinhamento da ScrollBox é alClient
)
Alguma ideia de como consertar isso?
Tentei repintar, mas não funcionou. A atualização também não funcionou.
obrigada
EDITAR:
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;
O código acima mostra como eu escondo e mostro a caixa de rolagem.
fNaujasTermas
Gera um painel com vários trackbars, imagens e edições.
Não tenho certeza sobre qual explicação passo a passo pode haver. Basta fazer um procedimento em que ele geraria algum painel com muitos controles e definirá a caixa de rolagem como pai. Ocultar ScrollBox antes de gerar qualquer coisa e desenrole, depois de tudo o que for feito.
Oh btw, o painel está alinhado alTop
. Portanto, toda vez que o novo painel é criado e colocado na caixa de rolagem, ele aparecerá na parte superior, enquanto todos os outros painéis se deslocam para baixo.
Foi assim que eu criei a própria ScrollBox
pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;
Edit2: Acho que sei como reproduzir isso.
Parece que, ao adicionar um novo painel à caixa de rolagem, ele não o conta na altura total de todos os controles que já estão nessa caixa de rolagem.
Então, para dar exemplo. Digamos que 1 painel tenha altura de 200px.
A altura da caixa de rolagem é de 300px.
Portanto, depois de criar 2 painéis que somam 400px de altura, a ScrollBox não mostra as barras de rolagem, mesmo que metade do segundo painel não seja visível. Se eu adicionar mais um painel = total de 600px, o ScrollBox mostrará a barra de rolagem que parece rolagem apenas por 2 painéis, não 3. Ao tentar rolar essa janela, os valores serão recalculados e tudo é mostrado bem.
Portanto, o principal problema é: como fazer uma barra de rolagem de rolagem de rolagem "no tempo" para que nenhum painéis seja meio corte?
Solução
Você pode solicitar a caixa de rolagem para recalcular suas propriedades da barra de rolagem chamando o Realign()
método herda de TWinControl
. Para minimizar o Flicker, você deve fazer isso enquanto ainda é invisível, assim:
ScrollBox.Visible := False;
try
// create your new panel ...
finally
ScrollBox.Realign;
ScrollBox.Visible := True;
end;
Outras dicas
Como eu disse nos comentários, não consigo reproduzir o problema. Ajudaria se você desse instruções passo a passo sobre como reproduzir o problema.
Mas se você diz que o problema desaparece se você redimensionar o formulário, por que não simplesmente redimensionar o formulário? Talvez você possa tentar redimensioná -lo 0 pixels usando SetWindowPos
. Você também pode tentar ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);
.