2010-04-18 3 views
2

J'ai rencontré un petit problème. Je génère dynamiquement des contrôles et les place sur un composant TScrollbox. Mais j'ai remarqué que si la boîte de défilement est visible, l'utilisateur peut voir clairement chacun des contrôles en cours de création et placé. Donc, il semble que beaucoup de travail est fait et c'est lent.Comment afficher les barres de défilement dans TScrollBox après qu'il a été rendu visible à nouveau?

J'ai caché la boîte de défilement et généré toutes les commandes, ce qui a pris beaucoup moins de temps et pas de scintillement. Mais voici le problème. Quand je montre à nouveau la boîte de défilement, sa barre de défilement n'apparaît pas jusqu'à ce que je redimensionne réellement le formulaire. (L'alignement de la scrollbox est alClient)

Des idées sur comment résoudre ce problème?

J'ai essayé de repeindre, mais cela n'a pas fonctionné. Le rafraîchissement n'a pas fonctionné 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 me cache et montre la scrollbox.
fNaujasTermas génère un panneau avec plusieurs barres de déplacement, images et modifications.

Je ne suis pas sûr de ce que pourrait être l'explication étape par étape. Il suffit de faire une procédure où il génèrerait un panneau avec de nombreux contrôles et définirait la ScrollBox en tant que parent. Masquez la boîte de défilement avant de générer quoi que ce soit et affichez-la après tout. Par exemple, le panneau est aligné alTop. Ainsi, chaque fois qu'un nouveau panneau est créé et placé dans la boîte de défilement, il apparaît en haut alors que tous les autres panneaux descendent.

Voilà comment je créé le scrollbox se

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

EDIT2: Je pense que je sais comment reproduire cela.
Il apparaît que lors de l'ajout d'un nouveau panneau à la scrollbox, il ne compte pas dans la hauteur totale de tous les contrôles qui sont déjà dans cette scrollbox.

Donc, pour donner un exemple. Disons que 1 panneau a une hauteur de 200px.
La hauteur de ScrollBox est de 300 px.

Donc, après avoir créé 2 panneaux qui ajoutent jusqu'à 400px de hauteur, la barre de défilement n'affiche pas les barres de défilement, même si la moitié du second panneau n'est pas visible. Si j'ajoute un panneau supplémentaire = 600px au total, la barre de défilement affichera la barre de défilement qui semblera défiler uniquement pour 2 panneaux, et non 3. Lorsque vous essayez de faire défiler une telle fenêtre, les valeurs sont recalculées et tout est bien affiché.

Donc, le problème principal est, comment faire une barre de défilement afficher la barre de défilement "dans le temps" de sorte que les panneaux ne sont pas à moitié coupés?

+0

Je n'arrive pas à reproduire le problème dans D2009. –

Répondre

4

Vous pouvez demander à la boîte de défilement de recalculer ses propriétés de barre de défilement en appelant la méthode Realign() héritée de TWinControl. Pour minimiser le scintillement, vous devez 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; 
0

Comme je l'ai dit dans les commentaires, je suis incapable de reproduire le problème. Il serait utile si 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 le formulaire, pourquoi ne pas simplement redimensionner le formulaire? Peut-être que vous pourriez essayer de le redimensionner 0 pixels en utilisant SetWindowPos. Vous pouvez également essayer ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);.

Questions connexes