Comment afficher les barres de défilement dans TScrollBox après qu'il a été rendu visible à nouveau?

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

  •  27-09-2019
  •  | 
  •  

Question

Je l'ai rencontré un petit problème. Je suis la génération dynamique des commandes et les placer sur un composant TScrollbox. Mais je remarque que si le scrollbox est visible, l'utilisateur peut voir clairement chacun des contrôles en cours de création et placé. Il semble donc que beaucoup de travail est fait et il est lent.

je me suis caché la scrollbox et a généré tous les contrôles, ce qui a pris beaucoup moins de temps et sans scintillement et autres. Mais voici le problème. Quand je montre la scrollbox à nouveau, son scrollbar ne semble pas jusqu'à ce que je remets à la côte en fait la forme. (L'alignement des scrollbox est alClient)

Toutes les idées sur la façon de résoudre ce problème?

J'ai essayé repeindre, mais cela n'a pas fonctionné. Actualiser ne fonctionne pas non plus.

Merci

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;

Le code ci-dessus montre comment je cache et d'afficher les scrollbox.
fNaujasTermas génère un panneau avec plusieurs trackbars, des images et des modifications.

Je ne suis pas sûr de ce que l'explication étape par étape, il pourrait être. Il suffit de faire une procédure où il générerait un certain panneau avec de nombreux contrôles sur et réglez la Scrollbox en tant que parent. Cacher scrollbox avant de générer quoi que ce soit et réafficher après tout est fait.
Oh BTW, le panneau est aligné alTop. Ainsi, chaque fois qu'un nouveau panneau est créé et placé dans scrollbox, il apparaîtra en haut alors que tous les autres panneaux se déplaceront vers le bas.

Voici comment j'ai créé le scrollbox lui-même

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

EDIT2: Je crois que je sais comment reproduire ce
. Il semble que l'ajout d'un nouveau panneau au scrollbox, il ne compte pas dans la hauteur totale de tous les contrôles déjà sont dans cette scrollbox.

Donc, pour donner l'exemple. Disons que 1 panneau a une hauteur de 200px.
Scrollbox hauteur est 300px.

Ainsi, après la création de 2 panneaux qui ajoutent à 400px de hauteur, scrollbox ne montre pas les barres de défilement, même si la moitié du deuxième panneau n'est pas visible. Si j'ajouter un panneau = 600px total scrollbox affichera la barre de défilement qui ressemble comme il le ferait défiler seulement par 2 panneaux, non 3. Lorsque vous essayez de faire défiler cette fenêtre, les valeurs se recalculées et tout est montré bien.

Le problème principal est, comment faire une barre de défilement show scrollbox « dans le temps » si aucun panneau ne coupe la moitié?

Était-ce utile?

La solution

Vous pouvez demander au scrollbox recalculer ses propriétés scrollbar en appelant la méthode de Realign() hérite de TWinControl. Pour minimiser le scintillement vous devriez le faire pendant qu'il est encore invisible, comme ceci:

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

Autres conseils

Comme je l'ai dit dans les commentaires, je suis incapable de reproduire le problème. Il serait utile que vous avez donné des instructions étape par étape sur la façon de reproduire le problème.

Mais si vous dites que le problème disparaît si vous redimensionnez la forme, pourquoi ne pas redimensionner simplement le formulaire? Peut-être vous pouvez essayer de le redimensionner 0 pixels à l'aide SetWindowPos. Vous pouvez également essayer ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top