Dim 06/05/2012 - Actualités

Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Dim 06/05/2012 - Actualités

Message non lu 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:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Dim 06/05/2012 - Actualités

Message non lu 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
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Dim 06/05/2012 - Actualités

Message non lu 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.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Dim 06/05/2012 - Actualités

Message non lu 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.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

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

Message non lu par Denis »

donc stocker dans une liste globale à l'appli les controles deja ajoutée, et l'interroger à la place de la barre.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

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

Message non lu 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.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

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

Message non lu par Denis »

Tc:= FindComponent(WidgetName.AsString);
if (Assigned(Tc)) and (Tc is TControl) then//gérer ici le test s'il existe
begin
end;
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

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

Message non lu 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.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

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

Message non lu par Denis »

okok
Répondre