Recherche
1 connecté

  Actuellement : 0 commentaire Les ressources sous Delphi

Introduction aux ressources sous Delphi

 

1. Table des matières

  1. Table des matières
  2. Introduction
  3. Utilisation
  3.1. Edition du fichier ressource
  3.2. Compilation du fichier ressource
  3.3. Inclure le fichier ressource dans le projet
  3.4. Les tables de chaînes de caractères
  3.5. Les bitmaps
  3.6. Les vidéos
  3.7. Les sons
  3.8. Les icônes
  3.9. Les fichiers (tous types)
  3.10. Les curseurs
  3.11. Les fichiers HTML
  3.12. Trucs, astuces et outils: les ressources en pratique
  4. Conclusion
  5. Remerciements
  6. Contacts/Auteur
 

2. Introduction


L'utilisation des ressources est un moyen de stocker des données de tous types dans le code même de l'exécutable.
Ces ressources pourront être des images, des sons, des textes, des fichiers entiers ou encore des icones, des curseurs, des composants...
Bref toutes les ressources que vous pouvez imaginer peuvent s'inclure dans un exécutable et ainsi ne pas nécessiter de fichiers externes pour leur utilisation.
Le procecssus à suivre pour l'inclusion se fait en plusieurs parties décrites en détails dans les sections suivantes mais dont voici déjà un schéma simplifié:

Table des matières
 

3. Utilisation


Table des matières
 
 

3.1. Edition du fichier ressource


L'édition du fichier de définition des ressources est très simple: il s'agit en fait d'un simple fichier texte dont l'extension est changée en .rc .
Pour la plupart des cas, le format des lignes à l'intérieur du fichier .rc est le suivant:

référence TYPE_RESSOURCE Nom du fichier

La référence est l'identificateur de la ressource pour les programmes appelant.
Le type de ressource peut être un type prédéfini comme BITMAP, AVIFILE ou encore RCDATA ou bien un type défini par l'utiliateur et que le programme pourra charger dans un stream par exemple.
A ma connaissance, seuls les tableaux de chaînes de caractères ne suivent pas ce format, ne nous en préoccupons pas pour le moment, ils seront expliqués plus loin dans ce document.
Des commentaires peuvent être ajoutés grâce aux double slashes : //
Notons aussi qu'un fichier ressource peut contenir différents types de données dans le même fichier, pas besoin d'en créer un pour les images, un pour les sons, ... 1 seul suffit.
Néanmoins, il est parfois plus clair pour la maintenance du programme de ne pas tout mélanger...A vous de voir!

Table des matières
 

3.2. Compilation du fichier ressource


Une fois votre fichier .rc créé, il vous faut le compiler
Pour ce faire, Borland met à votre disposition son compilateur de ressources: BRCC32.exe .
Vous le trouverez dans le répertoire Bin de Delphi, exemple pour delphi6:
C:\Program Files\Borland\Delphi6\Bin\brcc32.exe

La ligne de commande est très simple, il vous suffit de donner en paramètre le nom de fichier à compiler.
Ca donne donc: brcc32 MonFichier.rc
Pour être un peu plus complet dans mes explications, j'ajoute que d'autres compilateurs existent et que brcc32 accèpte d'autres paramètres en ligne de commande.
Ces informations n'entrent pas dans le cadre d'une introduction, elles pourront vous être utiles plus tard si vous voulez utiliser les ressources dans un contexte plus évolué.

Table des matières
 

3.3. Inclure le fichier ressource dans le projet


Toujours aussi simple, pour pouvoir utiliser les ressources contenues dans un fichier, vous devez signaler au programme les fichiers à inclure.
Pour ce faire, il suffit d'ajouter dans votre unité, juste après implementation une ligne du type:

{$R MonFichierRessource.res}

Pouvait-on faire plus simple?
Notez qu'à cet endroit, il y a déjà un référence à tous les .dfm, il ne faut surtout pas la remplacer, on peut faire autant de références que l'on veut, à condition que les fichiers référencés existent.

Table des matières
 

3.4. Les tables de chaînes de caractères


Une utilisation bien pratique des ressources est le stockage de chaînes de caractères.
Une application directe est la distribution de logiciels multilingues.
Dans ce cas, les chaînes utilisées dans le programme sont stocées dans les ressources en plusieurs langues.

La structure d'un fichier de ressources contenant des chaînes est la suivante:

  • Le fichier commence par le mot-clé STRINGTABLE
  • Ensuite, on indique le début du fichier par le mot-clé BEGIN
  • Viennent alors les défintions des dictionnaires de chaînes qui suivent le format suivant:
    Id, "Chaîne"

    Id est un nombre entier désignant l'index de la chaîne et "Chaîne" est la chaîne associée, encadrée de guillemets.

  • Le fichier se termine par le mot-clé END.

Après compilation et référencement dans le code source, l'appel à une ressource de type chaîne se fait pat la fonction LoadStr(ident:integer):string;
Ident est le numéro d'index de la chaîne désirée.

Une application multilingue se fait alors aisément en utilisant par exemple les code de langues donn&eacutes par windows.
En voici un exemple:

