Page 1 sur 1

Dim 06/05/2012 - Actualités

Posté : dim. 6 mai 2012 16:14
par Xavier
Barres d'outils

ToolBars.png
D'un côté (en haut à gauche), nous avons les 10 barres d'outils.
De l'autre (en bas), nous avons la trentaine de Commandes internes et les Raccourcis de l'utilisateur.

Il va maintent falloir les affecter les uns aux autres. En théorie cela devrait fonctionner, tout est maintenant prêt.

Une fois les affectations faites, on arrivera à l'endroit précis du blocage total de l'été dernier :
  • Afficher sur la Barre des contrôles (menus ou boutons) créés dynamiquement à partir de ces affectations.
  • Parvenir à éxecuter les actions cibles des Commandes et Raccourcis pointées par ces affectations.
Pas gagné mais cette fois les bases sont là. :mrgreen:

Dim 06/05/2012 - Actualités

Posté : dim. 6 mai 2012 19:17
par Xavier
Contrôles


Les Contrôles seront des objets qui vont permettre d'affecter une Commande ou un Raccourci à un composant graphique. Ces Contrôles seront sauvés dans le fichier des Options, et il serviront à reconstruire la Barre au prochain démarrage.

Les contraintes de ce sujet sont multiples.

Composants statiques / dynamiques:
  • Certains des composants graphiques sont conçus lors du design de la Barre. Par exemple les boutons des outils, ou les panneaux de la date et de l'heure. Ces composants sont normalement situés dans une partie de la Barre qui est invisible, et sont en mode "dormant" (le Moteur ne les met pas à jour). Si l'utilisateur choisit de les afficher, ils sont déplacés dans la ToolBar choisie.
  • Cependant, il n'est pas possible de créer à l'avance des boutons et éléments de menus pour tous les Raccourcis que l'utilisateur ajoutera. Il faudra créer ces composants lors du démarrage, et l'objet Contrôle doit donc conserver les informations permettant de le faire.
Commandes / Raccourcis :
  • Certains Contrôles pointeront vers des Commandes internes (par exemple "Mettre l'écran en veille") ou des Raccourcis internes (par exemple "Gestionnaire de tâches"). Ces Commandes et Raccourcis internes sont fabriqués au démarrage et stockés dans un arbre de données particulier (la "bibliothèque de commandes", voir les actualités du week-end dernier).
  • Les autres pointeront vers des fichiers, dossiers, ou adresses Web définies par l'utilisateur, et stockés dans l'arbre contenant tous les dossiers et données de l'utilisateur. (Les Raccourcis tels qu'existant dans XT3.)

Après une première étude, les Contrôles devront avoir ces propriétés :
  • Create : chaine indiquant si (et comment) le composant graphique doit être créé.
    • Create = '' -> le composant existe déjà et doit juste être affiché.
    • Create = 'Button' -> un bouton doit être créé.
    • Create = 'Menu' -> un menu doit être créé.
    • Create = 'Item' -> un élément de menu doit être créé.
  • Component : chaine indiquant le nom du composant existant ou créé. (Tous les composants devant avoir un nom, ceux créés dynamiquement auront un UID.)
  • Command : chaine indiquant l'identifiant de la Commande ou du Raccourci. (Les Raccourcis utilisateurs ont un UID stocké pour identifiant.)
Des liens seront ajoutés pour permettre une manipulation plus facile. Comme tous ces objets sont volatiles, ces liens ne seront pas stockés.
  • .Component : pointeur vers l'object TButton, TMenu ou TMenuItem du composant graphique.
  • .Command : pointeur vers l'objet TData portant la Commande ou le Raccourci.

Un Constructor dédié va être écrit pour ces objets. Le Contrôle parent sera passé en paramètre, ainsi que les propriétés connues.

Quelques exemples :

Code : Tout sélectionner

Control := TData.CreateControl(ToolBar, '', 'Contacts');
Création d'un contrôle pour le bouton existant "Contacts" qui lancera l'outil du même nom.

Code : Tout sélectionner

Control := TData.CreateControl(ToolBar, 'Button', 'TaskMan');
Création d'un contrôle pour un bouton à créer qui lancera le Raccourci interne qui lance le Gestionnaire de tâches.

Code : Tout sélectionner

Control := TData.CreateControl(Menu, 'Item', Shortcut_Data.Ident);
Création d'un élément de menu à créer qui lancera le Raccourci utilisateur passé en paramètre.


Si tout cela fonctionne, cliquer sur un bouton créé dynamiquement devrait entrainer ces étapes :
  • Récupération de l'objet Contrôle ayant servi à créé le composant graphique et pointé par celui-ci.
  • Récupération de l'objet Commande ou Raccourci pointé par le Contrôle.
  • Lancement de la routine interne de la Commande ou extraction et éxecution de la cible du Raccourci.

A noter que contrairement à l'été dernier, l'étude est cette fois faite AVANT l'implémentation. :D

Dim 06/05/2012 - Actualités

Posté : dim. 6 mai 2012 22:12
par Xavier
Contrôles


Le Constructor est prêt. C'est finalement lui qui analyse les paramètres et décide de la propriété Create. Il prend en entrée le Contrôle parent, et l'identifiant de la Commande et se charge du reste.

Dim 06/05/2012 - Actualités

Posté : dim. 6 mai 2012 22:51
par Xavier
Problème


Il n'est pas possible de rechercher les composants graphiques existants de la Barre lors de l'initialisation de l'application puisque qu'à ce moment-là, la Barre n'existe pas encore, et tenter de la manipuler provoque logiquement un crash.

Re: Dim 06/05/2012 - Actualités

Posté : dim. 6 mai 2012 23:06
par Denis
donc stocker dans une liste globale à l'appli les controles deja ajoutée, et l'interroger à la place de la barre.

Re: Dim 06/05/2012 - Actualités

Posté : lun. 7 mai 2012 09:01
par Xavier
DMo a écrit :donc stocker dans une liste globale à l'appli les controles deja ajoutée, et l'interroger à la place de la barre.
Oui, je vois l'idée. Mais ça resterait une liste de nom de composants, et il me faut les composants eux-mêmes, donc après leur création. La nuit portant conseil, je vais déporter la création des Contrôles après la création de la Barre, il y a une section pour ces cas délicats dans le Moteur, dont la première étape s'éxécute une seule fois après création de la Barre.

Re: Dim 06/05/2012 - Actualités

Posté : lun. 7 mai 2012 12:08
par Denis
Tc:= FindComponent(WidgetName.AsString);
if (Assigned(Tc)) and (Tc is TControl) then//gérer ici le test s'il existe
begin
end;

Re: Dim 06/05/2012 - Actualités

Posté : lun. 7 mai 2012 14:00
par Xavier
DMo a écrit :Tc:= FindComponent(WidgetName.AsString);
if (Assigned(Tc)) and (Tc is TControl) then//gérer ici le test s'il existe
begin
end;
Oui, mais FindComponent est une méthode d'instance, et le Self qui est implicitement la fenêtre courante dans ton exemple, doit être spécifié si l'appel est fait à partir d'une autre unité.

Au démarrage de l'application, je suis encore dans le Noyau, je devrais donc écrire :
Tc:= FindComponent(Bar_Form.WidgetName.AsString);
ou
Tc:= Bar_Form.FindComponent(WidgetName.AsString);
ce qui crashe car Bar_Form n'existe pas encore.

Re: Dim 06/05/2012 - Actualités

Posté : lun. 7 mai 2012 14:01
par Denis
okok