1. HxD Hex Editor 1.6.1 (328 fois)
2. Open Office 2.2.1 (294 fois)
3. Delphi 6 (253 fois)
4. Windows Live Messenger (175 fois)
5. FireFox 2.0.0.12 (135 fois)
03 Sept 2008
Google Chrome : le navigateur 100 % Made In Google... ou presque !
28 Août 2008
Internet Explorer 8 : toutes les nouveautés du navigateur
18 Août 2008
Windows 7 : tout savoir sur le prochain système de Microsoft
13 Août 2008
The Pirate Bay censuré en Italie - L'arrêt de mort du réseau P2P ?
11 Août 2008
Hop : le nouveau tĂ©lĂ©phone jetable Ă 15€
Google : le maître des noms de domaines
La nouvelle version de GMail en images !
Barème de rémunération pour les disques durs multimédias
Afficher la date et heure du jour
Alignement de séquences d'ADN
TatNum : gestion des images avec Qt
À votre tour, devenez partenaire de mx-dev.net.
Auteur : Flo
Catégorie : Manipulation de fichiers
Niveau : Intermédiaire
Posté le : 16 Avril 2007 à 21h02
I.Introduction
A.Pré-requis
Pour pouvoir utiliser les ressources, il vous faut une version de Delphi supérieure à un installée sur votre ordinateur ainsi que le compilateur de ressources de Borland, normalement livré avec Delphi que vous trouverez sous le nom de « brcc32.exe » dans le dossier « Bin » de Delphi.
Qu'est ce qu'une ressource ?
Une ressource est un fichier contenant toutes sortes de données issues de fichiers (bitmaps, jpeg, ...) qui seront, au moment de la compilation, directement inclues dans l'exécutable et, par conséquent, accessible à tout moment.
A quoi cela sert-il ?
Utiliser des ressources plutôt que des fichiers « externes » au programmes permet d'éviter les risques dus à la suppression des ces fichiers, mais aussi moins de contraintes pour le programmeur (les ressources sont clairement identifiées).
Par exemple, les programmes d'installation contiennent le programme à installer dans leurs ressources.
Autre exemple: il est possible de créer des librairies « .dll » ne contenant que des ressources, ce que l'on appelle communément un « ressource pack », qui permet de skinner son application.
Créer une ressource
La création d'une ressource passe par deux étapes qui pourront être automatisées par un programme conçu pour réaliser ce genre de taches.
Un fichier ressource, lorsqu'il n'est pas intégré à l'exécutable, se présente sous la forme d'un fichier « .res »
Création d'un fichier « .rc »
Avant d'aller plus loin, commencez par créer un dossier à la racine d'un lecteur (pour plus de commodité). Copiez ensuite tous les fichiers à mettre en ressource dans ce dossier.
Le fichier « .rc » est un fichier contenant toutes les informations sur les fichiers à mettre en ressource. Chaque ligne contient les informations sur un fichier.
Voyons comment se compose une ligne (chaque partie de cette ligne est séparée de la suivante par un espace) :
Un identifiant de ressource: c'est une chaîne de caractères qui permettra d'identifier la ressource une fois incluse dans le programme. Elle ne doit pas contenir d'espaces.
Je vous conseille par ailleurs de n'utiliser que des lettres majuscules (et des chiffres, mais pas d'accents) pour éviter quelques désagréments plus tard.
Il est aussi possible d'utiliser un identifiant numérique (nombre entier positif)
Le type de la ressource: il s'agit du type du fichier contenu. Voir plus bas pour la tableau des types possibles.
Le nom de fichier complet de la ressource. Mettez tout simplement le nom de fichier de la dite-ressource à inclure. Si celui-ci contient des espaces, encadrer le nom de fichier de guillemets. N'oubliez pas l'extension !
Types de ressources
En théorie, il est possible d'utiliser n'importe quelle chaîne sans espace ni accents comme type de ressource, à partir du moment où vous vous en rappelez.
En pratique, il en va autrement. En effet, Windows a prédéfini quelques types pour vous simplifier la tâche. Ces types prédéfinis sont associés à une constante de type PChar déclaré dans Windows.pas
Le tableau suivant récapitule ces constantes prédéfinies:
|
Chaîne à écrire dans le fichier « .rc » |
Constante PChar à utiliser dans Delphi |
|
ACCELERATOR |
RT_ACCELERATOR |
|
ANICURSOR |
RT_ANICURSOR |
|
ANIICON |
RT_ANIICON |
|
BITMAP |
RT_BITMAP |
|
CURSOR |
RT_CURSOR |
|
DIALOG |
RT_DIALOG |
|
DLGINCLUDE |
RT_DLGINCLUDE |
|
FONT |
RT_FONT |
|
FONTDIR |
RT_FONTDIR |
|
GROUP_CURSOR |
RT_GROUP_CURSOR |
|
GROUP_ICON |
RT_GROUP_ICON |
|
HTML |
RT_HTML |
|
ICON |
RT_ICON |
|
MANIFEST |
RT_MANIFEST |
|
MENU |
RT_MENU |
|
MESSAGETABLE |
RT_MESSAGETABLE |
|
PLUGPLAY |
RT_PLUGPLAY |
|
RCDATA |
RT_RCDATA |
|
STRING |
RT_STRING |
|
VERSION |
RT_VERSION |
|
VXD |
RT_VXD |
Compilation du fichier « .rc »
Pour cela, il faut ouvrir le menu « Démarrer > Exécuter » et taper :
brcc32 nom_complet_du_fichier_rc_entouré_de_guillemets_si_besoin
Delphi fournit, dans l'unité « Classes.pas » une classe TRessourceStream, qui permet de charger une ressource depuis un fichier exécutable ou une librairie.
Son constructeur principal prend trois paramètres:
L'instance du module contenant le ressource. Si c'est le module appelant qui le contient, il faut mettre 0 (zéro).
Le nom de la ressource – en réalité, un pointeur PChar sur la chaîne qui le contient.
Le type de la ressource, en PChar aussi. Une des constantes citées ci-dessus peuvent (doivent dans certains cas) être utilisées.
Un deuxième constructeur « CreateFromID » permet de charger une ressource identifiée par un entier Integer. Cette version est bien moins utilisée (car moins pratique) et ne sera pas détaillée.
A.Sauvegarder une ressource sur le disque
Il suffit d'appeler la méthode SaveToFile du TRessourceStream.
var Res: TResourceStream; begin Res := TresourceStream.Create(0, 'FICHIER001', RT_RCDATA); try Res.SaveToFile('MonFichier.txt'); finally Res.Free; end; end;
B.Afficher un bitmap
Le TBitmap possède une méthode « LoadFromResourceName » qui permet de charger une image en une ligne de code. Il est donc possible de l'affecter à un TImage.
Attention, ici, l'image doit être obligatoirement enregistrée dans le fichier « .rc » comme « BITMAP ».
begin {>> On change les propriétés du TImage nommé Image } Image.Proportional := False; {>> On enlčve l'image s'il y en avait une } Image.Picture := nil; {>> On charge la ressource } Image.Picture.Bitmap.LoadFromResourceName(0, 'BITMAP001'); end;
C.Afficher un jpeg
La classe TJpegImage, elle, ne possède pas de procédure permettant de charger directement depuis les ressources. Il va donc falloir créer un TRessourceStream et charger l'image depuis ce flux.
var Res: TResourceStream; Jpeg: TJpegImage; begin {>> Création du flux (ressource nommée IMAGE001 de type JPEG) } Res := TresourceStream.Create(0, 'IMAGE001', 'JPEG'); try Jpeg := TJpegImage.Create; Jpeg.LoadFromStream(Res); { Ici, on force l'image à rentrer dans l'espace qui lui est attribué. Image est un TImage. } Image.Canvas.StretchDraw(Image.Canvas.ClipRect, Jpeg); Jpeg.Free; finally Res.Free; end; end;
D.Lire un fichier mp3
Si on utilise un TMediaPlayer pour lire le fichier mp3, il faudra d'abord sauvegarder le fichier sur le disque dur, puis l'affecter au TMediaPlayer. Il est éventuellement possible de supprimer le fichier mp3 ŕ la fermeture de l'application.
En global:
var CheminMp3: string;
Dans la procédure de chargement:
var Res: TResourceStream; begin {>> Chargement du fichier mp3 en ressource } Res := TresourceStream.Create(0, 'CHANSON001', 'MP3'); try {>> Sauvegarde sur le disque dans le répertoire du programme } CheminMp3 := ExtractFilePath(Application.ExeName) + 'MonMp3.mp3'; Res.SaveToFile(CheminMp3); {>> Affectation au TMediaPlayer (ici nommé MP) } MP.Close; MP.FileName := CheminMp3; {>> Lecture } MP.Open; MP.Play; finally Res.Free; end; end;
Dans le OnDestroy de la fiche principale:
begin if FileExists(CheminMp3) then DeleteFile(CheminMp3); end;
IV.Conclusion
En définitive, l'utilisation des ressources n'est pas bien compliquée, contrairement à l'idée initiale qu'on pourrait avoir.
Les ressources apportent de grandes facilités pour le programmeur, notamment pour le déploiement de son programme et la gestion de ces fichiers. De plus, comme leur élaboration demande réflexion, les programmes les utilisant sont souvent mieux conçus.
A méditer...
V.Remerciements
Je tiens à remercier :
JulioDelphi, pour sa relecture du tutoriel initial, et ses corrections.
Matt 261, pour m'avoir incité à le remanier dans sa version finale.