Suite à une question lors d'une session de codage d'un composant d'affichage de boite de dialogue "à propos" pour des projets VCL et FireMonkey en Delphi on m'a demandé comment faire pour embarquer le texte de la licence sous forme de fichier directement dans le programme.
Nous avons donc regardé comment déclarer un fichier texte comme resource dans les options du projet, puis comment accéder au contenu de ce fichier à l'aide de la classe TResourceStream fournie.
C'est globalement assez simple à mettre en place et c'est valable pour toutes les plateformes ciblées par Delphi car l'environnement adapte la façon dont les fichiers sont déployés et comment les récupérer.
--
La première étape consiste à ajouter le fichier qu'on veut joindre directement au projet. Dans les versions récentes de Delphi ça peut se faire depuis l'IDE dans l'option Projet / Ressources et images. Dans d'anciennes version il faudra le faire à la main dans un fichier .rc ou .res avec un logiciel d'édition de ressources.
Ajoutez ensuite votre fichier (que ce soit du texte ou n'importe quoi d'autre) en RCDATA et donnez lui un nom ou laissez celui par défaut (pas top pour la maintenance).

Lorsque vous voudrez accéder à cette ressources dans votre programme il faut donc passer par un flux de type TResourceStream. L'identifiant que vous avez indiqué dans la boite de dialogue doit correspondre à celui utilisé lor de l'ouverture du flux sinon vous aurez une exception EResNotNotFound.
Dans mon exemple de fichier texte vous devez lire le flux et le transférer dans un autre de type TStringStream. Et là il vous suffit de traiter la chaîne de caractères résultante.
procedure TForm1.Button1Click(Sender: TObject);
var
rs: TResourceStream;
st: tstringstream;
begin
rs := TResourceStream.Create(MainInstance, 'Resource_1', RT_RCDATA);
try
rs.Position := 0;
st := tstringstream.Create;
try
st.CopyFrom(rs);
st.Position := 0;
Memo1.Lines.Text := st.ReadString(st.Size);
finally
st.Free;
end;
finally
rs.Free;
end;
end;Bien entendu si l'utilisation se fait depuis des composants ou classes possédant une méthode LoadFromStream ne vous en privez pas pour utiliser directement le TResourceStream dessus.
procedure TForm1.Button2Click(Sender: TObject);
var
rs: TResourceStream;
begin
rs := TResourceStream.Create(MainInstance, 'Resource_1', RT_RCDATA);
try
Memo1.Lines.LoadFromStream(rs);
finally
rs.Free;
end;
end;Si vous faites ça dans un projet FireMonkey, Delphi adaptera le fonctionnement à la plateforme : les ressources ne seront pas embarquées dans l'exécutable comme sous Windows mais dans un dossier spécifique du paquet d'installation selon les cas ou sous forme de fichier envoyé avec le binaire (par exemple sous Linux).


