Introduction aux Experts IDE sous Delphi 7

Matthias Lamoureux

Ce tutoriel est destiné à vous faire entrevoir les immenses capacités d'évolution de l'IDE de Delphi, Kylix et BCB. Il est largement adapté de ce que l'on peut trouver sur le sujet dans l'excellent livre de Paul TOTH et d'Olivier DAHAN : Delphi 7 Sudio, éditons Eyrolles.

Remarque
Je n'explique pas ici tous les tenants et aboutissants des experts ni du code donné. Les choix sont par définition discutables, et ça n'est qu'une introduction. N'étant pas un pro des experts, cette approche est plutôt donnée à titre indicatif.

Donc, ne m'en voulez pas si après ce tutoriel, vous ne savez pas pourquoi j'ai utilisé telle classe, ni quelle est la liste exhaustive des méthodes de telle autre, dans l'aide en ligne de l'unité ToolsApi il existe plus ou moins 130 entrées (interfaces et fonctions comprises).
À la fin du tutoriel, vous aurez un expert qui fonctionnera.
Ensuite vous pouvez utiliser le forum Delphi pour échanger vos idées et partager vos informations sur le sujet…

- Titre : Introduction aux Experts IDE sous Delphi 7

- Auteur : Matthias Lamoureux

- Parution : 24 juin 2004

- Mise à jour : 2 janvier 2020

- Licence : Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- I. Public concerné

- II. Qu'est-ce qu'un Expert IDE ?

- III. Un paquet pour notre Expert

- IV. Les bases de l'Expert

- V. Mettons-nous à la couleur

- VI. Un peu plus loin…

I - Public concerné

Débutant

Avancé

Expert

[X]___[X]

[ ]___[ ]

[ ]___[ ]

Testé avec Delphi 7 sous XP pro.
Versions Delphi 6,7.

version 1.0.
Dernière mise à jour, le 13/07/2004.

II - Qu'est-ce qu'un Expert IDE ?

Un Expert IDE peut être vu comme un programme qui facilite la vie du programmeur. C'est un élément intégré à l'environnement de développement (IDE), et qui permet de lui ajouter des fonctionnalités.

Ce tutoriel a pour origine le problème suivant : comment réaliser un expert qui insèrerait dans la fenêtre de code et à l'emplacement du curseur, le code hexadécimal d'une couleur choisie dans une fenêtre de sélection de couleurs ?
L'appel de cet Expert se faisant par une combinaison de touches.

III - Un paquet pour notre Expert

Ce que l'on cherche à faire, c'est dans un premier temps à récupérer une combinaison de touches (Ctrl+Alt+L par exemple), puis de lancer la boîte de dialogue de sélection de couleurs, et enfin d'insérer le code de la couleur.

- Ouvrez Delphi et faites 'Fichier/Tout Fermer', on n'a pas besoin d'application.

- 'Fichier/Nouveau/Autres', dans l'onglet nouveau choisir Paquet.

- 'Fichier/Enregistrer'. Créez un nouveau répertoire et nommez votre package : ExpertInsertColor.dpk.

- Enfin 'Projet/Options'. Choisir Seulement en Conception et Explicite, comme le montre la capture d'écran suivante :

Reportez-vous à l'aide en ligne pour la signification des différentes options.

Et voilà, votre paquet est prêt.
Il ne reste plus qu'à ajouter nos deux unités :

- 'Fichier/Nouveau/Unité' et enregistrez-la sous le nom ExpertClassInsertColor.pas ;

- 'Fichier/Nouveau/Unité' et enregistrez-la sous le nom ExpertRegisterInsertColor.pas ;

- 'Fichier/Tout Enregistrer'.

Tout est fin prêt pour créer l'Expert.
Dans la section Requires du paquet, doit se trouver le fichier designide.dcp, s'il n'y est pas cliquez avec le bouton droit de la souris sur Requires, et faites 'Ajouter'. Le fichier se trouve dans le répertoire Lib de Delphi.

IV - Les bases de l'Expert

Nous allons tout d'abord créer un Expert vide qui répond simplement à la combinaison de touches Ctrl+Alt+L.
Voici le code de base à intégrer dans l'unité ExpertClassInsertColor.pas.

Tout d'abord la déclaration de notre classe TExpertInsertColor dans la partie interface de notre unité :

interface
uses
Classes, SysUtils, Windows, Menus, ToolsAPI, Graphics;
type
TExpertInsertColor = class(TNotifierObject, IUnknown, IOTANotifier, IOTAKeyboardBinding)
protected
procedure DoBindKeyboard(const Context : IOTAKeyContext; KeyCode : TShortCut;
var BindingResult : TKeyBindingResult);
public
// Les méthodes des interfaces supportées.
function GetBindingType : TBindingType;
function GetDisplayName : String;
function GetName : String;
procedure BindKeyboard(const BindingServices : IOTAKeyBindingServices);
end;

Les méthodes publiques sont celles qui sont importées des différentes interfaces supportées. La méthode protégée DoBindKeyboard est celle qui répond au raccourci clavier.
Voici maintenant le code détaillé de chacune de ces méthodes :

implementation
uses
Dialogs;

// C'est la méthode qui lie la combinaison de touches à la méthode à exécuter : DoBindKeyboard
procedure TExpertInsertColor.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
begin
BindingServices.AddKeyBinding([ShortCut(Ord('L'), [ssCtrl, ssAlt])],DoBindKeyboard,nil);
end;

