8
votes

Pourquoi ma Tscrollbox ne montre-t-elle pas de barres de défilement?

Cela ressemble à un problème très simple, mais je ne peux pas obtenir de défilement pour afficher les barres de défilement, et cela me rend fou.

Voici la situation. J'ai besoin d'afficher un nombre variable de cadres dans une partie d'une forme. La zone dans laquelle ces cadres sont affichées peut être redimensionnée via un Tsplitter ou en redimensionnant la forme. P>

Je génère de manière dynamique les cadres en fonction des enregistrements dans une base de données lorsque le formulaire est créé. Ces cadres sont parentaux à un débitPanel, responsable du placement du cadre. Le débitPanel est dans une touche de défilement. P>

En raison de la débarras, lorsque l'utilisateur utilise le TSppitter ou redimensionne le formulaire, les cadres peuvent se réorganiser. Si l'une quelconque des cadres est de la relève de la vue du formulaire, je m'attends à ce que la Scrollebox affiche des barres de défilement afin que l'utilisateur puisse faire défiler jusqu'à ces cadres inaccessibles. Cela ne se produit pas. Ces cadres qui se trouvent dans la zone du débitPanel en dehors des dimensions du défilement sont inaccessibles. P>

J'ai construit des tests avec des objets simples dans une touche de défilement et que le défilement place correctement les barres de défilement si l'une de ses tâches contenues Les objets apparaissent à l'extérieur des dimensions du Scrollebox. P>

Peu importe si le débitPanel est aligné sur ClcClient (le défilement) ou ancré sur les côtés du défilement, ou aucun de ceux-ci. P>

Je me rends compte que je peux plutôt utiliser un TPanel et effectuer le placement et la ré-positionnement des cadres dans le code du gestionnaire d'événements sur le panneau, mais c'est ce que le débitPanel est pour. P>

Qu'est-ce qui se passe ici? J'ai frappé avec de nombreuses propriétés de ScrollBox, et je ne peux toujours pas le faire fonctionner. Quel est le problème et y a-t-il une solution? P>


OK. Je sélectionne la réponse de la brebis comme étant correcte, mais l'astuce pour faire de ce travail était dans l'un de ses commentaires, et je ne suis toujours pas complètement satisfait des résultats. P>

Voici le scoop. J'ai fait ma ScrollBox et Flowpanel configuré la façon dont Ewe a suggéré, mais joué avec un certain nombre d'autres paramètres car cette configuration n'a pas fonctionné. Je suis à peu près sûr que cela a été dû à la complexité de l'interface utilisateur du formulaire, qui compte de nombreux panneaux dans des panneaux, de nombreux séparateurs et la forme elle-même est parentale dans une feuille de tabulation d'un pagecontrôle (j'ai omis ce fait depuis le test de la forme Seul de formule produisit les mêmes résultats). P>

Qu'est-ce qui a fait fonctionner, même de manière clunky, est la suggestion de la brebis pour basculer et encore une fois. J'ai ajouté le code suivant au gestionnaire d'événements ONRESIZE du ScrollBox: P>

procedure TCurrentJobsForm.ScrollBox1Resize(Sender: TObject);
begin
  Flowpanel1.Autowrap := False;
  FlowPanel1.AutoWrap := True;
end;


0 commentaires

4 Réponses :


8
votes

Le Scrollebox affichera uniquement les barres de défilement lorsque les commandes de contables dépassent le rectangle visible. Comme le seul contrôle à l'intérieur de votre ScrollBox est le débitPanel, il n'aide pas au client Aligner le débitPanel à l'intérieur du Scrollez-vous. Cela rendra toujours le débitPanel égal à la taille de la défilation et donc aucune défilement n'est nécessaire.

Si vous voulez f.i. Le défilement vertical, rendre l'option Flowpanel haut aligné et de la taille automatique. Cela devrait rendre la hauteur de débitPanel plus grosse lorsque plus de cadres sont placés à l'intérieur.

Juste au cas où: Vérifiez que la propriété visible de la barre de défilement verticale est définie sur True.


4 commentaires

Le TflowPanel est maintenant aligné CLTOP et la propriété VertscrollBar.Visible est définie sur True. Cela ne l'a pas fait. En fait, le débitPanel a cessé de ré-positionné les commandes à l'intérieur, et ni les barres de défilement horizontales ou verticales ne sont apparues. En supposant que j'avais gâché des propriétés en cours de route, j'ai supprimé le débitPanel et ScrollBox, et j'ai placé de nouvelles instances. Le Scrollebox est aligné Alclient, AutoScroll est défini sur True, et Vertscrollbar.Visible est vrai. L'alignement de Flowpanel est défini sur Altop, AutoSize est vrai. Toujours pas de joie. Aucun barrage de défilement n'apparaît et FlowPanel ne coule pas. Hmmm.


Fonctionne parfaitement ici. Vous devez savoir que l'option Autosize empêche le débarras pour réorganiser ses commandes lorsque le défilement est redimensionné (mais cela n'a rien à voir avec la barre de défilement). Vous pouvez changer de chaîne automatique sur false et retour à true après que le défilement soit redimensionné.


Je crois que votre réponse est la bonne et l'acceptera le lendemain si quelqu'un d'autre ne propose pas la solution. J'ai toujours le problème, mais ma forme est complexe. Il a 8 panneaux, 4 séparateurs, 4 dbgrids et jusqu'à 20 images (dans le débitPanel). Le débitPanel réside sur une touche de défilement, qui est un client aligné dans un autre panneau. Dans le même panneau avec le Scrollebox est un autre panneau aligné haut aligné. Mes tests simples fonctionnent, mais aucun de ces tests ne duplique la complexité de cette forme particulière.


La réponse est dans votre réponse à mon commentaire. J'ai ajouté des détails sur la solution à mon message. Merci!



4
votes

Je n'ai pas d'autosser true.
J'ai le panneau de flux sur une défilation. L'alignement du planel d'écoulement est réglé sur Leftrighttopbottom.

sur l'événement formérés, je fais ceci: p>

procedure TForm2.FormResize(Sender: TObject);
var
 i,h:integer;
begin
 h:=0;
 for i:=0 to FlowPanel1.ControlCount - 1 do
  h:=Max(FlowPanel1.Controls[i].BoundsRect.Bottom,h);
 ScrollBox1.VertScrollBar.Range:=h;
end;


0 commentaires

3
votes

J'ai eu un problème similaire et je l'ai résolu avec une adaptation du code de @ Mark. Vous envisagez d'avoir un flowpanel1 et un ScrollBox11 sur votre formulaire1 , vous pouvez essayer:

  • Définissez le Scrollbox1 'S Align Propriété sur Alclient ;
  • Mettez le flowpanel1 sur le Scrollbox1 ;
  • Définissez le flowpanel1 'S Propriété sur sur FSLEFTrightTopbottom .

    maintenant, sur l'événement omniper du formulaire , juste faire: xxx

    Voir Il en résulte la photo ci-dessous:

     débarraspanel avec barres de défilement

    hth.


0 commentaires

0
votes

Tous les efforts déployés pour que TscrollBox Working ne manquiez pas, mais j'étais heureux de trouver que la chute d'un TflowPanel avec AutoSize et AutoWrap définie sur True et son alignement défini sur Altop dans une orientation d'orientation = Sovertical fonctionnant plutôt bien. Défilement suivi.

Vous voudrez peut-être embigner les boutons à l'embandggen pour lui permettre de se démarquer. 18 semble à peu près bien.


0 commentaires