2009-05-25 8 views
7

Avant que Delphi 2006 (je pense) a présenté le TFlowPanel et TGridPanel, j'ai fait un contrôle qui était similaire dans le concept. Il fait encore un certain nombre de choses que ces contrôles ne font pas, et lors de la mise à jour de mon code à Delphi 2009, j'ai décidé d'ajouter quelques améliorations à cela aussi.Glisser-déposer au moment du design en Delphi?

À l'heure actuelle, l'ordre des contrôles enfants est déterminé par leur ordre de création. Le FlowPanel et GridPanel montrent un meilleur moyen avec ControlIndex et d'autres propriétés filtrées, mais je me demandais s'il existe un moyen de gérer le réordonnancement glisser-déposer au moment du design? Pour autant que je sache, faire glisser un contrôle d'édition et le déposer sur mon panneau n'appelle rien de ce que je peux accéder au moment du design. J'étais à moitié fantasmé sur un moyen de détecter directement l'opération de drop, ou peut-être de détecter quand un contrôle est déplacé afin que je puisse déterminer où il devrait aller.

Des idées?

Mise à jour: OK, ça marche. Le contrôle de conteneur remplaçait déjà AlignControls pour gérer le placement des contrôles. Lorsque vous faites glisser le contrôle imbriqué et le supprimez, AlignControls est de nouveau appelé. J'ai ensuite comparé les nouvelles coordonnées du contrôle avec les autres contrôles de la liste et l'ai déplacé à la position appropriée.

J'ai dû faire face à quelques problèmes (principalement liés aux nombreux appels à AlignControls), mais le concept de base est assez simple. Merci à tous les commentateurs pour toute l'aide.

+0

"l'ordre des contrôles enfants est déterminé par leur ordre de création" Quelle est la commande? Commande de tabulation? Voulez-vous les faire trier de haut en bas dans un panneau? – Serguzest

+0

À l'heure actuelle, si vous sélectionnez le panneau, puis ajoutez des contrôles, les contrôles seront disposés dans l'ordre dans lequel vous les avez ajoutés. Pour réorganiser, vous devez couper et coller ou afficher le formulaire en tant que texte et le déplacer. J'ai maintenant ajouté une propriété ControlIndex à la TFlowPanel mais je veux que les utilisateurs du contrôle puissent simplement glisser et déposer pour réorganiser. Alors prenez Edit2 et déposez-le à la gauche de Edit1 et ils changeront comme par magie les positions sur le panneau. –

Répondre

5

Vous ne pouvez pas faire glisser un contrôle déjà présent sur le formulaire et le déposer sur votre panneau. Glisser est seulement pour déplacer un contrôle, pas pour changer son parent. Pour changer le parent, coupez et collez.

Si le contrôle est déjà sur votre panneau et que vous souhaitez le déplacer vers un autre emplacement sur votre panneau, le panneau peut contrôler la disposition en remplaçant la méthode TWinControl.AlignControls. Quand un contrôle est déplacé, sa méthode SetBounds est appelée, et parmi les choses qui se passent, il appelle AlignControl(Self) sur sa fenêtre parente. Cela appelle AlignControls. Regardez dans Controls.pas, et vous verrez que c'est une méthode compliquée, mais c'est ce qui est responsable de la disposition des enfants sur un contrôle, et c'est exactement ce que vous avez l'intention de changer.

+0

Salut Rob, Je pense que je n'étais pas trop clair sur mes intentions concernant les contrôles qui sont déposés sur mon conteneur - voir ma réponse au commentaire de John. En ce qui concerne l'utilisation d'AlignControls pour gérer la réorganisation, vous avez bien sûr raison. J'utilise déjà AlignControls pour arranger les enfants mais maintenant j'ignore complètement les propriétés left et top. Mon souci est que la prise en compte de ceux-ci rendra assez difficile de déterminer quand un contrôle est juste ajouté et quand l'utilisateur tente de réorganiser. Je vais essayer et faire un rapport. –

0

Avez-vous essayé d'écrire un événement "OnDragDrop" pour votre composant de grille, où vous vérifiez si votre composant est en mode conception?

Je n'ai pas encore écrit un tel composant, mais je ne vois pas pourquoi l'événement ne devrait pas se déclencher.

+0

Bonjour LeGEC. Je n'ai pas encore essayé OnDragDrop, mais il semble que tous les autres événements de la souris soient interceptés par le concepteur de formulaires, de sorte que vous ne recevez jamais de notification indiquant qu'un contrôle est déplacé. –

3

Peut-être que certaines de ces suggestions pourraient aider.

Vous pouvez re-parent d'un contrôle dans le concepteur sans avoir à effectuer un copier-coller. Affichez le volet structure et faites simplement glisser le contrôle visuel sur le noeud d'un autre parent dans le volet structure. Si vous avez des éléments dans un organigramme, faites glisser le tout hors du panneau de flux et faites-le glisser dans l'ordre souhaité.

(Vous pouvez re-parent, je recommande fortement un contrôle visuel de cette façon, sans changer quoi que ce soit autre que son parent. Le faire de cette façon.)

Vous pouvez voir la forme sous forme de texte, et déplacer l'ordre de déclaration autour de là - mais évidemment vous devrez faire attention en éditant le fichier "resource" directement.

Vous pouvez définir l'ordre des onglets dans le concepteur. Vous pouvez donc effectuer un contrôle différent en fonction de l'ordre des onglets qui vous convient. Vous pouvez faire un clic droit sur le formulaire et modifier l'ordre de création des contrôles non visuels, mais cela ne fonctionne pas avec les contrôles visuels.

+0

Merci, John. Ma question portait sur le fait de pouvoir la supporter depuis un contrôle personnalisé - pour que le contrôle détermine qu'un autre contrôle était déposé sur une position faisant partie du rectangle de délimitation de mon contrôle, afin que son parent puisse être changé. J'ai eu quelques réflexions à ce sujet - en plus de ne pas savoir exactement où commencer, cela va faire en sorte que le contrôle agisse différemment des autres conteneurs qui peuvent être source de confusion pour certains utilisateurs du contrôle. –

+1

Vous voudrez peut-être en faire un éditeur de composants à la place, puis - ouvrez votre propre interface utilisateur à partir d'un clic droit de la souris, et utilisez soit le déplacement démodé vers le haut/bas ou implémenter le glisser-déposer sur ce contrôle. –

Questions connexes