BOUTON GRAPHIQUE PARAMÈTRABLE

cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 - 26 nov. 2009 à 10:28
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 - 7 déc. 2009 à 15:23
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/50899-bouton-graphique-parametrable

Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
7 déc. 2009 à 15:23
je viens d'implementer la propriété de transparence du composant.
j'ai également mis a jour le screen du topic.
(je ne me souviens pas de ce qu'avaient dit les admin a propos du cash mais en tout cas, depuis mon PC, je vois toujours l'image comme avant la mise à jour)
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
1 déc. 2009 à 21:32
merci Renfield, voici la fuite mémoire corrigée.
j'ai également ajouté un .Bat qui permet d'enregistrer le .ocx (nécéssaire si ont développe depuis un dossier qui dont l'adresse change)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2009 à 16:24
pas toujours. et pas sous tous les windows
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
1 déc. 2009 à 16:15
ne suffit-il pas de killer le tread pour résoudre le problème ?
il me semblait que de fermer l'IDE VB suffisait a tout faire rentrer dans l'ordre ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2009 à 15:06
pas vraiment dangereux... tout dépend de la fréquence du refresh : de la vitesse à laquelle tu creuse le trou ^^

un reboot et tout reva bien, mais galère tout de même
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
1 déc. 2009 à 15:01
bonjour,
merci renfield ^^ tu l'auras compris je suis dur de l'ecran ^^
dans le tuto (pourtant bien fait) "eDay Device Context" il ne me semble pas qu'ils parlent du releaseDC ce qui explique son absence dans mon code.
Enfin, maintenant que j'ai consulté la MSDN concernant cette fonction et que j'ai bien compris sont utilisation, je vais pouvoir corriger.

Je met le zip a jour ce soir.
Je vais essayer de voir l'utilisation de la fonction AlphaBlend qui peut je pense apporter un côté bulle de savon (transparence).

Si vous avez regardé le fonctionnement du bouton, je me base sur un squelle constitué de 4 points placés grace aux Bordure_Largeur & Bordure_Hauteur. Je vais essayer de co^mplexifier cela en rendant le nombre de point éditable. Il va donc également falloir addapter la mise en place des couleurs / dégradés...

Une fuite mémoire c'est :
Lorsque les API de DC allouent de la mémoire, l'OS dit attention, cette zone est utilisée pour tel programme / thread. Une autre application ne peut plus utiliser cette zone mémoire tant que l'application ne l'a pas "libérée". Hors, dans mon ocx, il y a le GetDC(0) qui alloue un petit peut de mémoire; étant donné que je ne libère pas, on peut considérer que la mémoire est perdue... En soit, en premier abord on ne le voit pas . Ca doit être de l'ordre de quelques octets. ^^ Sur une ram de 2-4Go ^^
Enfin rassure toi Patrice_B, cela n'est vraiment pas dangereux pour le PC, c'est juste que ce n'est carrément pas propre et que je souhaite faire un OCX au moins sans bugs ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 nov. 2009 à 08:48
Croissance constante de la mémoire utilisée par le programme.

en effet, on alloue de la mémoire que l'on ne libère pas.

si on laisse tourner longtemps, des ralentissement surviennent (pagination) et certains bugs graphiques apparraissent çà et là (icone manquantes, menus noirs, etc.
cs_patrice_b Messages postés 30 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 1 mars 2009
30 nov. 2009 à 08:00
Pouvez-vous expliquer ce qu'est cette "fuite mémoire". Comment ce traduit-elle ? Merci
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 nov. 2009 à 17:45
je te l'ai dit : GetDC te donne un DC qu'il faut liberer.
utilises ReleaseDC
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
28 nov. 2009 à 12:05
arf tjs cette fuite mémoire ,(
elle ne proviens pasdu FOnt c sur.

'###########################################################################################
' Créer un bitmap pour buffuriser
'###########################################################################################
'Création d'un bitmap pour tracer le dégrader dessus
Dim vDCDegrader As Long
vDCDegrader = CreateCompatibleDC(GetDC(0))
Dim vBMPDegrader As Long
vBMPDegrader = CreateCompatibleBitmap(GetDC(0), UserControl.ScaleWidth, UserControl.ScaleHeight)
Dim holdBMP As Long
holdBMP = SelectObject(vDCDegrader, vBMPDegrader)
'###########################################################################################

[...]

'###########################################################################################
' Détruire le bitmap + DC
'###########################################################################################
Call SelectObject(vDCDegrader, holdBMP)
Call DeleteObject(vBMPDegrader)
Call DeleteDC(vDCDegrader) '###########################################################################################

si quelqu'un voit d'où ca vient ;(
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
28 nov. 2009 à 11:22
merci patrice ^^
ceci dit, leurs critiques étaient justifiées au moment où avaient été faites.

en effet renfield il y a une fuite mémoire, je vais corriger tout de suite.
cs_patrice_b Messages postés 30 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 1 mars 2009
28 nov. 2009 à 08:44
Je comprends mal toutes ces critiques. L'effet est réussi. Le programme est
très sophistiqué.

Sans aucun doute exploitable pour des applications personnelles. Les boutons
sont beaucoup plus actuels que ceux proposés par vb6.

Je note 10/10 pour ce travail
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 nov. 2009 à 23:29
GetDC(0) sans ReleaseDC, donc fuite.

Call SelectObject(vDCDegrader, vBMPDegrader)
[...]
Call SelectObject(vDCDegrader, vBMPDegrader)

restaure plutot l'ancien BMP ^^
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
27 nov. 2009 à 23:20
boulot pour demain,
ajouter une picture , taill/placement/allignement,
je ne sais pas encore comment mais je verrais.

autre chose à vérifier : pas de fuite mémoire ? crash test du timer à faire.

Enfin, avec la mise a jour, le composant devrait dors et déjà être exploitable.
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
27 nov. 2009 à 21:54
oui ^^ j'ai bien remplacé le "a" par un "e" ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 nov. 2009 à 21:08
plutot pas mal...

gaffe "Ambiant.Font)"
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
27 nov. 2009 à 18:11
bon je m'attaque en passant a la propriété Font,
j'aurais besoin de votre confirmation que je ne fait pas n'importequoi ^^

Private WithEvents p_Font As StdFont
[...]
Private Sub UserControl_Initialize()
Set p_Font = New StdFont
End Sub
[...]
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("Font", p_Font, Ambient.Font)
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Set p_Font = PropBag.ReadProperty("Font", Ambiant.Font)
End Sub
[...]
Public Property Get Font() As Font
Set Font = p_Font
End Property

Public Property Set Font(ByVal New_Font As Font)
Set p_Font = New_Font
PropertyChanged "Font"
Call Tracer
End Property

Private Sub p_Font_FontChanged(ByVal PropertyName As String)
Call Tracer
PropertyChanged "Font"
End Sub

amicalement,
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
27 nov. 2009 à 17:56
re,
la journée a été très chargée, c'est pourquoi je n'ai pu travailler sur l'Ocx.
je m'y met dès a présent. Je rajoute le nom des propriétés dans le PropertyChanged "nom"
et j'implémente le Texte.

je met a jour une fois tout ceci fait.

"(bravo les mots clés "gratuit free" sur un site opensource)"
^^ en effet cela devrait aller de soit. mais comme je le dit dans le préambule de ce code, si tu tapes OCX bouton gratuit sur google, tu vas tomber sur des composants dont le téléchargement est gratuit mais dont l'utilisation est payante. (sauf si g du caca dans les yeux ;| )
J'ai donc mis ces mots clés VOLONTAIREMENT pour leur faire de la concurrence directe sur les moteur de recherche.

^^ a tord ou a raison, telle était mon intention ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 nov. 2009 à 16:44
simple exemple dans mon tutoriel de controle basique.
la propriété Font.

on peut modifier la Font via la petite boite de dialogue.
ca fera par exemple:
Font.Italic = True

se faisant, on ne passe pas par le Let Font, mais on a moyen de chopper un Evenement _Changed pour la Font.
du coup, dans cet evenement, on peut faire un
PropertyChanged("Font")

qui permettra de sauvegarder ce nouvel attribut.

c'est déconcertant, pas forcémenet logique ; dit toi que c'est 'comme ça'

et que même si le ReadProperty et WriteProperty, surtout sont là, rien n'y sera placé sans que tu aies prévenu que telle ou telle valeur changeait.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 15:02
... tu as mis juste propertychanged, où est le nom des propriétés concernées?
as-tu bien lu le lien et les commentaires????

(bravo les mots clés "gratuit free" sur un site opensource)
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 14:58
voila, j'ai ajouté un "PropertyChange" a la fin de tout property Let,
(mais de vous a moi je ne vois aucune différence ^^)
j'ai comme de bien entendu mis a jour le code ci dessu et le Zip
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 13:30
tu as les explications de "comment çà marche", applique pour voir!

la lecture est automatique, mais çà lit quoi? le propbag
si tu (dev usercontrol) ne dis pas au propbag qu'une valeur est à sauver, il n'a pas de raison de le faire

de même que si par exemple le changement d'une propriété (par LET donc) doit jouer sur le graphisme (ex : une couleur ou le caption par la suite), si tu (dev uc) n'appelles pas la méthode TRACER, il ne le fera pas non plus

une propriété c'est ni plu ni moins qu'une variable public avec évènement
tu pourrais très bien faire une propriété sur une form

dans ton évènement de modification d'une propriété (donc le dev qui change quelque chose dans ton uc), tu acceptes ou non, tu redessines ou non, et tu sauves (ou non) pour que la nouvelle valeur soit appliquée au prochain affichage

il est temps de passer à la pratique ;)
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 13:12
quand tu auras implémenté le CAPTION
sur la form, sélection de ton contrôle
caption -> "test"
actuellement si tu fermes le projet et le réouvre, caption sera vide
fait le avec un commandbutton ???
il faut bien que les propriétés en mode design soient conservées, d'où le propbag, d'où le propertychanged

Mais c la que je ne comprends plus ^^ n'est ce pas le rôle de "ReadProperty" et "WriteProperty"
Que ce soit avec le caption ou avec les diférentes couleur ou même les Brodure_Hauteur / Bordure_Largeur.
On peut les modifier dans la fenêtre de propriété. Puis fermer le projet (apres avoir enregistrer les modifications) puis le reouvrir. La valeur n'a t elle pas été conservée ???

Il me semble que oui.

Deplus, dans le code du Usercontrol, dans la liste déroulante des fonction/evenements disponibles je n'ai pas PropertyChange...

Vous seriez en train de me dire que le UserControl_writeProperty() ne se lance pas automatiquement ? mais qu'il faudrait le forcer a chaque foid qu'on a une property Let ?
Il me semblait pourtant que le propertyWrite était lancé automatiquement à un enregistrement ou a une fermeture de la fenetre d'édition de la Form.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 12:27
malheureusement il n'y a plus d'aide MSDN VB6 directe
il te reste ton aide locale, que tu peux d'ailleurs télécharger ici :
http://vb.developpez.com/msdnvb6/

le lien était pour montrer un exemple simple et complet :

get
let
PropertyChanged ""
.ReadProperties
.WriteProperty

l'erreur dont ils parlent, peu importe
j'aurais du préciser, désolé
donc lire uniquement le code dans "Plus d'informations"

LET (côté dev, pas de ton côté) va déclencher le PropertyChanged NOM_PROPRIéTé
et c'est çà qui va enregistrer, en mode design, la valeur dans le propertybag

imagine le justement comme une sorte de fichier ini (donc pas à faire pour le dev)
ensuite le readproperty (lors du prochain lancement) va donc lire cette valeur modifiée
on a bien alors des propriétés conservées

le propbag est lu tant en mode design (edition) qu'en mode execution

ensuite quand l'EXE est compilé, ce "fichier imaginaire" (propbag) est compilé avec le projet, donc non modifiable. je ne faisais pas référence à l'utilisateur, la question n'est bien sûr pas là.
(dans ce cas oui, totalement d'accord avec toi, au DEV (qui va utiliser ton contrôle) de faire le nécessaire)

c'est plus clair?

autre manière toute simple que tu vas rencontrer et que tu peux tester simplement :

quand tu auras implémenté le CAPTION
sur la form, sélection de ton contrôle
caption -> "test"
actuellement si tu fermes le projet et le réouvre, caption sera vide
fait le avec un commandbutton ???
il faut bien que les propriétés en mode design soient conservées, d'où le propbag, d'où le propertychanged

++
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 12:26
il manque juste des PropertyChanged "NomProp" dans tous mes property Let ?
Hum, je vais essayer
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 nov. 2009 à 12:12
je tente d'expliquer la chose a mon tour.

Public Property Get Caption As String
Caption = msCaption
End Property
Public Property Let Caption ( Byref Value as string)
msCpation = Value
PropertyChanged "Caption"
End Property

indiquant le PropertyChanged, j'indique que la donnée "Caption" de mon propbag est a stocker...
du coup, je retrouve bien ma valeur de Caption entre design/runtime
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 12:00
merci de ta ténacité a tanter de m'expliquer pour le propbag ^^
cependant, je ne comprends tjs pas .

dans l'addresse : http://support.microsoft.com/kb/192090/fr
ils disent que l'erreur c'est quand tu l'ance l'executable et que tu as les propriétés par défaut du control et non pas celle qui ont été définies dans le proje, avant compilation.
dans l'exe que je fourni, les composant on bel et bien le bon aspec, je me trompe quelque part ?

a, peut être veux tu dire qu'il n'y a pas de sauvegarde d'une modif de skin (oups d'apparence ^^) entre deux lancement du programme ? ceci fait par l'intermediaire d'un fichier/ propbag ...
Non, en effet, si tu souhaite adapter l'apparence, pour des utilisateurs diférents et avec un même éxécutable, il faudra faire une fonction ayant pour but de sauver / ecrire la tête dans un fichier lié à l'executable. (genre un tit .ini)
Une nouvelle fois, quand je dit skinnable, je me place du côté programmeur, pas utilisateur.
Une fois le .exe compilé, il n'est plus possible, sans avoir implémenté de fonction, de permetre à l'utilisateur de modifier l'ap^parence de ses boutons.

peut-être que je me raproche de ta remarque la ? ^^
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 11:38
winamp est skinnable (pourtant une même forme)
plusieurs formes c'est ... pouvant prendre plusieurs formes :)

"J'ecrit et Lit bel et bien dans un property bag dans les evenements ReadProperty et WriteProperty ce qui permet de définir les propriétés en mode graphique dans l'IDE VB"
ok, alors consulte aussi l'aide, le propbag n'est pas lié qu'à l'IDE !! heureusement

"boucle "For Each""
boucle ou pas, çà fait du code pour le dev! tu as déjà vu çà dans un usercontrol graphique?
non !!!!
http://support.microsoft.com/kb/192090/fr
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 11:25
"mais qu'il n'est pas skinable, non."
ok : est-ce que je peux faire une image sous paint, différente selon l'état de survol enfoncé relaché, et appliquer cette image à ton contrôle?
va-t'il l'accepter avec ou sans ton gradient et se découper selon la forme de mon choix?
non, donc pas skinnable

d'accord, on ne doit juste pas être d'accord sur le sens du mot skinable ^^
pour moi skinnable sinifie que on peut donner des "formes" / apparence et couleurs différentes a partir d'un meme control.
c'est ici bien le cas non ? pour preuve dans mon exemple il y a plusieurs control Bouton et ils ont des têtes différentes.

"il y a pourtant les property let et Get"
oui, et? revoir le fonctionnement!
si l'utilisateur est obligé de le faire par code depuis sa form, c'est justement parce que tu ne valides pas ce PROPERTYCHANGED
autrement dit, tu as beau lire le propbag, il est et restera toujours vide
(nb : et imagine s'il veut poser 80 instances de ton bouton? tu le forces à taper combien de lignes...)
J'ecrit et Lit bel et bien dans un property bag dans les evenements ReadProperty et WriteProperty ce qui permet de définir les propriétés en mode graphique dans l'IDE VB
pour preuve, tu ne verra dans le code de Form1, aucune ligne concernant la tête des composants. Apres si tu veux changer la tête de maniere dynamique, oui, il faut le faire par ligne. Mais en admetant que tu as un certain nombre de control, je pense que tu dois connaitre la boucle "For Each"
sinon, je ne comprends vraiment pas, dsl ^^

En ce qui concerne le Caption, je m'y atelle dors et déjà.

"
c'est moche en 2009 :(
"
une autre piste de travail/tracé a donner ???

en tous les cas, merci de vos critiques, elle me permettent de réfléchir et de progrésser.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 11:11
"mais qu'il n'est pas skinable, non."
ok : est-ce que je peux faire une image sous paint, différente selon l'état de survol enfoncé relaché, et appliquer cette image à ton contrôle?
va-t'il l'accepter avec ou sans ton gradient et se découper selon la forme de mon choix?
non, donc pas skinnable

"plusieurs fichiers..."
oui c'est parfois bien de séparer des éléments, mais pas 6 fichiers pour même pas 700 lignes
à la limite mets toutes tes api types enums dans 1 (seul) module et çà sera suffisamment aéré

"il y a pourtant les property let et Get"
oui, et? revoir le fonctionnement!
si l'utilisateur est obligé de le faire par code depuis sa form, c'est justement parce que tu ne valides pas ce PROPERTYCHANGED
autrement dit, tu as beau lire le propbag, il est et restera toujours vide
(nb : et imagine s'il veut poser 80 instances de ton bouton? tu le forces à taper combien de lignes...)

"En ce qui concerne le caption..."
un bouton doit au grand minimum avoir un caption et une font. sans çà il n'est pas utile!
après tu peux ajouter des options (couleur font, alignement, etc), mais il faut un minimum qui ici n'est pas présent
il faut évidemment pouvoir le désactiver (???), et savoir que l'utilisateur a clické dessus! sinon il ne sert vraiment à rien, c'est juste une shape...

inspire-toi des nombreuses sources à ta dispo
Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
26 nov. 2009 à 10:53
Que l'on dise qu'il est moche je veux volontier l'entendre,
mais qu'il n'est pas skinable, non.

il y a plusieurs fichiers pour la simple raison que je n'aime pas les sources ou tout est dans le même fichier. cela est dur a lire / maintenir.
En sachant que une fois compilé les fichiers ne sont pas visibles par l'utilisateur.

"
et revoir le fonctionnement d'un usercontrol :
s'il n'y a pas de propertychanged, il n'est pas "configurable" !
"

il y a pourtant les property let et Get ??? qu'entendez vous par property Change ???

Dans le form, Propriétés du control, on modifie :
Bordure_Largeur
Bordure_Hauteur
Les différentes couleurs.

En ce qui concerne le caption ... merci de lire la conclusion.

je reste a votre ecoute, si il y a des choses a apprendre je m'enpresserais de le faire.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 nov. 2009 à 10:46
idem, de plus l'étiquette ne correspond pas au produit : rien de "skinnable", un simple dégradé extrêmement couteux, ne laissant même pas la possibilité de mettre un caption

c'est pourtant pas les sources qui manquent

et revoir le fonctionnement d'un OCX :
toutes tes classes et modules n'ont pas besoin d'être ailleurs que dans le usercontrol ici
en tout cas pas à X fichiers

et revoir le fonctionnement d'un usercontrol :
s'il n'y a pas de propertychanged, il n'est pas "configurable" !

bon courage, ce projet est loin d'être... commencé
(c'est à se demander si tu l'as seulement testé)
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
26 nov. 2009 à 10:28
c'est moche en 2009 :(
Rejoignez-nous