III. Test du composant en le créant dynamiquement▲
Pour tester un composant, il est plus prudent et souvent plus facile de le créer dynamiquement sur une fiche et de manipuler ses propriétés à l'exécution.
Créez donc un nouveau projet. Nous le nommerons TestComposTuto.exe. Pour faciliter les choses, nous allons créer un groupe de projets ComposTuto.bpg (D7 et inférieurs) ou ComposTuto.bdsgroup (D2005 et supérieurs). Nous pouvons déjà y mettre le paquet ComposTutoR et le projet TestComposTuto. Nous appellerons l'unité principale TestComposTutoMain.pas.
Nommez la fiche FormMain, ensuite placez-y un bouton et un éditeur. Nommez le bouton ButtonSelectDir et l'éditeur EditDirectory (c'est mon choix, faites ce que vous voulez). Vous obtiendrez ceci :
Dans la déclaration de la classe, dans la partie public, déclarez le composant SelectDirDialog de type TSelectDirDialog. N'oubliez pas d'ajouter l'unité SelDirDlg dans les uses.
Dans l'événement OnCreate de la fiche, nous allons créer le composant et lui assigner quelques propriétés. Nous en profiterons pour placer le dossier de l'application dans l'éditeur.
procedure
TFormMain.FormCreate(Sender: TObject);
begin
SelectDirDialog := TSelectDirDialog.Create(Self
);
SelectDirDialog.Caption := 'Vous pouvez choisir un dossier'
;
EditDirectory.Text := ExtractFilePath(Application.ExeName);
end
;
Nous avons choisi Self comme propriétaire du composant afin de nous décharger de sa destruction finale.
Dans l'événement OnClick du bouton, nous ferons apparaître la boîte de dialogue, en ayant pris soin de mettre comme dossier par défaut le dossier écrit dans l'éditeur.
procedure
TFormMain.ButtonSelectDirClick(Sender: TObject);
begin
SelectDirDialog.Directory := EditDirectory.Text;
SelectDirDialog.Execute;
end
;
Finalement, pour mettre à jour le contenu de l'éditeur lorsque l'utilisateur sélectionne un fichier, nous utiliserons un gestionnaire d'événement écrit à la main (n'oubliez pas de le déclarer également dans la partie public de la déclaration de la classe) :
procedure
TFormMain.SelectDirDialogAccept(Sender: TObject; Directory : TDirName);
begin
EditDirectory.Text := Directory;
end
;
Nous devons aussi affecter ce gestionnaire à l'événement, dans le OnCreate de la fiche :
SelectDirDialog.OnAccept := SelectDirDialogAccept;
Voici le code complet actuel de l'unité TestComposTutoMain.pas :
unit
TestComposTutoMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SelDirDlg;
type
TFormMain = class
(TForm)
ButtonSelectDir: TButton;
EditDirectory: TEdit;
procedure
FormCreate(Sender: TObject);
procedure
ButtonSelectDirClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
SelectDirDialog: TSelectDirDialog;
procedure
SelectDirDialogAccept(Sender: TObject; Directory : TDirName);
end
;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
procedure
TFormMain.FormCreate(Sender: TObject);
begin
SelectDirDialog := TSelectDirDialog.Create(Self
);
SelectDirDialog.Caption := 'Vous pouvez choisir un dossier'
;
SelectDirDialog.OnAccept := SelectDirDialogAccept;
EditDirectory.Text := ExtractFilePath(Application.ExeName);
end
;
procedure
TFormMain.ButtonSelectDirClick(Sender: TObject);
begin
SelectDirDialog.Directory := EditDirectory.Text;
SelectDirDialog.Execute;
end
;
procedure
TFormMain.SelectDirDialogAccept(Sender: TObject; Directory : TDirName);
begin
EditDirectory.Text := Directory;
end
;
end
.
Nous pouvons maintenant lancer le programme. Vous pouvez cliquer sur le bouton pour afficher la boîte de dialogue et, lorsque vous cliquez sur OK, le contenu de l'éditeur est mis à jour. Notez qu'il est évidemment possible de modifier directement le chemin dans l'éditeur ; pour y remédier (si vous le voulez), il suffit de passer sa propriété ReadOnly à True.
Maintenant que nous savons que notre composant fonctionne, nous pouvons l'installer dans la palette des composants afin de pouvoir le placer facilement sur n'importe quelle fiche.
IV. Installer le composant dans la palette de Delphi▲
Il reste une dernière étape dans la réalisation de notre composant : l'installer dans la palette des composants de Delphi.
Cette opération, qui peut sembler fastidieuse, est en fait très simple à faire. Nous allons voir pas à pas comment.
IV-A. Un paquet de conception▲
Pour pouvoir installer des composants dans la palette des composants, il faut réaliser un paquet de conception. Créez donc, dans le groupe de projets, un paquet nommé ComposTutoD.bpl.
Sélectionnez le menu Projet|Options. Saisissez une description pour le paquet et choisissez un type de paquet de conception.
Ajoutez une nouvelle unité que nous nommerons RegComposTuto. J'utilise Reg pour me rappeler que ce type d'unité ne fait rien d'autre que d'enregistrer (register) des composants dans la palette.
IV-B. La procédure Register▲
Dans cette unité, il faut déclarer une procédure nommée Register (elle doit se nommer comme cela) sans paramètre :
unit
RegComposTuto;
interface
procedure
Register
;
implementation
procedure
Register
;
begin
end
;
end
.
Cette procédure est reconnue de manière spéciale par l'EDI de Delphi. Vous devrez placer tout le code devant enregistrer les composants dans cette procédure.
Il ne faut jamais appeler vous-même cette procédure !
IV-C. La routine RegisterComponents▲
La routine que nous utiliserons pour recenser (ou enregistrer) le composant sera la routine RegisterComponents de l'unité Classes. Il faudra donc ajouter l'unité Classes dans les uses. Voici la déclaration de cette routine :
procedure
RegisterComponents(const
Page: string
;
const
ComponentClasses: array
of
TComponentClass);
Le paramètre Page est de type chaîne et indique le nom de l'onglet (ou du groupe de boutons pour D2005) dans lequel seront placés les composants.
Le paramètre TComponentClasses est un tableau ouvert de classes de composants.
IV-D. Recensement du TSelectDirDialog▲
Pour recenser le composant TSelectDirDialog dans l'onglet Tutoriel, nous appellerons donc RegisterComponents comme suit :
RegisterComponents('Tutoriel'
, [TSelectDirDialog]);
N'oubliez pas que pour pouvoir utiliser le type TSelectDirDialog, vous devrez rajouter l'unité SelDirDlg dans les uses.
IV-E. Code complet de l'unité RegComposTuto▲
Voici donc le code complet de l'unité RegComposTuto :
unit
RegComposTuto;
interface
uses
Classes, SelDirDlg;
procedure
Register
;
implementation
procedure
Register
;
begin
RegisterComponents('Tutoriel'
, [TSelectDirDialog]);
end
;
end
.
IV-F. Installation du paquet▲
Il ne reste plus qu'à compiler le package et à l'installer. Pour installer le package, cliquez sur le bouton Installer (D7 et inférieurs) ou cliquez droit sur le paquet et sélectionnez Installer (D2005 et supérieurs).
Vous pouvez désormais rouvrir le projet TestComposTuto, et placer le composant directement sur la fiche. Voici ce que donne le code final de la fiche du projet :
unit
TestComposTutoMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SelDirDlg;
type
TFormMain = class
(TForm)
ButtonSelectDir: TButton;
EditDirectory: TEdit;
SelectDirDialog: TSelectDirDialog;
procedure
FormCreate(Sender: TObject);
procedure
ButtonSelectDirClick(Sender: TObject);
procedure
SelectDirDialogAccept(Sender: TObject; Directory : TDirName);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end
;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
procedure
TFormMain.FormCreate(Sender: TObject);
begin
EditDirectory.Text := ExtractFilePath(Application.ExeName);
end
;
procedure
TFormMain.ButtonSelectDirClick(Sender: TObject);
begin
SelectDirDialog.Directory := EditDirectory.Text;
SelectDirDialog.Execute;
end
;
procedure
TFormMain.SelectDirDialogAccept(Sender: TObject; Directory : TDirName);
begin
EditDirectory.Text := Directory;
end
;
end
.
Voici aussi la forme texte du dfm :
object
FormMain: TFormMain
Left = 0
Top = 0
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Tests des composants du tutoriel'
ClientHeight = 89
ClientWidth = 425
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object
ButtonSelectDir: TButton
Left = 16
Top = 16
Width = 225
Height = 25
Caption = 'S'#233'lectionner un r'#233'pertoire'
TabOrder = 0
OnClick = ButtonSelectDirClick
end
object
EditDirectory: TEdit
Left = 16
Top = 48
Width = 393
Height = 21
TabOrder = 1
Text = 'EditDirectory'
end
object
SelectDirDialog: TSelectDirDialog
Caption = 'Vous pouvez choisir un dossier'
OnAccept = SelectDirDialogAccept
Left = 248
Top = 16
end
end
Remarquez au passage l'effet des spécificateurs default et stored.
IV-G. Une icône pour le composant▲
À nouveau, il reste une imperfection : ne trouvez-vous pas dommage que l'icône du composant soit un peu basique ? Nous allons remédier à cela.
Il nous faut tout d'abord une image. Celle-ci doit se trouver dans une ressource de type dcr (pour Delphi Component Resource). Pour éditer ce type de fichier, vous aurez besoin de l'éditeur d'images de Borland.
Dans Delphi, sélectionnez le menu Outils|Éditeur d'images. L'éditeur d'images s'ouvre. Sélectionnez le menu Fichier|Nouveau|Ressources composants (*.dcr). Une nouvelle fenêtre s'affiche. Faites alors Ressource|Nouvelle|Bitmap. Sélectionnez une taille de 24*24 pixels. Nommez la ressource du nom du composant correspondant.
Si l'unité enregistre plusieurs composants, le fichier .dcr peut contenir plusieurs bitmaps, chacun du nom du composant correspondant.
La transparence est déterminée d'après la couleur du pixel inférieur gauche. Dessinez une image correcte pour votre composant, puis enregistrez le tout sous le nom de RegComposTuto.dcr (vous devez utiliser le même nom de fichier que celui de l'unité qui enregistre les composants avec l'extension .dcr).
Finalement, rouvrez le paquet ComposTutoD.bpl, supprimez l'unité RegComposTuto puis rajoutez-la : le fichier .dcr est ajouté automatiquement.
Recompilez. Le composant TSelectDirDialog est maintenant doté d'une icône digne de ce nom.