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…