Langues.rc (Complet) Unit1.pas (portion de code)

STRINGTABLE
BEGIN
9001, "Hello!"
12001, "Salut!"
16001, "Ciao!"
END



//Les 3 langues supportées par le programme
const FRANCAIS = $0C;
      ANGLAIS  = $09;
      ITALIEN  = $10;

function CodeLangue:integer;
//Renvoie la langue utilisée par l'utilisateur
//Si la langue n'est pas supportée par le programme,
//  on utilise le français par défaut
begin
case GetUserDefaultLangID of
  ANGLAIS  : result:=ANGLAIS;
  ITALIEN  : result:=ITALIEN
  else result:=FRANCAIS;
  end;
end;

function ExtraireChaine(n:Word):string;
//Trouve la chaîne n de la langue courante
begin
result:=LoadStr(CodeLangue*1000+n);
end;

Remarque: si la valeur Ident n'a pas de correspondance dans le fichier ressource, la valeur renvoyée par LoadStr est une chaîne de longueur nulle, aucune erreur n'est générée.

Table des matières
 

3.5. Les bitmaps


Tout aussi facile: l'inclusion de bitmaps: la structure de la déclaration dans le fichier .rc est du type:

Référence BITMAP Nom_de_fichier.bmp

Exemple:

MonBitmap BITMAP MonFichierBitmap.bmp

Après compilation et inclusion dans l'unité du projet, le chargement dans un composant TImage par exemple, se fait comme suit:

Image1.Picture.Bitmap.Handle:=LoadBitmap(HInstance, PChar('MonBitmap'));

ET C'EST TOUT!!

Table des matières
 

3.6. Les vidéos


Le format de la déclaration dans le fichier .rc est dans ce cas:

Identificateur AVI Nom_de_fichier.avi

Pour essayer, vous pouvez par exemple copier le fichier cool.avi qui est fourni avec delphi dans les fichiers de la démo Coolstuf.
Créez un fichier videos.rc par exemple et placez-y la ligne suivante:

test AVI cool.avi

Compilez-le et copiez videos.res dans le répértoire d'une nouvelle application.
Dans votre application, placez un composant TAnimate et ajoutez le code {$R videos.res} après implementation.
Placez un bouton et dans son événement onClick, placez le code suivant:

animate1.ResName:='test'; //Pour charger la vidéo
animate1.Active:=True; //Pour démarrer la vidéo

Et voilà, la vidéo est chargée et lisible.
Note: J'ai ici utilisé le composant TAnimate mais rien n'oblige à utiliser celui-là, je l'ai pris comme exemple car il est fourni avec la distribution standard de Delphi.

Table des matières
 

3.7. Les sons


Le format de la déclaration dans le fichier .rc est le suivant:

Identificateur WAVE Nom_de_fichier.wav

L'utilisation de la ressource à partir du programme se fait par la fonction PlaySound de l'unité mmsystem (rajouter mmsystem dans la clause uses de l'unité).

Exemple:
Si le fichier ressource se compose de la ligne: MonSon WAVE MonSon.wav, l'appel dans le programme se fera comme suit:

PlaySound(PChar('MonSon'), HInstance, SND_ASYNC or SND_RESOURCE);

Remarque: J'ai ici utilisé le flag SND_ASYNC, ce qui veut dire que la fonction lance le son et revient directement au programme (elle n'attend pas la fin de la lecture).
D'autres modes existent mais ce n'est pas le sujet de ce tutoriel.

Table des matières
 

3.8. Les icônes


Le format de la déclaration dans le fichier .rc est le suivant:

Identificateur ICON Nom_Du_Fichier.ico

Pour une icône déclarée dans le .rc comme ceci: MonIcone ICON MonIcone.ico, l'appel de l'icône à partir du programme se fait comme ceci:

Form1.Icon.Handle:=LoadIcon(Hinstance, PChar('MonIcone'));

Table des matières
 

3.9. Les fichiers (tous types)


Le format de la déclaration dans le fichier .rc est le suivant:

Identificateur RCDATA Nom_Du_Fichier

Le fichier peut être de n'importe quel type.
Pour récupérer le fichier lors de l'exécution, on utilise un code semblable à celui-ci:

Extraction de la ressource portant l'identificateur 'test'

procedure TForm1.Button1Click(Sender: TObject);
var resstream:TResourceStream;
    dest:TFileStream;
begin
if opendialog1.Execute then
  begin
  resstream:=TResourceStream.Create(hinstance, 'test', RT_RCDATA);
  try
    dest:=TFileStream.Create(opendialog1.FileName, fmCreate);
    try
      dest.Position:=0;
      dest.CopyFrom(resstream, resstream.Size);
    finally
      dest.Free;
    end
  finally
    resstream.Free;
  end;
  end;
end;
Table des matières
 

3.10. Les curseurs


Le format de la déclaration dans le fichier .rc est le suivant:

Identificateur CURSOR Nom_Du_Fichier.cur

Pour appeler à la ressource à partir du programme on utilise le code suivant:

Screen.Cursors[1]:=LoadCursor(HInstance, PChar('MonCurseur'));
Cursor:=1;

Table des matières
 

