Como mostrar as barras de rolagem no TScrollbox depois de ter sido visível novamente?

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

  •  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?

Foi útil?

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);.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top