6.7.Construction d'un contrôle ActiveX
sous Delphi
Plan du chapitre:1. Utilisation de l'expert de création d'ActiveX de Delphi
Utiliser l'expert contrôle ActiveX
Construction pas à pas d'un ActiveX
Delphi fournit depuis la version 4, heureusement un expert de construction des ActiveX qui implantent incluent et génèrent automatiquement le code source associé aux diverses interfaces nécessaires. Le seul travail restant à effectuer est de programmer les nouvelles fonctionnalités du futur ActiveX. Un contrôle ActiveX dans Delphi est simplement un contrôle VCL qui a été rendu accessible aux applications et aux objets supportant les contrôles ActiveX en englobant le contrôle VCL dans une enveloppe de classe ActiveX.
Lorsque vous créez un contrôle ActiveX, vous devez d’abord concevoir ou choisir le contrôle VCL à partir duquel vous allez le construire.
La démarche
à suivre est très simple, l'expert effectuant toutes les opérations
il suffit de suivre et de répondre aux questions de celui-ci, le seul
vrai travail consiste à développer un composant Delphi (voir
le chapitre 7.1)
1. Utilisation
de l'expert de création d'ActiveX de Delphi
Utiliser l'expert contrôle ActiveX
Pour créer un
nouveau contrôle ActiveX à partir d'un contrôle VCL personnalisé,
Delphi propose deux experts permettant de construire :
- Des contrôles ActiveX qui encapsulent des classes VCL.
- Des fiches ActiveX semblables aux contrôles, mais dirigées vers le déploiement Web.
Dans les deux cas l'expert
place en fait une enveloppe de classe ActiveX autour d'un contrôle
VCL ou d'une fiche et construit le contrôle ActiveX qui contient l'objet.
Etape-1°)
Construction à partir du composant VCL déjà écrit,
TEditColorResize du sous-chapitre 7.4 :
unit UEditColor ;
interface
uses
SysUtils, Messages, Classes, Graphics, Controls, Forms, StdCtrls, ExtCtrls, Outline ;
type
TEventColor = procedure ( Sender: TObject ; couleur : Tcolor) of object ;
{ pointeur de gestionnaire d'événement OnColorChange (paramètre couleur : TColor, nécessaire ici }
TEditColorResize = class (TEdit)
private
FColorChange : TEventColor ;
{ pointeur de méthode spécifique permettant d'utiliser la property OnColorChange }
ColorPrec : Tcolor ; // la couleur précédente
FOnResize : TNotifyEvent ;
{ pointeur de méthode permettant utiliser la property OnResize }
procedure WMPaintChgColor( var Msg : TWMpaint) ; message WM_PAINT ;
{le message WM_PAINT qui permettra de matérialiser l'événement}
procedure WMSizeRedim( var Msg : TWMsize) ; message WM_size ;
{le message WM_size est envoyé au TEdit dès son height ou son width a changé }
protected
procedure ColorChange(coul : TColor) ; virtual ; {pour surcharge ultérieure par le programmeur }
public
constructor Create(AOwner : TComponent) ; override;
published //nouveau gestionnaire d'événement
property OnColorChange : TEventColor read FColorChange write FColorChange ;
property OnResize : TNotifyEvent read FOnResize writeFOnResize ;
end;
procedure Register ;
implementation
procedure Register ;
begin
RegisterComponents( 'Exemples' , [TEditColorResize]) ;
end;
//------------------------------------------------------------//
constructor TEditColorResize.Create(AOwner : TComponent) ;
begin
inherited;
color := clwhite ;
ColorPrec := self.color // initialisation è la couleur actuelle
end;
procedure TEditColorResize.WMSizeRedim( var Msg : TWMsize) ;
// intercepte le message WM_size et traite le changement de taille
begin
if Assigned(OnResize) then
FOnResize( self ) //lien avec le futur gestionnaire du programmeur
end;
procedure TEditColorResize.WMPaintChgColor( var Msg : TWMpaint) ;
// intercepte le message WM_Paint et traite le changement de couleur
begin
inherited ;
if color < ColorPrec then
begin
ColorChange(ColorPrec) ;
ColorPrec := color ;
change // appelle le gestionnaire d'événement OnChange, s'il est défini.
end
end;
procedure TEditColorResize.ColorChange(coul : TColor) ;
// pour que le développeur puisse la surcharger éventuellement
begin
if Assigned(FColorChange) then
FColorChange( self ,coul) // lien avec le futur gestionnaire du programmeur
end;
end.
Composant que nous
avons rangé dans la palette des composants dans l'onglet exemples
:
Etape-2°) Afficher l'expert contrôle ActiveX (à partir du menu Fichier\Nouveau\Autre) :
On choisit la création d'un contrôle ActiveX :
Delphi envoie un formulaire
de saisie d'information sur le paramétrage de création du contrôle
ActiveX, nous lui indiquons que nous voulons encapsuler le composant TEditColorResize
:
Delphi fournit dans la boîte "Classe VCL" la liste de
tous les VCL enregistrés dans la palette, donc le TEditColorResize
que nous sélectionnons.
L'expert génère
automatiquement des fichiers intermédiaires dont :
library EditColorResizeXControl1
;
uses
ComServ,
EditColorResizeXControl1_TLB in 'EditColorResizeXControl1_TLB.pas' ,
EditColorResizeImpl1 in
'EditColorResizeImpl1.pas'
{EditColorResizeX: CoClass} ;
{$E ocx}
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer ;
{$R *.TLB}
{$R *.RES}
begin
end.
unit EditColorResizeImpl1 ;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, Controls, Graphics, Menus, Forms, StdCtrls,
ComServ, StdVCL, AXCtrls, EditColorResizeXControl1_TLB, UEditColor ;
type
TEditColorResizeX = class (TActiveXControl, IEditColorResizeX)
private
{ Déclarations privées }
FDelphiControl : TEditColorResize ;
FEvents : IEditColorResizeXEvents ;
procedure ChangeEvent( Sender: TObject) ;
procedure ClickEvent( Sender: TObject) ;
procedure ColorChangeEvent( Sender: TObject ; couleur : TColor) ;
procedure DblClickEvent( Sender: TObject) ;
procedure KeyPressEvent( Sender: TObject ; var Key : Char ) ;
procedure ResizeEvent( Sender: TObject) ;
protected
{ Déclarations protégées }
procedure DefinePropertyPages(DefinePropertyPage : TDefinePropertyPage) ; override;
procedure EventSinkChanged( const EventSink : IUnknown) ; override;
procedure InitializeControl ; override;
function DrawTextBiDiModeFlagsReadingOnly : Integer ; safecall ;
function Get_AlignDisabled : WordBool ; safecall ;
function Get_AutoSelect : WordBool ; safecall ;
function Get_AutoSize : WordBool ; safecall ;
function Get_BevelInner : TxBevelCut ; safecall ;
function Get_BevelKind : TxBevelKind ; safecall ;
.........
end;
implementation
.........
end.
- L'expert génère aussi : une bibliothèque de type (EditColorResizeXControl1_TLB.pas) qui définit une CoClasse pour le contrôle (540 lignes).
Si nous décomptons les lignes que l'expert a engendré pour encapsuler notre composant, nous obtenons un total de 1120 lignes ! Cela montre malgré tout la lourdeur du codage COM, heureusement nous n'avons pas à intervenir sur ces lignes de codes. Il nous reste à rendre accessible notre nouvel ActiveX afin que d'autres applications puissent l'utiliser
Etape-3°) Recenser l'ActiveX nouvellement créé
Une fois le contrôle ActiveX créé, il faut le recenser afin que d'autres applications puissent le trouver et l'utiliser c'est à dire l'inscrire dans la base des registres de windows comme serveur COM. On dispose soit du regsvr32.exe … du système d'exploitation (en fenêtre de commande DOS), soit de la commande recenser dans le menuExécuter de Delphi :
Menu Exécuter/Recenser le serveur ActiveX :
Delphi répond :
Au final Delphi engendre un seul fichier utile : le fichier contenant l'ActiveX. Les fichiers ActiveX se terminent par le suffixe OCX.
Dans le cas de notre exemple le fichier engendré a pour nom : EditColorResizeXControl1.ocx.
Vous pouvez mettre ce fichier où vous le voulez, pour pouvoir l'utiliser il faut le recenser là où vous l'avez mis.
Remarque :
Avant de supprimer un contrôle ActiveX du système, il faut annuler son recensement avec le menu Exécuter|Dérecenser le serveur ActiveX..
Ou bien lancer la commande regsvr32.exe /u … du système d'exploitation (en fenêtre de commande DOS)
Le composant EditColorResizeXControl1.ocx est maintenant utilisable avec un autre environnement comme C++, visual Basic,…
Afin de vérifier le bon fonctionnement de EditColorResizeXControl1.ocx nous allons l'installer dans la palette des composants Delphi comme un nouvel ActiveX (Delphi ignore qu'il a été conçu par Delphi, c'est un ActiveX comme des milliers d'autres que vous pouvez acheter ou récupérer gratuitement sur Internet).
Etape-4°) Comment installer dans la palette Delphi un ActiveX
Dans le menu Composant, la commande "Importer un contrôle ActiveX" lance l'opération
La suite du dialogue avec Delphi est identique à celle que vous avez lorsqu'il s'agit d'installer un composant Delphi classique, le dialogue se termine par l'affichage de la boîte suivante :
A partir de cet instant lorsque vous avez validé l'installation dans la palette vous disposez de la même entité représentée sous deux formats différents :
Un éditeur mono-ligne sensible au changement de couleur et au redimensionnement, vous en avez un version VCL (donc utilisable uniquement avec Delphi) et une autre version ocx utilisable avec tous les environnements de développements qui acceptent les ActiveX.
Enfin pour les utilisateurs de l'environnement .Net, ce composant ActiveX peut être converti par Net Framework à travers l'outil de conversion aximp :
aximp c:\….\ EditColorResizeXControl1.ocx --> en un fichier AxEditColorResizeXControl1.dll
utilisable par tout langage de l'architecture Net.