// C'est la méthode qui est exécutée quand la combinaison de touches a été effectuée
procedure TExpertInsertColor.DoBindKeyboard(const Context: IOTAKeyContext; KeyCode: TShortCut;
var BindingResult: TKeyBindingResult);
begin
// On affiche qu'on a bien récupéré la combinaison de touches
ShowMessage('Ca maaaaaaarche !!!);
// On signifie que l'on a bien géré ce que l'on voulait
BindingResult := krHandled;
end;

// Méthode qui dit quel type d'affectation de touches on effectue
function TExpertInsertColor.GetBindingType: TBindingType;
begin
// On ne surcharge pas tout le clavier
Result := btPartial;
end;

// Renvoie la chaîne à afficher dans Outils/Options de l'éditeur/Affectations de touches
function TExpertInsertColor.GetDisplayName: String;
begin
Result := 'Ctrl+Alt+L : Insert Color';
end;

// Renvoie le nom de l'Expert, ce nom doit être unique
function TExpertInsertColor.GetName: String;
begin
Result := 'Lamoureux.Experts.InsertColor';
end;

Il faut maintenant enregistrer votre Expert auprès de Delphi. Dans l'unité ExpertRegisterInsertColor ajoutez le code suivant :

interface

procedure Register;

implementation

uses
ToolsAPI,
ExpertClassInsertColor;

procedure Register;
begin
(BorlandIDEServices as IOTAKeyboardServices).AddKeyboardBinding(TExpertInsertColor.Create);
end;

Voilà, votre premier Expert est fini. Il vous reste à compiler votre paquet (Ctrl+F9) et à l'installer (Bouton dans la fenêtre Paquet).

Vous pouvez tester en vous mettant dans une fenêtre de code et en tapant Ctrl+Alt+L.

Votre Expert fonctionne, mais il ne fait pas encore ce que nous voulons…

V - Mettons-nous à la couleur

Nous allons maintenant ajouter l'insertion de la couleur dans l'éditeur de code. Pour ce faire, nous allons écrire la méthode InsertColor qui se chargera de cette opération.

Dans la partie protégée de la classe TExpertInsertColor, on ajoute l'en-tête suivant :

procedure InsertColor(const Editor: IOTASourceEditor; const View: IOTAEditView);

Et son code associé dans la partie implementation :

procedure TExpertInsertColor.InsertColor(const Editor: IOTASourceEditor; const View: IOTAEditView);
var
ColorDialog : TColorDialog;
begin
// Création de la boîte de sélection de couleurs
ColorDialog := TColorDialog.Create(nil);
try
// Si l'utilisateur clique sur OK
if ColorDialog.Execute then
// Alors on insère la couleur transformée en texte dans l'éditeur
View.Position.InsertText(ColorToString(ColorDialog.Color));
finally
ColorDialog.Free;
end;
end;

Il ne reste plus qu'à appeler la méthode InsertColor à la place de notre ShowMessage dans la méthode DoBindKeyboard.

procedure TExpertInsertColor.DoBindKeyboard(const Context: IOTAKeyContext; KeyCode: TShortCut;
var BindingResult: TKeyBindingResult);
begin
// On insère une couleur
InsertColor(Context.EditBuffer,Context.EditBuffer.TopView);
// On signifie que l'on a bien géré ce que l'on voulait
BindingResult := krHandled;
end;

Compilez, placez-vous dans la fenêtre de code puis faites Ctrl+Alt+L. Vous pouvez constater l'insertion du code de la couleur choisie à l'emplacement du curseur.

Remarque : il peut arriver qu'une erreur survienne lors de la compilation due au fait que Delphi utilise le paquet, et par conséquent ne puisse le recréer.
Il suffit alors de sauvegarder votre travail, quitter Delphi puis de le rouvrir. Fermez tout, rouvrez votre paquet et compilez-le.

VI - Un peu plus loin…

Nous aimerions, si le texte sélectionné dans l'éditeur est un code de couleur, que la boite de sélection se positionne sur cette couleur.
Nous allons donc ajouter une méthode qui va lire ce qui est sélectionné dans l'éditeur de code.

Ajoutons donc dans la partie protégée de notre classe la méthode suivante :

function ReadColor(const Editor: IOTAEditBuffer) : TColor;

Et son code dans la partie implementation :

function TExpertInsertColor.ReadColor(const Editor: IOTAEditBuffer): TColor;
var
Text : string;
begin
// Si rien n'est sélectionné, on renvoie noir
if Editor.EditBlock.Size = 0 then
Result := clBlack
else
begin
// On récupère le texte sélectionné
Text := Editor.EditBlock.Text;
try
// On le transforme en couleur
Result := StringToColor(Text);
except
// Si c'est pas une couleur on renvoie noir
Result := clBlack;
end;
end;
end;

Et juste avant d'exécuter la boîte de couleurs, on initialise sa couleur à ce qui est lu dans l'éditeur :

ColorDialog.Color := ReadColor(Editor as IOTAEditBuffer);

Compilez et vérifier qu'il fonctionne.
J'espère que votre entrée dans le monde des Experts vous aura plu.

Vous trouverez des exemples des Api OpenTools dans le répertoire \Delphi\Demos\ToolsAPI

Quelques liens sur le sujet :

Documents sur une conférence Borland 2001 autour d'OpenTools.

Utilisation des packages pour les composants.

La gestion des packages.

Code central,section Open Tools.

Une mine d'informations sur Opentools : une FAQ, des liens, une liste des bogues d'OpenTools D5, D6, D7…