COMPOSANT TTHRESCOLLECTION

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 6 nov. 2009 à 15:32
amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009 - 6 mars 2012 à 08:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50801-composant-tthrescollection

amiga68 Messages postés 54 Date d'inscription dimanche 23 février 2003 Statut Membre Dernière intervention 21 décembre 2009
6 mars 2012 à 08:02
Superbe !!!!
TThResCollection décuple les possibilités de Delphi !

Je l'utilise pour mettre au point un logiciel, mais je bloque sur un point.
Je génère des pdf grâce à LibHaru, qui permet d'inclure des images dans un pdf grâce à

HPDF_LoadRawImageFromMem()

HPDF_Image HPDF_LoadRawImageFromMem (HPDF_Doc pdf, const HPDF_BYTE *buf, HPDF_UINT width,
HPDF_UINT height,
HPDF_ColorSpace color_space,
HPDF_UINT bits_per_component);

Parameters

buf - The pointer to the image data.

c'est là mon problème : ce pointeur vers les données images est un HPDF_BYTE (pointeur sur un BYTE) et je ne sais pas s'il est possible grâce à TThResCollection d'obtenir un tel pointeur...

Autrement, je serais obligé d'enregistrer un fichier image à partir des images de la collection et de les recharger ensuite... pas très élégant ?

Merci !
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
11 nov. 2009 à 13:46
Merci Jean_Jean.
Je suis également heureux de voir que cette source te sera utile.
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
11 nov. 2009 à 13:03
Excuse moi ThWilliam!
C'est l'inconvénient des amateurs occupés par ailleurs. Ils découpent leur temps comme les processeurs multitâches sauf qu'ils n'ont pas leur mémoire infaillible.
C'est donc OK, ton code répond bien aux promesses que j'avais entrevu en regardant justement ton pdf très clair.
Donc je suis un Delphiste heureux.
Bravo!
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
11 nov. 2009 à 11:25
Salut Jean_Jean,

Je te le répète : mon code n'a rien avoir avec les fichiers ressources de Delphi.
Donc, tu oublies toutes les fonctions ou types qui les manipulent (TResourceStream, LoadFromResourceName...).

