CONTROLE .NET : BOUTONS MULTI-PARAMETRABLES POUR VOS APPLICATIONS

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 - 25 juin 2004 à 21:50
cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 - 15 nov. 2004 à 12:34
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/23990-controle-net-boutons-multi-parametrables-pour-vos-applications

cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
15 nov. 2004 à 12:34
J'arrive tard dans la discussion, mais si ça peut servir à quelqu'un :
Concernant la valeur par défaut de la propriété Image, une petite modif.,ci dessous, de ton code qui semble fonctionner sans passer par Reset.

' Permet de choisir l'image affichée sur le bouton
Private Value_Image() As Image = {Nothing, Nothing, Nothing}
<Description("Détermine l'image affichée sur le bouton"), Category("Remplissage"), _
DefaultValueAttribute(GetType(Image), Nothing)> _
Public Property Image1() As Image
Get
Return Value_Image(0)
End Get
Set(ByVal Value As Image)
Value_Image(0) = Value
If IsNothing(Value_Image(0)) False Then ImageWidth1 Value_Image(0).Width
If IsNothing(Value_Image(0)) False Then ImageHeight1 Value_Image(0).Height
If Value_Mode = BMode.Normal Then
If SetGeneral = False Then
SetSpecific = True
Image = Value
SetSpecific = False
End If
SetButton(Me.CreateGraphics, 0)
End If
End Set
End Property

Private Function ShouldSerializeImage1() As Boolean
Return Not (Value_Image(0) Is Nothing)
End Function



La fonction ShouldSerialize peut aussi être intéressante pour que Vs ne produise pas de code inutilement,à ce sujet voir l'aide de VS :

Méthodes ShouldSerialize et Reset [Visual Basic]
(Guide du développeur .NET Framework)

ShouldSerialize et Reset sont des méthodes facultatives que vous pouvez fournir pour une propriété, si cette dernière ne possède pas de valeur par défaut simple. Si la propriété possède une valeur par défaut simple, vous devez appliquer DefaultValueAttribute et fournir plutôt la valeur par défaut au constructeur de classe d'attributs. Ces deux mécanismes activent les fonctionnalités suivantes dans le concepteur :
• La propriété indique visuellement, dans la fenêtre de propriétés, si sa valeur par défaut a été modifiée.
• L'utilisateur peut cliquer avec le bouton droit sur la propriété et choisir Reset pour restaurer sa valeur par défaut.
• Le concepteur génère un code plus efficace.
Remarque : Appliquez DefaultValueAttribute ou fournissez les méthodes ResetNomPropriété et ShouldSerializeNomPropriété. N'utilisez pas les deux procédures.
La méthode ResetNomPropriété affecte à une propriété sa valeur par défaut, comme illustré dans le fragment de code suivant.

Public Sub ResetMyFont()
MyFont = Nothing
End Sub

Remarque Si une propriété ne dispose pas de méthode Reset, si elle n'est pas marquée avec DefaultValueAttribute et si elle ne possède pas de valeur par défaut fournie dans sa déclaration, son option Réinitialiser est désactivée dans le menu contextuel de la fenêtre Propriétés du concepteur Windows Forms de Microsoft Visual Studio .NET.

Les concepteurs tels que Visual Studio .NET utilisent la méthode ShouldSerializeNomPropriété pour vérifier si une propriété ne possède plus sa valeur par défaut et écrivent du code dans le formulaire uniquement si une propriété a été modifiée, ce qui permet une génération de code plus efficace. Exemple :

'Returns true if the font has changed; otherwise, returns false.
' The designer writes code to the form only if true is returned.
Public Function ShouldSerializeMyFont() As Boolean
Return Not (thefont Is Nothing)
End Function

Vous trouverez ci-dessous un exemple de code complet:

Option Explicit
Option Strict

Imports System
Imports System.Windows.Forms
Imports System.Drawing

Public Class MyControl
Inherits Control

' Declare an instance of the Font class
' and set its default value to Nothing.
Private thefont As Font = Nothing

' The MyFont property.
Public Property MyFont() As Font
' Note that the Font property never
' returns null.
Get
If Not (thefont Is Nothing) Then
Return thefont
End If
If Not (Parent Is Nothing) Then
Return Parent.Font
End If
Return Control.DefaultFont
End Get
Set
thefont = value
End Set
End Property

Public Function ShouldSerializeMyFont() As Boolean
Return Not (thefont Is Nothing)
End Function

Public Sub ResetMyFont()
MyFont = Nothing
End Sub
End Class

Dans ce cas, même si la valeur de la variable privée à laquelle la propriété MyFont accède a une référence Null (Nothing dans Visual Basic), la fenêtre de propriétés n'affiche pas null (Nothing). En effet, elle affiche la propriété Font du parent (Si la référence n'est pas Null (Nothing)) ou la valeur Font par défaut définie dans Control. Par conséquent, la valeur par défaut de MyFont ne peut pas être simplement définie et aucun DefaultValueAttribute ne peut être appliqué à cette propriété. En effet, les méthodes ShouldSerialize et Reset doivent plutôt être implémentées pour la propriété MyFont.
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
23 août 2004 à 19:04
Bonjour,

