6.7.Construction d'un contrôle ActiveX
sous Delphi


Plan du chapitre:

Introduction

1. Utilisation de l'expert de création d'ActiveX de Delphi
 

Utiliser l'expert contrôle ActiveX
Construction pas à pas d'un ActiveX



Introduction

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.

Construisons pas à pas , en 4 étapes, un ActiveX
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. 

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.
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.