Pour ajouter dans TThResCollection un Jpeg (en partant d'un fichier Jpeg):
with ResCol.AddRes('SKINVISTA') do
SetResStream(RES_JPEG, 'mon fichier.jpg');

Pour afficher l'image jpeg:

var
ResRet: integer;
Jpg: TJpegImage;
begin
ResRet := ResCol.FindRes('SKINVISTA');
if (ResRet > -1) and (ResCol[ResRet].ResType = RES_JPEG) then
begin
Jpg:= TJpegImage.Create;
try
Jpg.LoadFromStream(ResCol[ResRet].ResStream);
ImgVignetteSkin.Picture.Assign(jpg);
finally
Jpg.Free;
end;
end;
end;

N'oublie pas de lire le fichier pdf joint dans le zip.

A +
Thierry
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
11 nov. 2009 à 10:38
Bj ThWilliam,
1. OK, ça marche pour les Bitmap.
2. Est-ce que tu prévois d'intégrer les images jpg ou png?
Non, je ne suis pas déçu, même si je pense que ça n'est pas encore l'appli parfaite que je recherche. J'apprends toujours des codes déposés. D'ailleurs, je note rarement les codes pour cette raison! ou alors qu'une bonne note!
Je pense qu'il ne faudrait pas grand chose pour intégrer un type jpeg dans le composant. On gagne souvent 50% en taille mémoire.
J'ai essayé en code externe avec le code ci-dessous, mais ça plante car il ne reconnait pas le format!
procedure TFormOptions.FormShow(Sender: TObject);
var ResRet : integer;
jpg : TjpegImage;
Res : TResourceStream;
begin
ResRet := ResCol.FindRes('SKINVISTA');
if ResRet > -1 then
begin
jpg := TJPEGimage.Create;
Res := TResourceStream.Create(hinstance, 'SKINVISTA', RT_RCDATA);
Jpg.LoadFromStream(Res);
ImgVignetteSkin.Picture.Bitmap.Assign(jpg);
Res.Free;
jpg.Free;
end;
end;
Je passe par un stream, mais je n'ai pas encore trouvé!
Si tu as la solution simple?!
3. Est-ce valable à ton avis d'intégrer ces fichiers ressources dans des Dll avec appel dynamique pour économiser de la mémoire. En effet, j'ai certaines fiches dans mon projet qui donnent la main à l'utilisateur avec la possibilité de choisir de nombreuses images. Ces opérations ne sont pas courantes au regard de l'utilisation du logiciel.

Merci pour ce code et tes réponses.
A+
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
10 nov. 2009 à 19:25
Salut Jean_Jean,

Ton erreur de compilation provient de "{$R EdcImg.res}".
Cette directive est réservée aux fichiers ressources qui ont été compilés avec l'utilitaire brcc32.exe. La directive permet d'inclure ces ressources dans la compilation du programme lui-même.
Le fichier que tu as créé avec ResCollectionEditor est un fichier que tu dois ouvrir lors du démarrage de ton application (ou quand tu en as besoin). En parlant de conteneur de "ressources", j'ai mis des guillemets pour que l'on ne fasse pas la confusion avec des ressources compilées.

var
ResCol: TThResCollection;
ResColFileName: string;

procedure TFormPrincipale.FormCreate(Sender: TObject);
begin
ResCol:= TThResCollection.Create;
ResColFileName:= ExtractFilePath(Application.ExeName) + 'EdcImg.res';
if FileExists(ResColFileName) then
ResCol.LoadFromFile(ResColFileName);
end;

procedure TFormPrincipale.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ResCol.Free;
end;

Ton code dans TFormOptions est bon, sauf :
if (ResRet >= 0)... : la première ressource a l'indice zéro

Voilà, j'espère que tu n'es pas trop déçu...
Ce composant ne remplace pas un fichier ressources normal (à ce sujet, pour éviter les confusions, je te propose de ne pas mettre l'extension .res à ton fichier).
Son gros intérêt est de pouvoir stocker des "ressources" en mode exécution : dans ton cas, tu pourrais p.ex. permettre à l'utilisateur de changer le bitmap 'SKINVISTA'...

Merci à toi

A +
Thierry
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
10 nov. 2009 à 12:18
Bj ThWilliam
Je tente une intégration d'appels à des ressources images dans un projet sous D7.
1. J'ai donc créé 1 Fichier ResImg.res avec ton programme. Pas de Problème. j'ai intégré le nom de 4 vignettes images de type jpg.
2. J'ai ensuite fait les déclarations suivantes :
implementation
{$R *.dfm}
{$R EdcImg.res}
uses FP,UThResCol;
Var
ResCol : TThResCollection;
...
J'obtiens une erreur de compilation : RLink32: Unsupported 16 bit ressource in file "D\...EdcImg.res

Qu'en penses-tu?

Je voulais tester le code suivant Dans la procédure Show de la Form, en particulier savoir si je peux utiliser le format jpg :

procedure TFormOptions.FormShow(Sender: TObject);
var ResRet : integer;
begin
ResRet := ResCol.FindRes('SKINVISTA');
if (ResRet > 0) and (ResCol[ResRet].HasBitmap) then
ImgVignetteSkin.Picture.Bitmap.Assign(ResCol[ResRet].ResBitmap);
end;

Peux-tu m'éclairer?
Merci
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
9 nov. 2009 à 20:55
Bj ThWilliam

Voilà un code que j'attendais depuis longtemps, mon worshop n'étant plus à jour, je n'avais rien trouvé de satisfaisant sur la toile pour le remplacer.
J'essaye ton appli dans un de mes projets et si ça marche, grand merci, j'te mets 10.

Merci
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 nov. 2009 à 15:54
ah,
c'est certainement un problème de version de compilateur ...
j'ai compilé avec D2009 !!
j'essaye avec un autre ...
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
6 nov. 2009 à 15:47
Salut Cirec,
Bizarre, je viens de télécharger le zip pour tester et j'ouvre "test.r" sans aucun problème !
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
6 nov. 2009 à 15:32
Salut,

le fichier Test.r est il du bon format ?
---------------------------
Rescollectioneditor
---------------------------
Le fichier "Test.r" n'est pas un fichier ressources correct.
---------------------------
OK
---------------------------
Rejoignez-nous