Alors la je vois pas. Je n'ai pas eu ce type de problème. As-tu essayé mes autres source (le label par ex), ils utilisent aussi une propriété font.

Tu sais me dire où exactement le message apparaît ? je veux dire il montre une ligne de code erronée ou c'est un message système ?

Tu peux tjs m'envoyer une saisie d'écran à tigerfab@teledisnet.be de VStudio quand il plante, car comme ca je sais pas t'en dire plus.

Tu peux en profiter pour m'envoyer les images de ton prg si ca te dit. Malheureusement comme j'ai dit dans ma toute première source, le temps me manque, je fais plus ces codes ci pour m'amuser, bien que parfois je les fignole pour l'utiliser dans mes propre programmes professionels (développements dans la boîte où je travaille, ...) donc te dire si j'aurai du temps pour t'aider, je ne crois pas, je voudrai pas te dire ok, passe moi ton code je vais y ajouter ma sauce et ne rien faire dessus pendant 3 mois ... et puis je suis pas un pro du .net non plus :-) j'apprends encore ce prg ... (ADO.NET, ASP.NET .... y a des tas trucs que je sais tjs pas ...)
ratel3 Messages postés 2 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 22 août 2004
22 août 2004 à 20:45
Bonjour TigerFab.

Avec la Dll, je peux mettre un de tes boutons , mais j'obtiens toujours un message d'erreur à la compilation:
"La propriété Font est ReadOnly; Me.VF_Button1.Font = CType(resources.GetObject("VF_Button1.Font"), System.Drawing.Font)

et si je l'enlève, je plante mon script à la compilation suivante.

Au delà de ce pb de boutons, j'ai écris un programme de musique en vb.net et je cherche un pro de la programmation pour le fignoler.

C'est un prg entre Itunes et media player - en fait comme une base de données sur une discothèque, sauf que le prg fait tout ( il faut quand même encoder les cd ou 33T et numériser les pochettes ... et avoir un gros disque dur ce qui n'est plus un pb aujourd'hui) + affichage des paroles + nombreuses autres fonctions non trouvées sur media player, musicmatch ou Itunes ou realplayer (exemple : remplacer tous les morceaux du hd contenant par exemple liberte par liberté AUTOMATIQUEMENT).
Plus d'infos sur demande par email à r.didier@wanadoo.fr ( copies d'écran par ex)
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
22 août 2004 à 12:19
Salut ratel3,

Si j'ai bien compris, il te manque la laison à ma dll dans ton projet.

Pour cela ouvre ton projet puis va dans la "boîtes à outils", choisis par ex l'onglet "Mes contrôles utilisateurs", puis avec le bouton droit, choisis "Ajouter/Supprimer des éléments"
Une boîte de dialogue s'ouvre, dans l'onglet "Composants .NET Framework", choisis "Parcourir" et recherche mon fichier "VF_Button.dll"

Voilà maintenant tu peux ajouter ce type de boutons.

Moi ce que j'ai fait, j'ai créé un dossier "C:\Contrôles .NET" et j'y mets tous les librairies dll que j'utilise.
Ainsi j'ai toujours accès de n'importe quel projet à mes librairies, car le dossier dll ne change pas.
En effet, .NET sauve le dossier où se trouve la dll, donc si tu ouvres mon projet d'un autre dossier où je l'ai créé, il peut arriver qu'il ne trouve plus la dll, il perd la référence. Cela se voit d'ailleurs par un triangle jaune à côté de la dll dans la fenêtre "Explorateur de solutions" du projet, clique sur "Références" pour l'ouvrir et pour chaque référence (dll) tu as son chemin associé dans les "Propriétés".
En mettant toutes les dlls toujours dans le même dossier, plus de problèmes.

Voilà, j'espère que c'était bien la réponse à ta question.
A+
ratel3 Messages postés 2 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 22 août 2004
21 août 2004 à 16:07
Bonjour à tous.
Je suis semi débutant ; je n'arrive pas à utiliser ces boutons 3 états dans mon form .

Je peux passer du form VF_button à mon form dans ma solution, - mais je ne vois pas le bouton dans la barre d'outils.
Et le copier coller d'un bouton exemple sur mon form ne marche pas non plus.

Comment faire pour importer ces boutons dans ma solution ? D'avance, merci pour la réponse !
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
19 août 2004 à 12:23
Euh rebonjour tout le monde,

