Création d'applications skinnées avec FreeMedia (aka MediaPack)

Signaler
Messages postés
11
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
28 août 2003
-
Messages postés
11
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
28 août 2003
-
Salut à tous,

Sur SourceForge.net, il y a une suite de composants Delphi, FreeMedia (http://sourceforge.net/projects/ksfreemedia), gratuite et avec sources (sinon elle ne serait pas sur SourceForge), qui permet de faire des interfaces très complexes sous Delphi grâce à sa multitude de composants (il y a de tout : des boutons, des checkboxes, des edits, des boutons radio, des "tabs" ou onglets en français, des leds, des "sliders" ou "trackbars", etc, etc, etc.). Tous ces composants ont un look personnalisable : classique, look "plat", "plasma", avec dégradés, textures...

Cette suite me paraît donc idéale (de par le nombre de composants inclus et de par sa gratuité) pour créer des applications avec des "skins" (ou "thèmes", "apparences"... appellez ça comme vous le voulez). Car les autres composants ou suites de composants du même type que j'ai testé(e)s sont soit payant(e)s, soit incomplèt(e)s (souvent il n'y a que très peu de composants dans les suites gratuites). En plus, contrairement à d'autres, elle ne présente apparamment aucun défaut graphique comme ce qu'on appelle le "flickering" par exemple.

Cette suite était en fait payante auparavant, connue sous le nom de "MediaPack" et son auteur semble l'avoir complètement délaissée puisqu'il n'en parle plus sur son site (www.ksdev.com) et qu'il ne fournit même pas de documentation ni de tutorial avec. Et il n'a pas répondu à mes mails concernant cette suite.

Car à cause de ce manque cruel de documentation, j'ai un problème qui m'empêche de l'utiliser convenablement. En fait, pour appliquer une texture aux composants que j'utilise, il faut utiliser un composant de la suite, TMpMediaBitmapList, très similaire à TImageList, qui contient les différentes textures utilisées par tous les composants.

Aucun problème pour l'instant : je dépose un TMpMediaBitmapList sur ma fiche, puis un TMpMediaBitmapButton (contrôle similaire à un TButton). Avec l'inspecteur d'objets de Delphi, je charge une texture BMP dans la BitmapList en double-cliquant sur le composant (comme on peut le faire je crois avec un TImageList) j'assigne la BitmapList au bouton avec sa propriété Background.Bitmaps, j'indique au bouton de se servir du premier bitmap de la liste en assignant la valeur 0 à sa propriété Background.BitmapIndex, et enfin j'indique au bouton d'utiliser la texture pour se relooker en affectant la valeur ebsBitmap à sa propriété Background.Style. Et là le bouton est peint avec la texture en mode conception ("design-time").

Mais je voudrais pouvoir faire tout ça en mode exécution ("run-time"), par la programmation. Rien de bien compliqué, sauf pour ajouter un bitmap à la liste. Avec un TImageList ou tout autre objet liste standard il suffit d'appeller la méthode MaListe.Add et d'indiquer un type TBitmap ou autre en paramètre pour que ça fonctionne (exemple on fait Memo1.Lines.Add('Bonjour') pour ajouter la ligne "Bonjour" à un TMemo). Mais le TMpMediaBitmapList, lui, utilise un type Pointer pour sa méthode Add :

