Mar 08/05/2012 - Actualités

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

Mar 08/05/2012 - Actualités

Message non lu par Xavier »

Barre


Lors de la première exécution de The X-Tools 4.0.0, la Barre sera préconfigurée de façon à ressembler à celle de la version 3.

Cela se fera grâce à un flag à usage unique dont le fonctionnement est le suivant :
  • Démarrage de l'application, chargement du Noyau, et initialisation des variables internes. A ce stade, les variables définissant la configuration de la Barre ne prévoient que le minimum nécessaire :
    • Une seule Barre d'outil est affichée, les neuf autres sont cachées.
    • Un seul composant y est affiché, c'est le menu The X-Tools.
  • Toujours par le Noyau, tentative de chargement du fichier des options, et c'est ici qu'intervient le flag :
    • Pas de fichier d'options, donc installation nouvelle (ou incorrecte) -> activation du drapeau.
    • Fichier d'option trouvé -> mode normal, c'est à dire que ce sont les Contrôles stockés dans le fichier qui seront affichés.
  • Le Noyau est chargé, initialisation de la Barre : si le flag est détecté, alors lancement d'une routine qui va créer certains Contrôles afin d'initialiser la Barre en mode XT3.
Il sera possible de forcer cette réinitialisation en ajoutant la propriété DefaultBar=True dans le fichier d'options, les Contrôles qu'il contient seront donc ignorés au démarrage, et écrasés lors de la prochaine sauvegarde par les Contrôles réinitialisés.

Ce système permettra également d'avoir une Barre préconfigurée si l'application est lancée en mode Read-only.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Mar 08/05/2012 - Actualités

Message non lu par Xavier »

Executor


Le système de Barre par défaut fonctionne.

Il reste de très nombreux points à gérer ou à terminer avant d'avoir une Barre fonctionnelle, comme par exemple la gestion des icônes qui manque, les menus qui crashent, et le Gestionnaire de commandes qui n'est pas terminé.

Mais pour le moment, et afin de valider la totalité du Design de ce chantier, c'est le service en charge d'exécuter les Commandes et Raccourcis qui va être implémenté.
A priori rien de bien méchant : pour les Commandes, il suffit de fait un immense if... then... else if..., et pour les Raccourcis cela tient en une ligne :

Code : Tout sélectionner

ShellExecute(0, Nil, PChar(Target), PChar(Parameter), Nil, SW_ShowNormal)
Ce service qui sera situé dans le Noyau, s'apellera Executor, en souvenir de mon premier programme écrit dans les années 90 en Turbo Pascal, ce language ancêtre du Delphi et apprivoisé grâce aux patientes leçons de DMo. ;)
Executor.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Mar 08/05/2012 - Actualités

Message non lu par Denis »

wouaouh, ca marche encore ?
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Mar 08/05/2012 - Actualités

Message non lu par Xavier »

La magie des pointeurs


Dans The X-Tools 3, l'ouverture d'un outil se faisait via un service qui appelait le Create de la fenêtre de l'outil désiré.
Chaque fenêtre étant l'objet unique d'une classe spécifique, le code devait impérativement spécifier le nom de la classe à partir de laquelle créer la fenêtre :

Code : Tout sélectionner

	if        Form_Name = 'Calendar_Form'
	then      Calendar_Form := TCalendar_Form.Create(Nil);

	if        Form_Name = 'Alarms_Form'
	then      Alarms_Form := TAlarms_Form.Create(Nil);
(Les classes sont ici TCalendar_Form et TAlarms_Form.)
Pas très élégant mais impossible de faire autrement malgré de nombreuses tentatives et autant d'échec.


Pour The X-Tools 4, il fallait enfin réussir à se libérer de cette corvée, et parvenir à écrire un Constructor générique. :idea:


Et bien voici les lignes de code les plus puissantes de XT4 à ce jour :

Code : Tout sélectionner

	Tool_FormClass := Pointer(Tool_XD.GetIProp('.FormClass'));
	Application.CreateForm(Tool_FormClass, Tool_Form);
Le process entre le clic sur un bouton dynamique et l'ouverture d'un outil est le suivant :
  • L'utilisateur clique sur un bouton de la Barre.
  • Ce bouton pointe vers un objet TData de type Control. (A l'exception des Treeview et des ListView, les composants Delphi n'ont pas de pointeur Data natif. Par contre tous les composants on un champ Tag disponible, c'est un entier sur 32 bits. Ce qui tombe bien, puisque les pointeurs sont également des adresses mémoires stockées sur 32 bits. Dans XT4, les adresses des objets cibles sont donc converties en entiers via Integer(Address) puis stockées dans le Tag du composant. Quans il faut lire le lien, il suffit de recomposer l'adresse par Pointer(Component.Tag). C'est grâce à cette astuce que tous les objets de XT4 sont liés.)
  • A partir du Control, on retrouve la Commande (issue de la bibiothèque créée au démarrage) ou le Raccourci (créé par l'utilisateur).
  • On a maintenant une Commande et c'est l'Executor qui s'en charge. Comme dit plus tôt, pas de souci pour les Raccourcis, ni pour les Commandes internes qu'il faut bien harcoder.
  • Mais pour les outils, il fallait ce lanceur générique, qui fonctionne comme ceci :
    • A partir de l'identifiant de la Commande, on retrouve l'XD, cet objet qui porte les options et les variables d'un outil.
    • Sur cet XD est désormais stocké une nouvelle propriété, qui est un pointeur vers la classe de la fenêtre : XD_Contacts.SetProp('.FormClass', Integer(TContacts_Form));, lui même converti en entier puis en chaine.
    • L'Executor récupère donc cette propriété, la décode, et crée la fenêtre via la méthode Application.CreateForm, car un appel à Class.Create crée une fenêtre fictive, la routine ne semblant pas capable de digérer un pointeur vers une classe.

Long story short : ça marche !!! :mrgreen:
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Mar 08/05/2012 - Actualités

Message non lu par Denis »

tant mieux car j'ai rien capté ;-)
Répondre