Question

Je sais que contrôles sans fenêtre ne sont pas magiques . Un contrôle sans fenêtre peut avoir la focalisation d'entrée (par exemple, Internet Explorer). mise au point d'entrée est rien de plus que le dessin soit:

et lorsque l'utilisateur commence clés empâtage, réagir de façon appropriée. Vous sais les touches sont destinés à contrôle concentré, parce que ce contrôle est mise au point.

Dans le cas de mon (Windows®) fenêtre, je dois savoir que mon contrôle enfant sans fenêtre (nous allons faire semblant il est un descendant de TGraphicControl) obtient le clavier événements. Ainsi, au cours de ma OnKeyDown de forme, OnChar, OnKeyUp, je aurais besoin de faire semblant qu'ils vont à mon contrôle enfant sans fenêtre.

Ce que je peux le faire, mais il est une douleur.

Mais l'utilisateur voudra probablement utiliser Tab navigation, et je vais devoir en quelque sorte d'intercepter le traitement des commandes de contrôle onglet normal Delphi, et le crochet en moi pour dire que cette chose est la suivante (et précédent) dans l'ordre de tabulation.

Ce que je peux le faire, mais il est une douleur.

Et puis il y a ActiveControl, qui ne comprend rien, sauf années TWinControl. Donc, si Delphi essaie toujours de savoir qui a le focus, il sera fou. Donc, je dois avoir une autre mise en oeuvre de ActiveControl.

Ce que je peux le faire, mais il est une douleur.

En d'autres termes: est-ce juste trop de travail Je me bats eveything que Delphi est, tous si je peux avoir quelques dizaines de contrôles accessibles sans fenêtre par l'entrée du clavier? Les concepteurs Delphi ne ont jamais envisagé l'aide des commandes de fenêtres interactives, et si je vais maintenant essayer de travailler dans, je vais juste coincé dans le hurtlocker ?

Delphi m'a donné la chance de me aider volontiers, mais j'ai choisi la voie de la douleur.


Quelques explications supplémentaires sur contrôles sans fenêtre est nécessaire.

Non chaque contrôle vous interagissez avec doit être un contrôle de fenêtres. Il est tout à fait possible d'avoir l'accent sur, et envoyer l'entrée du clavier, un contrôle qui n'est pas une fenêtre de Windows.

Par exemple, presque tous les contrôles que vous voyez dans une fenêtre du navigateur Internet Explorer est un contrôle sans fenêtre. Dans la capture d'écran ci-dessous, vous pouvez voir un modifier contrôle, que vous pouvez taper, et un bouton qui (dans ce screenshot) a le focus:

