Partie I : Composants non-visuels


précédentsommairesuivant

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 :

Image non disponible

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.

 
Sélectionnez

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.

 
Sélectionnez

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) :

 
Sélectionnez

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 :

 
Sélectionnez

SelectDirDialog.OnAccept := SelectDirDialogAccept;
			

Voici le code complet actuel de l'unité TestComposTutoMain.pas :

TestComposTutoMain.pas
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

 
Sélectionnez

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 :

TestComposTutoMain.pas
Sélectionnez

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 :

TestComposTutoMain.dfm
Sélectionnez

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-là : le fichier .dcr est ajouté automatiquement.

Recompilez. Le composant TSelectDirDialog est maintenant doté d'une icône digne de ce nom.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Tutoriels
Les génériques avec Delphi 2009 Win32 (English version) - également disponible en espagnol et en russe
Réaliser un plug-in comportant un composant
Construire une procédure pointant sur une méthode
Création de composants - en 4 parties
Refactoring avec Delphi 2007
Prise en main de Delphi 2005
Analyseurs syntaxiques - Leur fonctionnement par l'exemple
Créer un fichier d'aide HLP
Pourquoi un paramètre const change-t-il mystérieusement de valeur ?
Sources
SJRDUnits - Routines et classes diverses
SJRDComps - Quelques composants
Projet Sepi
Présentation
FAQ Sepi
Programmes
FunLabyrinthe - Jeu de labyrinthe très spécial et très fun
TrickTakingGame - Jeux de cartes à plis en ligne
MultiAgenda - Agenda multi-répertoires
DecodeFormulaires - Décode les formulaires
Excel --> HTML - Convertisseur de tableaux Excel en HTML
AddressLinks - Lie les adresses Internet et e-mail d'un document HTML
Vipion - Tic Tac Toe sur 4x4 cases avec jeu de l'ordinateur
BigCalc - Calculatrice de haut niveau
Espace paroissial Astérion de Watermael-Boitsfort
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Sébastien Doeraene. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.