IV. Exemple d'installation (RxLib)▲
Allez pour le finish, on va se faire un petit plaisir : créer un exe d'installation pour la RXLibrary. Même pas peur :-)))
Nous allons nous conformer aux prescriptions de la page précédente de ce document et suivre les étapes indiquées.
IV-A. Rassembler les fichiers à installer▲
La RXLib pour Delphi 6 une fois décompressée est décomposée en dossiers Help et Units :
Le dossier Units contient tous les sources des unités et des packages ainsi que les dcu. Notre installation devra reconstituer cette arborescence sur le poste d'installation. Nous aurons également besoin d'intégrer les fichiers bpl de la RX dans le pack d'install. Si la RX n'est pas encore installée dans votre environnement, il ne reste plus qu'à la compiler pour obtenir les fichiers *.bpl. Dans un premier temps il faut compiler les paquets d'exécution nommés :
- rxctl6.dpk ;
- rxdb6.dpk ;
- rxbde6.dpk.
Ensuite, il faut compiler les paquets de conception (design-time) nécessaires à l'intégration dans l'EDI Delphi - sachant que ces paquets requièrent ceux précédemment compilés :
- dclrx6.dpk ;
- dclrxbd6.dpk ;
- dcldxdb6.dpk.
Si la compilation s'est bien passée, nous obtenons les fichiers dcp et bpl dans le dossier $(Delphi)\Projects\bpl\ (dossier par défaut des fichiers dcp et bpl). Ces fichiers font partie de la future installation. On les installera dans les dossiers spécifiés dans les clés de registre respectives (cf. page précédente du présent tutoriel).
IV-B. Construire le script InnoSetup▲
Contrairement à une installation classique, l'installation des composants comporte quelques spécificités.
IV-B-1. S'assurer que Delphi 6 est installé▲
On passera par InnoSetup Extensions qui nous permet de paramétrer l'installation en pascal scripting. Dans la section code, fonction InitializeSetup, on vérifiera l'existence de Delphi 6 puis on initialisera des variables globales avec les chemins des BPL et des DCP, le tout grâce à des clés lues dans la base de registre :
var
DelphiRoot: string
;
BPLPath: string
;
DCPPath: string
;
function
InitializeSetup : Boolean
;
begin
if
GetDelphiRoot = '?'
then
begin
MsgBox('Delphi 6 n''est pas installé sur votre PC'
);
Result := False
;
end
else
begin
//On récupère les chemins de destination des paquets compilés
GetDPLOutput;
GetDCPOutput;
Result := True
;
end
;
end
;
IV-B-2. Récupérer les dossiers où installer la RXLib▲
Tous les chemins d'installation ne sont pas connus à l'avance, il faut parfois les définir après lecture de certaines clés de la base de registre. C'est pourquoi nous avons ajouté des fonctions qui récupèrent ces chemins.
Rappelons que les fonctions présentées ici (comme RegQueryStringValue) sont propres à InnoSetup Extensions et non pas à Delphi.
function
GetDelphiRoot : string
;
begin
if
not
RegQueryStringValue(HKCU, 'Software\Borland\Delphi\6.0'
, 'RootDir'
, DelphiRoot) then
Result := '?'
else
Result := DelphiRoot;
end
;
function
GetDPLOutput : string
;
var
p : integer
;
begin
RegQueryStringValue(HKCU, 'Software\Borland\Delphi\6.0\Library'
, 'Package DPL Output'
, BPLPath);
p := Pos('$(DELPHI)'
, BPLPath);
if
p > 0
then
BPLPath := DelphiRoot + Copy(BPLPath, 10
, Length(BPLPath) - 9
);
Result := BPLPath;
end
;
function
GetDCPOutput : string
;
var
p : integer
;
begin
RegQueryStringValue(HKCU, 'Software\Borland\Delphi\6.0\Library'
, 'Package DCP Output'
, DCPPath);
p := Pos('$(DELPHI)'
, DCPPath);
if
p > 0
then
DCPPath := DelphiRoot + Copy(DCPPath, 10
, Length(DCPPath) - 9
);
Result := DCPPath;
end
;
IV-B-3. Réalisation du script▲
Maintenant que nous avons à notre disposition des fonctions utilitaires pour l'installation, il nous reste à énumérer la liste des fichiers à installer et leur emplacement :
...
Source: c:\Rx Library\Units\ICOLEDIT.PAS; DestDir: {app}\Units
Source: c:\Rx Library\Units\ICOLIST.dcu ; DestDir: {app}\Units
Source: c:\Rx Library\Units\ICOLIST.PAS ; DestDir: {app}\Units
Source: c:\Rx Library\Units\IMAGPRVW.dfm; DestDir: {app}\Units
Source: c:\Rx Library\Units\IMAGPRVW.PAS; DestDir: {app}\Units
...
Les bpl et dcp sont à installer dans le chemin indiqué respectivement dans les clés de registre HKCU\Software\Borland\Delphi\6.0\Library\Package DPL Output\ et …\Library\Package DCP Output\.
Au lieu d'exprimer un chemin de destination en dur, on délègue à InnoSetup la recherche de ce chemin en spécifiant la directive {code:function|parameter}, voici la liste des bibliothèques à installer (on les aura placées initialement dans un sous dossier \Lib du dossier source de la RX) :
Source: C:\Rx Library\Lib\rxdb6.bpl ; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\dclrx6.bpl ; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\dclrxbd6.bpl; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\dclrxdb6.bpl; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\rxbde6.bpl ; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\rxctl6.bpl ; DestDir: {code:ReadBPL|}
Source: C:\Rx Library\Lib\rxdb6.dcp ; DestDir: {code:ReadDCP|}
Source: C:\Rx Library\Lib\dclrx6.dcp ; DestDir: {code:ReadDCP|}
Source: C:\Rx Library\Lib\dclrxbd6.dcp; DestDir: {code:ReadDCP|}
Source: C:\Rx Library\Lib\dclrxdb6.dcp; DestDir: {code:ReadDCP|}
Source: C:\Rx Library\Lib\rxbde6.dcp ; DestDir: {code:ReadDCP|}
Source: C:\Rx Library\Lib\rxctl6.dcp ; DestDir: {code:ReadDCP|}
Les fonctions ReadBPL et ReadDCP (auxquelles on passe un paramètre vide) lisent simplement les variables globales qui ont été initialisées lors du InitializeSetup :
function
ReadBPL(S : string
) : string
;
begin
Result := BPLPath + S;
end
;
function
ReadDCP(S : string
) : string
;
begin
Result := DCPPath + S;
end
;
Enfin il reste à écrire des clés dans le registre indiquant à Delphi la présence des nouveaux paquets à prendre en compte pour la palette de composants. Il suffit d'ajouter dans la clé $(DELPHI)\Known Packages\ les chemins des paquets de conception bpl :
[Registry]
Root: HKCU; Subkey: Software\Borland\Delphi\6.0\Known Packages; ValueType: string; ValueName: {code:ReadBPL|\dclrxdb6.bpl}; ValueData: Rx Library Database Components ; Flags: uninsdeletevalue
Root: HKCU; Subkey: Software\Borland\Delphi\6.0\Known Packages; ValueType: string; ValueName: {code:ReadBPL|\dclrx6.bpl} ; ValueData: Rx Library Controls and Tools ; Flags: uninsdeletevalue
Root: HKCU; Subkey: Software\Borland\Delphi\6.0\Known Packages; ValueType: string; ValueName: {code:ReadBPL|\dclrxbd6.bpl}; ValueData: Rx Library BDE Database Components; Flags: uninsdeletevalue
Voilà, il ne vous reste plus qu'à compiler le setup et… le tour est joué !
Et pour vous remercier d'avoir lu le tutoriel jusqu'ici et vous encourager à suivre cette philosophie d'installation de composants sont disponibles en téléchargement :
[22 ko] les sources RXLibInstall.iss du script d'installation InnoSetup Extensions ;
[5,4 Mo] l'exécutable final d'installation de la RXLib 2.75 (Setup_RX275.exe).
Voir aussi la bibliothèque de composants RxLib.
V. Conclusion▲
Finalement l'intégration automatique des librairies de composants dans Delphi n'est pas très compliquée puisqu'il suffit de les placer dans les bons dossiers et de renseigner en adéquation la base de registre. La désinstallation avec InnoSetup est automatique. Que ce soit pour constituer une installation personnelle de son environnement de composants ou pour distribuer vos créations, cette méthode séduira sans aucun doute les utilisateurs et encore plus ceux qui s'étaient préalablement confrontés à l'installation de la RX…
Reste un domaine non abordé, le cas où l'installation de vos composants doit s'effectuer dans un package déjà existant de l'environnement Delphi, par exemple le dclusr60.dpk. Une recompilation dans ce cas serait obligatoire, donc on devrait soit lancer cette compilation en appelant le compilateur DCC32.exe via un fichier batch, ou pourquoi pas passer par les API OpenTools : OTA et INTA services. On dépasse déjà l'objectif initial de ce tutoriel, mais c'est une méthode à creuser. Reste à débattre de l'intérêt d'intégrer vos nouveaux composants dans un paquet existant ou systématiquement dans des nouveaux paquets…