Vous pouvez voir le rectangle de mise au point en pointillé, et le bouton est bleu (qui sous Windows indique qu'il a le focus).

Si je devais appuyer sur Espace tandis que le bouton Google Search a mise au point, il serait appuyez sur sur le bouton. La raison pour laquelle cela fonctionne est parce que Microsoft a écrit une bibliothèque de widgets ensemble des contrôles. Ces contrôles look and feel (presque) exactement comme les contrôles communs réguliers - ils sont presque des clones exacts des contrôles communs Windows, jusqu'aux thèmes appliqués

.

Mozilla Firefox et Google Chrome utilisent également une bibliothèque de widgets de contrôles. Ils n'utilisent pas contrôles fenêtrés Microsoft intégré, mais au lieu d'utiliser une bibliothèque de graphiques interactifs, sans fenêtre widgets .

Et si vous avez un environnement de développement approprié, lewidgets sans fenêtre fonctionnent comme contrôles fenêtrés « normaux ». GTK + est une bibliothèque de widgets et Glade est un IDE qui vous permet la mise en page des contrôles dans cette bibliothèque widget.

Je ne sais pas dans quel environnement de développement de Firefox, Chrome ou Blender ont été créés, mais leurs widgets en charge des contrôles sans fenêtre.


Alors maintenant sur ma question.

Si je ne me trompe pas, il me semble que, bien que Delphi supporte une TControl de base (dont la largeur, la hauteur, et peut peindre lui-même), il ne peut pas recevoir le focus du clavier. Il me semble que Borland jamais été conçu VCL de Delphi en tant que bibliothèque de widgets générique. La seule preuve que je dois soutenir ce que le ActiveControl d'un formulaire est un TWinControl:

property ActiveControl: TWinControl;

Cela ne signifie pas que Delphi pourrait être, ou doit être, limité à fenêtré contrôles. La bibliothèque widget VCL pourrait être étendu pour supporter l'accent donnant aux contrôles sans fenêtre.

Mais peut-être Delphi supporte déjà des contrôles sans fenêtre , et je ne le réalisent pas? Y at-il déjà un mécanisme mis en place en Delphi pour soutenir de donner le focus à des années TControl? Mais je suis un gars assez intelligent, et je suis assez sûr de VCL de Delphi ne peut pas faire ce que les autres bibliothèques de widgets peuvent faire.

Ce qui conduit alors à une autre question: combien de travail serait être à des formes de sous-classe et comme pour le soutenir Y at-il quelqu'un d'autre là-bas, peut-être quelqu'un TeamB, qui est beaucoup plus intelligent que moi, qui a déjà essayé, et arriver à la conclusion qu'il est impossible

Je demande maintenant, à l'avant, si vous essayez d'ajouter le support de contrôle de fenêtre est presque impossible (par exemple futile) - de sorte que je ne passe pas des semaines pour rien. je suis en train de tirer sur les connaissances d'une communauté de développeurs Delphi.

Je pose une question.

Était-ce utile?

La solution

Il est vain de construire des contrôles sans fenêtre adapter les et dans le cadre de VCL de Delphi.

Vous apportez d'Internet Explorer comme un exemple. Mais dans ce cas, il est tout à fait responsable de tout ce qui se trouve sur elle. Il a sa propre notion interne de ce que le contrôle actif est, mais pensez à quoi il ressemble de l'extérieur: il est juste un contrôle géant. Lorsque vous demandez à l'OS qui a le focus, le contrôle du navigateur unique a, quel que soit des sous-contrôles du navigateur apparaît pour avoir le focus.

Lorsque vous appuyez sur Tab, il se tourne vers l'OS comme si le navigateur a simplement consommé un caractère de tabulation, tout comme les contrôles d'édition font. Modifier les commandes se déplacent le curseur sur quelques espaces et ajouter des caractères de tabulation à leurs tampons internes; commandes du navigateur déplacer le curseur sur une autre région de l'écran.

Vous songez à faire tout cela sur un Delphi TForm. formes Delphi ont déjà un cadre pour la gestion du contrôle actif et la manipulation des frappes, et vous allez devoir combattre tout. Si vous voulez des contrôles sans fenêtre, allez la route et Internet Explorer construire votre propre contrôle conteneur pour les tenir afin que vous puissiez rester en charge de tout ce qui se passe à l'intérieur.

Votre conteneur peut être un contrôle VCL, mais les choses que vous mettez sur elle peut probablement pas - ils vont encore attendre à utiliser la VCL FOCUS- et les règles de manipulation du clavier. Remarquez comment vous ne pouvez pas mettre des contrôles de Windows ordinaires dans Internet Explorer, que ce soit. Tout ce que vous mettez là-bas doit passer par des interfaces ActiveX spécifiques. Peut-être que vous aurez besoin d'interfaces, aussi, ou peut-être vous pouvez simplement faire votre propre ensemble de classes de contrôle qui descendent d'une certaine classe ancêtre spécial que vous concevez pour travailler avec votre conteneur. Ne pas commencer par TGraphicControl; il est trop ancré dans la VCL pour être utilisable comme base pour votre bibliothèque de contrôle de rejeton.

Il sera beaucoup de travail, mais là encore, qu'il était donc Internet Explorer.

Autres conseils

Oui, il est vain.
Et ce n'est pas la faute de Delphi, vous êtes juste lutte contre Windows lui-même.
Si vous avez besoin d'un contrôle qui se comporte comme un contrôle fenêtré, utilisez un fenêtré.
Et vous avez raison, essayer de recréer la pile entière de l'API de contrôles fenêtrés à partir de zéro est une douleur.

Eh oui, vous avez à peu près ce compris. L'utilisation de commandes sans fenêtre signifie que vous perdez tout Windows peut faire pour vous aider. Avoir plus d'un couple sur une seule fenêtre réelle est la douleur.

La plupart de ces programmes étaient très probablement pas à l'origine développé à l'aide des outils de type RAD avait donc pas d'autre choix que de réinventer la roue. L'un des plus grands avantages de Delphi est le support des composants de partie profonde VCL et 3 pour fournir le look que vous désirez.

Une technique que je l'ai utilisé avec succès pour réduire la quantité de poignées de fenêtre utilisée dans un complexe (préparation fiscale) forme application était de dessiner le texte sur une toile, et déplacé un seul TCustomEdit decendant à la position de l'utilisateur a été l'édition. Il est trivial de capturer les touches TAB / Haut / Bas et déplacer le modifier à la position appropriée. Le défi que nous avons découvert était en dessinant un rectangle chaud autour du champ planait souris. Nous avons fini avec une matrice de grille de TObject, où l'élément de tableau serait nul (pas de champ), une TLIST (grille contient plusieurs champs) ou une classe qui contenait notre descripteur de champ. Cela a réduit le montant des chèques de gamme, nous avons dû effectuer, car il était plus probable que la boîte ne contenait qu'un seul champ, ou dans la plupart des 4 champs.

fpGUI Toolkit est un exemple de ce que vous voulez. Le dernier code fpGUI dans le référentiel de code source est basé sur une conception multi-fenêtré. Cela signifie simplement tous les widgets / composant a une poignée de fenêtre, mais Windows ou Linux ne fait rien avec cette fenêtre, autre que les messages de notification de base (mouseenter, mouseExit, etc.). fpGUI a toujours le contrôle total sur lequel chaque composant va, si elles sont focalisable, leur apparence, etc. Certains widgets / composants fpGUI sont des composants non-fenêtré aussi. par exemple:. TfpgScrollbar, TfpgMainMenu, le bouton dans une zone de liste déroulante etc

Si vous voulez une vraie version non-fenêtré, signifie il n'y a qu'une seule fenêtre de niveau supérieur qui a une poignée de fenêtre, tous les autres widgets / composants à l'intérieur de cette fenêtre n'existe pas réellement à l'OS (ils ont pas de poignées de fenêtre ), alors fpGUI peut aider aussi. La conception initiale de fpGUI Toolkit a été basé sur une telle conception. Encore une fois, regardez dans le référentiel de code source pour la branche v0.4 de code. Je que la conception, fpGUI a dû gérer absolument tout, la création d'événements mouseenter / MouseLeave, traduire des systèmes de coordonnées pour les composants de conteneurs, la poignée (faux) états de mise au point de composants, etc ... Oui la conception initiale est beaucoup de travail, mais vous un cadre très portable qui peut facilement être appliquée à d'autres systèmes d'exploitation aussi.

Et oui, fpGUI est pleinement mis en œuvre dans l'objet langage Pascal en utilisant le compilateur Free Pascal pour me donner un soutien multiplateforme. À l'heure actuelle fpGUI fonctionne sur les appareils Windows, Linux (32 et 64 bits), Windows Mobile et Linux embarqué (ARM).

Je ne sais pas ce que votre problème est vraiment, ici, mais je pense que cette petite histoire peut être pertinent ...

Nous avons une application qui remplit une douzaine de formes. L'utilisateur peut remplir des formulaires supplémentaires, et aussi changer les valeurs remplies par l'application elle-même.

Maintenant, dans notre première mise en œuvre, nous avons utilisé des composants fenêtré pour chaque champ d'entrée unique, de sorte que les champs puissent recevoir le focus et l'entrée. Cela se est avéré être un gros problème, parce que toutes ces fenêtres ont beaucoup de ressources.

Nous avons maintenant des contrôles sans fenêtre pour chaque champ de saisie. Cela signifie que tout ce que nous retrouvons avec, est un dessin combiné de la forme et de ses champs d'entrée. Lorsque l'utilisateur clique à l'intérieur du dessin ou utilise certaines touches pour vous déplacer / mise au point réglée, nous créons un nouveau contrôle fenêtré pour le champ cliqué. Lorsque l'utilisateur se déplace dans le champ d'entrée suivante, nous détruisons la première fenêtre, et de créer une nouvelle. De cette façon, nous avons seulement un contrôle fenêtré qui encore une fois nous a donné une belle amélioration de la vitesse.

Encore une fois - Je ne sais pas ce que vous voulez vraiment gérer. TWinControl est un TWinControl pour une raison, mais il peut y avoir une solution à ce que vous voulez, ce que jamais ce serait ...

Je pense que fgGUI peut vous aider.

Ne cochez la Wiki premier.

Je pense que vous pouvez utiliser ce cadre pour votre application dans Delphi comme il est écrit entièrement en Pascal. En fait, il est basé sur FreePascal;)

HTH

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