Personellement, je reviendrai pas dans la discussion. J'ai fait un contrôle, prenez-le, servez-vous en, modifiez le, faites en tout ce que vous voulez, moi je l'ai mis pour vous faire gagner du temps : j'ai étendu la classe bouton pour que vous puissez avoir un contrôle suffisemment paramétrable pour créer dans vos applications des boutons avec look.

C'est sûr que, comme tout code, y a moyen de rajouter encore plein de trucs, moi il me suffit pour mes besoins comme il est, donc il restera ainsi.

Merci à d1rtyw0rm pour tous les éloges, mais je n'ai rien fait d'extraordinaire que lire mon bouquin, lire d'autres sources d'ici et tester à mon tour...

Allez bonne prog à tous

A+
SimonKari Messages postés 80 Date d'inscription dimanche 29 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
19 août 2004 à 07:55
Je vois pas la rapport avec ce que "moi" j'ai dis ici ? Donc j'aimerais bien savoir qui ce "tous" bernés, regroupent ???

C'est pas très clair, et ca vient relativement tard dans la discussion ! Là je me dis que vous auriez tout aussi bien pu faire une longue et pénible recherche sur le net pour trouver une solution aussi basique ! Tous les mondes sait pourquoi on hérite d'un contrôle existant ! Tous le monde connait les avantages de l'héritage ! Je vois pas du tout où vous voyez une nouveauté dans votre facon de faire ???

Mais je veux bien qu'on m'explique !
d1rtyw0rm Messages postés 14 Date d'inscription mercredi 11 juin 2003 Statut Membre Dernière intervention 19 août 2004
19 août 2004 à 07:08
Ce code à été très bien monté, et à tous ceux qui disent que ce controle manque d'événements (d'états appelé ca comme vous voulez) veuillez noter que le concepteur à TRÈS BIEN FAIT SONT TRAVAIL en fesant hérité sont controle de la classe

System.Windows.Forms.Button

de manière à ce que sont contrôle hérite de tous les événements que le bouton possède. Mais comment faire pour utilisé l'événement Mouse_Move alors ?

AVEC LES HANDLES !!!!!!

Private Sub VF_Button11_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles VF_Button11.MouseMove

MsgBox("x")

End Sub


Prenez en de la graine les jeunes.

Ce code aurais bien mérité un 8 vu sa simplicité seulement juste a voir les réactions des gens qui ne savent pas comment utilisé les handles d'événement lorsqu'un controle hérite d'une classe je vais mettre une note parfaite au concepteur pour vous avoir tous berné !!!!

;P

-d1rtyw0rm
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
27 juin 2004 à 12:56
Je ne suis pas un gros malin, je ne savais pas qu'une procédure pouvait être exécutée SEULE par "l'interface" de VS sans appel ailleurs dans le code.

Y a bcp de procédures qui fonctionnent ainsi ? Où puis-je trouver de la doc la desssus ?

C'était inutile de t'énerver en plus.
SimonKari Messages postés 80 Date d'inscription dimanche 29 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
27 juin 2004 à 12:03
Quelle connerie tu me sort là ! Tu ferais bien d'essayer les conseils qu'on te donne avant de juger ! Parce justement mon grand, si tu utilise la sub que je te dis le système la considère comme tu dis "en natif" !!! GROS MALIN !
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
26 juin 2004 à 10:56
Oui c'est vrai, je voulais surtout développer le côté look. Il resterait maintenant à lui donner plus de gestion d'évènements. Mais pour mes propres applications j'avais juste besoin de mes 3 états : normal, survol, cliqué. Je me suis donc arrêté là. Vu le nombre de sources que je mets à disposition :-( vous avez compris que le temps me manque pour finaliser pleinement ces contrôles. Par contre le jour où je les améliore je ferai évidemment l'update ici.

-> SimonKari : En effet, mais ca oblige à passer par le code pour l'enlever. Or en natif, VS gère l'effacement de l'image de la propriété BackGround uniquement via l'explorateur de propriétés. C'est la que je comprends pas pq pour la définition d'autres propriétés images personalisées, cela ne marche pas. A mon avis il faut passer par des déclarations dans le code (UITypeEditor, ...) mais je ne sais pas comment.
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
26 juin 2004 à 10:10
comme l'autre commentaire sur l'autre source... c'est tres bien, mais comme l'a dit dragon, ca serait bien plus d'état sur les boutons...
SimonKari Messages postés 80 Date d'inscription dimanche 29 décembre 2002 Statut Membre Dernière intervention 1 octobre 2004
26 juin 2004 à 07:25
Tu peux faire une Sub intitulée "ResetMaPropriété" et mettre dans cette dernière la position de reset de l'objet incriminé. Tel que

Pour la propriété BackGround

Public Sub ResetBackGround
imgback = nothing
End Sub
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
25 juin 2004 à 21:50
faudrais plus d'états sur tes boutons
normal, survol de la sourie, appuyé, cliquer, enabled, ....

pour le reste, rien a redire, magnifique
Rejoignez-nous