function TMpMediaBitmapList.Add(MpMediaBitmapList1.Bitmaps.Add(Item: Pointer): Integer;

Comment faire pour ajouter un bitmap dans ma liste avec un type Pointer ?? Si vous pouviez m'aider ce serait vachement sympa... Merci !

J'ai essayé pas mal de trucs dont des trucs de ce genre (je ne me souviens plus bien) :

Add(Image1);
Add(Addr(Image1));
Add(Pointer(Image1);
Add(Image1.Picture.Bitmap.ClassInfo);

etc etc...

Certaines méthodes ont permis au programme de se compiler, d'autres non, lorsque le programme arrive à se lancer, il arrive apparamment à ajouter une image à la liste, puisque la valeur de MpMediaBitmapList1.Bitmaps.Count s'incrémente de 1, mais à ce moment là lorsque je ferme la fenêtre du programme, une erreur de type Violation d'Accès se produit (le message est variable ; ce n'est jamais la même erreur je crois)

Comment feriez-vous pour ajouter correctement une image à la liste sans provoquer d'erreurs ? L'un de vous a t-il déjà testé et travaillé avec cette suite de composants ? Je n'ai jamais trop travaillé sur les pointeurs car j'ai du mal à comprendre l'intérêt de les utiliser à la place d'autre chose, d'où ma difficulté à résoudre ce problème...

J'espère que vous parviendrez à m'aider... essayez autant que possible de tester vos éventuels exemples de code avec la suite de composants, car d'après ce que j'ai compris, travailler avec des pointeurs peut avoir de gros impacts sur la stabilité du système s'ils sont mal utilisés, vu qu'ils permettraient l'accès direct à la mémoire de l'ordinateur...

Désolé pour mon message si long, j'espère que sa lecture ne vous a pas endormi(e)s :big) ... Et si vous connaissez une autre suite de composants gratuite (au moins pour une utilisation personnelle dans des programmes gratuits), facile à utiliser, qui permet de faire des applications "skinnées" et qui prend en charge la plupart des composants de type standard (boutons, boutons radio, comboboxes, checkboxes, edits, tabcontrols etc.), n'hésitez pas à m'en parler.

Merci encore et à bientôt !
Amicalement,
Maxime
http://www.arachnosoft.com

6 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Es-tu sûr de la signature de la méthode indiquée dans ton message ?
function TMpMediaBitmapList.Add(MpMediaBitmapList1.Bitmaps.Add(Item: Pointer): Integer;

Tu dis ne pas vouloir utiliser de pointeurs dans tes programmes. Je te comprends, c'est une source d'ennuis potentielle, les programmeurs C ne me contrediront pas, eux qui n'ont guère le choix.
Delphi comme Java utilisent des références. Borland a mis tout en oeuvre avec Delphi pour que nous n'ayons pas l'impression d'utiliser des pointeurs. J'ai bien dit "pas l'impression"... :big)

Alors, donne nous la signature exacte et nous pourrons surement plus facilement t'aider.

Sinon, as-tu essayé cette suite disponible sur Torry.net : skinform.zip ?
May Delphi be with you
Messages postés
11
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
28 août 2003
1
Salut Delphiprog,

Oui je suis absolument sûr de cette "signature" comme tu dis. On me demande bien un type Pointer et la fonction semble retourner un type Integer...

Tu peux le constater avec cette capture de l'EDI...

Essaye la suite et tu verras par toi-même... à moins qu'il y ait autre chose que je n'ai pas trouvé... en tout cas en regardant dans les sources je n'arrive pas à trouver la fonction Add :question) :question)

Quant à la suite SkinForm oui je l'ai déjà essayée (à vrai dire j'ai peut-être déjà tout essayé...)

Merci encore pour votre aide...
Maxime
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Si tu ne trouves pas la méthode Add dans les sources c'est surement qu'elle est tout simplement héritée !

Quand au code que tu avais copié la première fois, regarde le bien encore et dis moi si tu le trouves "normal"...

La méthode Add de composant attend un paramètre de type Pointer (pointeur non typé) et retourne un integer, correspondant surement à l'indice de l'élément ajouté à la liste (c'est habituellement le cas).

May Delphi be with you
Messages postés
11
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
28 août 2003
1
Re,
Parmi les codes que je t'ai donnés la première fois ils permettent bien de compiler le programme puisque c'est un pointeur non typé, mais ça me fait une violation d'accès lorsque je quitte le prog ! En plus ça n'a pas l'air de skinner les composants... même si mon bitmap semble être ajouté à la liste...
Mais pourquoi n'essayes tu pas par toi même la suite de composants ? Comme ça tu pourrais faire quelques expérimentations...
Merci encore pour ta patience
Maxime
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
"Parmi les codes que je t'ai donnés la première fois ils permettent bien de compiler le programme puisque c'est un pointeur non typé, mais ça me fait une violation d'accès lorsque je quitte le prog !" :

ALors tu dois explicitement détruire chaque objet pointé par la liste avant sa destruction.

Ok pout installer la suite de composants. Je verrai mieux ce qui pose problème.
May Delphi be with you
Messages postés
11
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
28 août 2003
1
Oui je pense effectivement que c parce que je n'appelle pas la méthode Free pour détruire les objets avant fermeture de l'appli, le pb c'est que je ne sais pas quoi détruire ! Si je code par exemple MpMediaBitmapList.Bitmaps.Add(Image1), faut que je fasse Image1.Free ?
Si tu peux faire des essais avec la suite ce serait cool. Toi tu arriveras certainement à en tirer quelque chose...
Maxime