3.11. Les fichiers HTML


Un peu plus compliqué que les autres types de données.
La définition est différente des autres types:

Identificateur RT_HTML DISCARDABLE NomDeFichier.html

L'appel se fait comme suit:

Chargement d'un fichier HTML (index) contenu dans les ressources

procedure TForm1.ChargerRessourceHTML(NomRessource:string);
var
  Adresse: string;
  NomModule: array[0..255] of Char;
begin
  GetModuleFileName(hInstance, NomModule, SizeOf(NomModule));
  Adresse:='res://' + StrPas(NomModule) + '/RT_HTML/'+NomRessource;
  WebBrowser1.Navigate(Adresse);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ChargerRessourceHTML('INDEX');
end;

Vous remarquez donc que pour faire référence à une ressource HTML dans une adresse, il suffit de composer l'adresse comme suit:

res://CHEMIN/NOM_FICHIER_EXE.EXE/RT_HTML/NOM_DE_LA_RESSOURCE

Vous pouvez d'ailleurs essayer avec votrte browser web habituel et vous verrez que vous pouvez lire les ressources HTML à partir de celui-ci.
Sans rentrer dans les détails, j'ajoute que vous pouvez aussi inclure les images que comporte votre fichier HTML.
Un exemple rapide, si vous avez les références suivantes dans votre .rc:
Index HTML index.html
MonImage GIF MonImage.gif

Les références à MonImage.gif seront légèrement changées:
<img src="/GIF/MonImage">

Table des matières
 

3.12. Trucs, astuces et outils: les ressources en pratique


Pour se faciliter la tâche, on peut éviter les fenêtres dos pour la compilation en créant un fichier .bat qui sera appelé pour la compilation des .rc.

Aussi, pour plus de facilités, j'ajoute quelques clefs dans la base de registres:

  • Un raccourci pour pouvoir avoir dans le shell Nouveau>Fichier Ressource
  • Associées aux fichiers .rc les commandes 'Editer avec Notepad' et 'Compiler'

Dans Delphi, je rajoute dans le menu Outils la commande BRCC32, qui me permet de pouvoir éditer et compiler mes fichiers .rc à partir de léditeur Delphi.


Tous ces ajouts seront bientôt rassemblés dans un petit programme de configuration que je distrtibuerai librement et avec les sources sur ce site.
En attendant, patientez ou essayer par vous-même de vous construire un environnement plus agréable

A noter aussi dans les outils qui concernent les ressources: Ressource Explorer fourni par Borland dans les exemples de Delphi.
Celui-ci permet comme son nom l'indique de parcourir les ressources contenues dans les exécutables.

De nombreux logiciels permettent aussi de modifier les ressources dans vos exe sans en avoir les sources. Je n'approfondis pas ce domaine car on franchit alors la limite de la légalité concernant les règles de propriété intellectuelle.

Table des matières
 

4. Conclusion


Vous aurez bien vite compris en lisant ce tutoriel que les ressources offrent des possibilités très intéressantes pour nous, développeurs d'applications.
On retiendra surtout les avantages suivants:

  • Risque d'erreur de fichier non trouvé réduit à néant
  • Ressources mieux cachées des hackers que pour l'utilisation de fichiers
  • Possibilité de mieux organiser ses ressources
  • Avantages pour la création d'applications multilingues

Comme inconvénients, on notera:

  • La taille de l'exécutable est agrandie
  • La marche à suivre pour modifier une ressource dans un projet (maintenance) peut devenir fastidieuse

Notons que tous les aspects des ressources n'ont pas été couverts par cette introduction.
Nous n'avons pas parlé de la possibilité d'inclure des ressources dans une .dll, par exemple.
On peut aussi directement utiliser la commande 'Ajouter au projet' et choisir le fichier .rc pour ne plus devoir se préoccuper de la compilation des ressources dans un projet Delphi.
Cette possibilité n'a en effet pas été exploré car j'ai déjà eu de mauvaises surprises en utilisant cette méthode.

Laissons donc ce tutoriel ouvert à des ajouts futurs en le considérant comme base de départ.

Table des matières
 

5. Remerciements


Je me permets de remercier tout d'abord Michel pour tout le temps qu'il consacre à son site et ses visiteurs.

Merci aux internautes qui fréquentent et donnent vie au site de Michel

Je remercie égalment les auteurs des freewares que j'ai utilisés pour ce tutoriel, à savoir:

  • Lore's Source Converter, créateurs de LSC, un convertisseur de code (Delphi, C++ et Java) vers du HTML, excellent lui aussi
Table des matières
 

6. Contacts/Auteur


Actuellement développeur pour Electronic Design, je programme des applications PC et microprocesseurs pour les domaines de la parlophonie, téléphonie, domotique et systèmes d'appels.
Pour tout contact, vous pouvez m'envoyer un mail, je suis également sur icq sous l'UIN 30687888.


Marchioni Valérian, le 24 mai 2002.
Version du document: 1.1
Dernière modification le 10 juillet 2002
Les exemples utilisés et l'article lui-même sont libres d'utilisation, de publication et de redistribution sans accord préalable nécessaire de l'auteur.

Table des matières