11
votes

Comment créer des composants contenant des séparateurs?

J'aimerais mettre des boutons entre deux panneaux redimensionnables ou directement sur le séparateur si possible. Comment puis-je atteindre qu'ils vont se déplacer avec le séparateur? Comment puis-je les ancrez?

capture d'écran

edit:
Peut-être que la chose la plus importante que j'ai oubliée de mentionner. Ce séparateur doit être aussi large que sur la capture d'écran et les boutons doivent la jeter; Donc, ces boutons sont en réalité "flottant sur la séparateur" maintenant.

Merci beaucoup


5 commentaires

Étant donné que Tsplitter n'est pas un contrôle vitré, vous ne pouvez pas placer des contrôles dessus. J'abandonnerais le Tsplitter au total et utilisez un TPanel et écrivez une logique qui le fait se comporter comme un séparateur. Ceci est probablement assez facile, mais puisque je n'ai pas deplhi IDE / RTL / compilateur disponible en ce moment, je ne peux pas tenter (du moins pas maintenant).


@Andreas Ce n'est pas comme ça que vous le faites. Vous devez utiliser à la fois un séparateur et un panneau. C'est ainsi que fonctionnent les séparateurs.


@Andreas d'autre part, vous semblez avoir compris la question et je n'ai pas fait. J'ai lu et la relis-la et je ne peux pas savoir comment vous l'avez fait, mais vous semblez avoir déposé la signification souhaitée du Q!


vous pouvez définir la largeur de ce séparateur et jeu biseautés: = true cette façon, il est pas trop petit pour frapper et collera visuellement.


@ Johan - C'est pourquoi je me suis mis un nom de composant; et IMHO Le séparateur 3D entre les panneaux 3D pourrait être moins visible que ce qu'il est


4 Réponses :


6
votes

Voici une capture d'écran de mon application:

Ce formulaire comporte un seul Tsplitter situé à droite de la vue d'arborescence dans le volet de gauche. À droite du séparateur est un TPanel qui contient le bouton.

ici, il est au moment de la conception et vous pouvez voir le séparateur dessiné avec une ligne pointillée:

L'astuce est que le séparateur ne contient pas de contrôle - pour que vous utilisiez un panneau.

Ainsi, en utilisant votre nommage, vous devez remplacer le séparateur1 avec un panneau pour contenir les boutons et ajouter un séparateur entre Panel1 et le nouveau panneau. Les panneaux gauche et moyen et le séparateur sont alignés alert et le panneau de poignée droite est aligné alclient . Définir splitter1.Autosnap: = false


4 commentaires

Le problème est que je veux laisser les utilisateurs faire glisser tout le volet entre les panneaux. Je sais que c'est à court de comportement commun, mais c'est ce que le reste du projet est déjà. De même, je n'aime pas quand le séparateur est trop étroit pour que vous ayez besoin de vous concentrer pour le faire glisser pendant un moment. J'ai oublié de mentionner cela dans ma question; Je vais donc y ajouter là-bas. +1 Quand j'ai eu des points demain.


-1 Pour l'instant, testé cela, mais le séparateur ne reste pas placé entre deux panneaux alignés à gauche.


@Johan merci pour le bowvote, mais c'est vous qui a commis l'erreur que j'ai peur.


Correction de celui-ci Autosnap doit être modifié à partir de sa valeur par défaut (true) à False , il ne fonctionnera que possible.



1
votes

Vous pouvez nichez des panneaux à l'autre.

panel4.align:= alRight;
panel1 align:= alClient;
panel2.Align:= alClient;
splitter1.align:= alright or alLeft //experiment here
panel3.Align:= alRight;


7 commentaires

Pourquoi avez-vous besoin de nidification ici?


@DavID L'alignement des panneaux laissera le panneau1 et le panneau3 redimensionner avec le séparateur tout en gardant une taille fixe. Il y a d'autres façons de faire cela, mais j'aime nichier des panneaux. Et cela fonctionne dans toutes les versions de Delphes, sans nécessiter de code.


@Johan Vous n'avez pas besoin de nier les panneaux pour obtenir ce qui est souhaité sans avoir besoin de code.


@David, je sais que vous pouvez utiliser des ancrages mais je préfère la nidification.


@Johan Vous n'avez pas besoin d'ancres. Vous avez besoin de panneaux de gauche et centraux pour que Allerft et le panneau droit soient alclient. Ensuite, le séparateur est assis entre les panneaux gauche et moyen et tout est bon.


@David, oui, mais si vous voulez (la commande à l'intérieur) Panel1 pour développer que vous devez effectuer des nichements (ou des ancrages), sinon le panneau Middle se développera (simplement le testé :) et c'est Pas Ce que vous voulez, vous voulez que le panneau le plus à gauche soit développé / rétrécir.


Panel1, Splitter1, Panel2, Panel3 Organisez de gauche à droite. Alignement Allerft pour les 3 à gauche, Alclient pour le plus à droite. Changements de séparateur Largeur du panneau1 et Panel3. La largeur du panneau2 reste constante.



6
votes

YO ne peut pas le faire automatiquement.
Manuellement, vous pouvez changer la propriété de gauche des boutons dans l'événement OnMoved du séparateur.
Il n'y a pas une bonne solution (visualisation sur le moment de la traînée, ce n'est pas bon), mais cela peut faire le résultat dont vous avez besoin. Vous pouvez résoudre ce problème, essayez resizestyle = rsupdate strong>; Avec cela lorsque vous faites glisser le séparateur, les boutons se déplacent aussi.

procedure TForm1.Splitter1Moved(Sender: TObject);
begin
  SpeedButton1.Left := Splitter1.Left + 40;
  SpeedButton2.Left := Splitter1.Left + 40;
  SpeedButton3.Left := Splitter1.Left + 40;
  SpeedButton4.Left := Splitter1.Left + 40;
end;


1 commentaires

C'est ce que je pensais plutôt qu'une tentative d'écrire mon propre contrôle. C'est une solution peu sale mais ça marche; J'ai essayé la même chose avant de demander ici. Donc +1 (demain) pour lire mon esprit :)



1
votes

Il y a un avis important. Les deux panneaux entre séparateur doivent avoir le même paramètre alignwithmargins . (Vrai vrai ou faux). Sinon un séparateur ne fonctionne pas. Je me suis battu avec ce problème pendant quelques jours


0 commentaires