Propriétés standard dans un ActiveX perso'

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 14 déc. 2009 à 14:59
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 - 21 déc. 2009 à 12:53
Bonjour à tous,

Je suis toujours à l'écriture d'un textbox perso' comme contrôle OCX en m'appuyant à la base sur le contrôle des MSForms.

Ne désirant pas m'appuyer sur l'outil fourni avec VB6 pour le mappage de mes propriétés avec celles en standard, je code toutes celles-ci à la main.

Pour la plupart d'entre elles, que ce soient des propriétés déjà existantes ou non, je n'ai pas de problème, mais j'en ai qui me résistent: AutoSize et BackStyle et même ToolTipText (!).

Je peux comprendre que mon implémentation ne fonctionne pas, mais si j'essaie le mappage avec l'outil VB6, cela ne marche pas non plus.

Si quelqu'un à une idée, cela serait très bien.

Calade

14 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2009 à 23:26
salut,

AutoSize
lors du changement de ta propriété Text (je suppose), à toi de mesurer la taille de la chaine selon la typo (*) et ensuite de faire un usercontrol.width = ..., SI ta propriété autosize est à true
* pour mesurer ta taille, soit tu appliques la font directement à ton usercontrol et la mesure par SES méthodes textwidth et height, soit peux jouer avec cette classe (puisque tu en fais un OCX, ce n'est pas gênant d'avoir plusieurs fichiers)



backstyle
tu fais juste hériter ta propriété de celle du USERCONTROL



ToolTipText
là c'est un peu particulier parce que la propriété est moyennement héritable, faut tricher avec l'extender


tu as de quoi faire tes premiers pas en principe ;)


ps : ne pas confondre usercontrol et OCX, abus de langage...


++

[hr]
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 déc. 2009 à 09:13
Salut PCPT et merci de m'avoir répondu,

J'ai simplement retesté la propriété BackSize selon tes conseils, mais ça ne marche pas. Voici mon code:

Public Property Let BackStyle(ByVal New_Style As fmBackStyle)
   TBox.BackStyle = New_Style:                              PropertyChanged "BackStyle"
End Property

Public Property Get BackStyle() As fmBackStyle
   BackStyle = TBox.BackStyle
End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   BackStyle = PropBag.ReadProperty("BackStyle", fmBackStyleOpaque)
end sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   Call PropBag.WriteProperty("BackStyle", BackStyle, fmBackStyleOpaque)
end sub


Je n'ai bien sur mis que ce qui concernait cette propriété.
TBox est le nom du MSForms.TextBox qui me sert de base.

Petite précision: En mode design et dans mon contrôle text, s'il est opaque, le fond est bien blanc, pas de pb, par contre en mode transparent, il passe bien à la couleur de fond de ma feuille mais le quadrillage n'est pas visible contrairement à ce qui se passe avec le contrôle originel.

Pour l'abus de langage, c'est fort possible, j'ai trouvé dans mes arganes un chapitre du bouquin de Francesco Balena sur la programmation des Contrôles ActiveX et il faut que je m'y replonge.

En tout cas merci de ton aide.

Calade.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2009 à 10:22
mais je croyais que tu ne passais pas par la textbox? elle n'a PAS de backstyle de toute façon
(et FMBACKSTYLE n'existe pas en vb6...)

mets là en invisible pour tester


Public Enum BackStyleConstants
    Transparent = 0
    Opaque = 1
End Enum

Public Property Let BackStyle(ByVal New_Style As BackStyleConstants)
   UserControl.BackStyle = New_Style
   PropertyChanged "BackStyle"
End Property

Public Property Get BackStyle() As BackStyleConstants
   BackStyle = UserControl.BackStyle
End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   UserControl.BackStyle = PropBag.ReadProperty("BackStyle", BackStyleConstants.Opaque)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   Call PropBag.WriteProperty("BackStyle", UserControl.BackStyle, BackStyleConstants.Opaque)
End Sub
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
15 déc. 2009 à 10:48
Non, j'ai dit que je m'appuyais sur la MSForms.TextBox qui possède la propriété BackStyle en standard, c'est d'ailleurs pour ça que je pars de celle-là.

J'ai essayé ton code, mais un peu vite car je pars en réunion, et à priori il ne marche pas du tout, là il est toujours opaque. Mais il faudrait que j'approfondisse.

Simplement, est-il préférable d'utiliser les propriétés de la Textbox (celle des MSForms) ou celles du usercontrol, dans ce cas comment faire quand celui-ci possède plusieurs contrôles de base ?

En tout cas merci de t'occuper de mon cas.


Calade
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2009 à 10:57
puisque FMBACKSTYLE n'existe pas, tu parles peut-être de msforms2 alors?!! fm20.dll

(la nuance est des plus importante)

si oui attention, tu n'as pas le droit de les redistribuer...
http://support.microsoft.com/kb/224305


ps : j'ai bien sûr testé le code que je t'ai indiqué....
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
15 déc. 2009 à 12:34
... en effet tu parlais bel est bien des FORMS2

d'après ton code :

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   'BackStyle = PropBag.ReadProperty("BackStyle", fmBackStyleOpaque)
   TBox.BackStyle = PropBag.ReadProperty("BackStyle", fmBackStyleOpaque)
end sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   'Call PropBag.WriteProperty("BackStyle", BackStyle, fmBackStyleOpaque)
   Call PropBag.WriteProperty("BackStyle", TBox.BackStyle, fmBackStyleOpaque)
end sub


et du coup, pareil pour l'autosize
tu as juste à redimensionner ensuite le usercontrol à la taille de ta TBOX


mais rappel : non redistribuable

++
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
16 déc. 2009 à 08:41
Effectivement, je parle bien de FM20.DLL. D'ailleurs je ne connais pas d'autres MSForms (à moins que tu ne parles des contrôles natifs VB6).

Je sais aussi que je n'ai pas le droit de les redistribuer, dans ce cas cela n'a pas d'importance.

Tu me confirmes que mon code pour BackStyle fonctionne chez toi, ce qui n'est pas le cas chez moi. Je vais donc tester un peu mieux pour voir si je n'ai pas une scorie de code quelconque qui polluerait.

Je te recontacte plus tard quand j'aurais des nouvelles fraîches.

En tout cas merci encore pour tout.


Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 déc. 2009 à 09:24
Bonjour,

je reviens avec mon problème. Pour y voir plus clair, je me suis focalisé uniquement sur la propriété Autosize et j'ai créé un mouveau contrôle servant de test. Ce contrôle contient exclusivement un TextBox des FM20.DLL. J'ai utilisé le wizzard de MS pour les propriétés et j'ai donc mappé les propriétés Autosize, Font et Text. J'ai simplement ajouté la méthode UserControl_Resize et un call à celle-ci lors du changement d'Autosize.

Sur un nouveau projet, j'ai simplement posé ce usercontrol avec un text quelconque et double cliqué sur la propriété Autosize.

2 Constatations: Le redimensionnement ne correspond en rien à celui qui devrait se produire, mais en plus, la font change (uniquement à l'affichage, elle est inchangé dans les propriétés). De plus l'aspect de ce contrôle devient en double creux (comme si il était contenu dans une PictureBox de même dimension (à quelques pixels près tout autour) et elle aussi en creux alors que bien évidemment cette picturebox n'existe pas.

Ci-dessous le code généré par l'assistant à 99%:

'Valeurs de propriétés par défaut:
Const m_def_BackColor = 0
Const m_def_ForeColor = 0
Const m_def_Enabled = 0
Const m_def_BackStyle = 0
Const m_def_BorderStyle = 0
'Variables de propriétés:
Dim m_BackColor As Long
Dim m_ForeColor As Long
Dim m_Enabled As Boolean
Dim m_BackStyle As Integer
Dim m_BorderStyle As Integer
'Déclarations d'événements:
Event Click()
Event DblClick()
Event KeyDown(KeyCode As Integer, Shift As Integer)
Event KeyPress(KeyAscii As Integer)
Event KeyUp(KeyCode As Integer, Shift As Integer)
Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Event MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Event MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)



'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=8,0,0,0
Public Property Get BackColor() As Long
   BackColor = m_BackColor
End Property

Public Property Let BackColor(ByVal New_BackColor As Long)
   m_BackColor = New_BackColor
   PropertyChanged "BackColor"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=8,0,0,0
Public Property Get ForeColor() As Long
   ForeColor = m_ForeColor
End Property

Public Property Let ForeColor(ByVal New_ForeColor As Long)
   m_ForeColor = New_ForeColor
   PropertyChanged "ForeColor"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=0,0,0,0
Public Property Get Enabled() As Boolean
   Enabled = m_Enabled
End Property

Public Property Let Enabled(ByVal New_Enabled As Boolean)
   m_Enabled = New_Enabled
   PropertyChanged "Enabled"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MappingInfo=TextBox1,TextBox1,-1,Font
Public Property Get Font() As Font
   Set Font = TextBox1.Font
End Property

Public Property Set Font(ByVal New_Font As Font)
   Set TextBox1.Font = New_Font
   Set UserControl.Font = New_Font
   PropertyChanged "Font"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=7,0,0,0
Public Property Get BackStyle() As Integer
   BackStyle = m_BackStyle
End Property

Public Property Let BackStyle(ByVal New_BackStyle As Integer)
   m_BackStyle = New_BackStyle
   PropertyChanged "BackStyle"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=7,0,0,0
Public Property Get BorderStyle() As Integer
   BorderStyle = m_BorderStyle
End Property

Public Property Let BorderStyle(ByVal New_BorderStyle As Integer)
   m_BorderStyle = New_BorderStyle
   PropertyChanged "BorderStyle"
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MemberInfo=5
Public Sub Refresh()
    
End Sub

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MappingInfo=TextBox1,TextBox1,-1,AutoSize
Public Property Get AutoSize() As Boolean
   AutoSize = TextBox1.AutoSize
End Property

Public Property Let AutoSize(ByVal New_AutoSize As Boolean)
   TextBox1.AutoSize() = New_AutoSize
   PropertyChanged "AutoSize"
   Call UserControl_Resize
End Property

'ATTENTION! NE SUPPRIMEZ PAS OU NE MODIFIEZ PAS LES LIGNES COMMENTÉES SUIVANTES!
'MappingInfo=TextBox1,TextBox1,-1,Text
Public Property Get Text() As String
   Text = TextBox1.Text
End Property

Public Property Let Text(ByVal New_Text As String)
   TextBox1.Text() = New_Text
   PropertyChanged "Text"
End Property

'Initialiser les propriétés pour le contrôle utilisateur
Private Sub UserControl_InitProperties()
   m_BackColor = m_def_BackColor
   m_ForeColor = m_def_ForeColor
   m_Enabled = m_def_Enabled
   m_BackStyle = m_def_BackStyle
   m_BorderStyle = m_def_BorderStyle
End Sub

'Charger les valeurs des propriétés à partir du stockage
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

   m_BackColor = PropBag.ReadProperty("BackColor", m_def_BackColor)
   m_ForeColor = PropBag.ReadProperty("ForeColor", m_def_ForeColor)
   m_Enabled = PropBag.ReadProperty("Enabled", m_def_Enabled)
   Set Font = PropBag.ReadProperty("Font", Ambient.Font)
   m_BackStyle = PropBag.ReadProperty("BackStyle", m_def_BackStyle)
   m_BorderStyle = PropBag.ReadProperty("BorderStyle", m_def_BorderStyle)
   TextBox1.AutoSize = PropBag.ReadProperty("AutoSize", Faux)
   TextBox1.Text = PropBag.ReadProperty("Text", "")
End Sub

Private Sub UserControl_Resize()
   TextBox1.Top = 0
   TextBox1.Left = 0
   TextBox1.Width = UserControl.Width
   TextBox1.Height = UserControl.Height
End Sub

'Écrire les valeurs des propriétés dans le stockage
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

   Call PropBag.WriteProperty("BackColor", m_BackColor, m_def_BackColor)
   Call PropBag.WriteProperty("ForeColor", m_ForeColor, m_def_ForeColor)
   Call PropBag.WriteProperty("Enabled", m_Enabled, m_def_Enabled)
   Call PropBag.WriteProperty("Font", TextBox1.Font, Ambient.Font)
   Call PropBag.WriteProperty("BackStyle", m_BackStyle, m_def_BackStyle)
   Call PropBag.WriteProperty("BorderStyle", m_BorderStyle, m_def_BorderStyle)
   Call PropBag.WriteProperty("AutoSize", TextBox1.AutoSize, Faux)
   Call PropBag.WriteProperty("Text", TextBox1.Text, "")
End Sub



Désolé pour sa longueur, mais là j'y perds le peu de latin qu'il me reste.

Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 déc. 2009 à 09:55
Encore moi,

2ème essai pour la propriété BackStyle et dans les mêmes conditions que précédemment.

Pour avoir un véritable fond transparent sur mon contrôle, il faut que la backcolor du UserControl, du contrôle qui est posé dessus soit identique.
Problème, j'ai l'habitude d'avoir des feuilles avec 2 couleurs dégradées obtenues par API.

Problème du BackStyle résolu, je viens de découvrir la propriété Windowsless que j'ignorais jusqu'à maintenant.


Calade
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 déc. 2009 à 10:06
Et toujours moi,

Cette magique propriété règle aussi le problème du ToolTipText, mais pas celle de l'AutoSize.

En espérant qu'elle ne m'en générera pas d'autres!!!


Calade
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 déc. 2009 à 12:28
... je n'ai que survolé

changement de font : si tu es en autosize, la box va aussi changer de taille, mais tu n'appelles pas le _resize du usercontrol

changement de texte : pareil

changement autosize : j'ai indiqué de changer la taille du usercontrol, toi tu changes ta taille de la box (qui vient de se caler à sa taille adéquate) pour qu'elle prenne la "mauvaise taille actuelle du usercontrol"

l'assistant sert surtout à ne pas s'embêter à taper des lignes et des lignes, çà n'en fait pas un générateur de ce que tu as en tête ^^

comme les constantes etc...
1. type les
2. (exemple) n'utilise pas un BACKCOLOR noir (0) par défaut
...


pour le backstyle, la textbox dessine dans son fond ce qu'elle a en dessous, c'est à dire ton usercontrol
ce n'est pas "ce que tu voudrais" mais ce n'est pas un bug...
le fond du usercontrol n'étant pas lui-même le fond de son parent, il n'y a pas de transparence réelle
d'où cette impression de picturebox

donc
soit tu "dessines le bon fond" avant (sur le usercontrol)
soit tu joues avec le MASK
soit tu ne te sert du usercontrol (alors invisible) qu'en coordonnées et tu détaches la box pour la rattacher aux coordonnées et parent direct du usercontrol


++
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
17 déc. 2009 à 14:07
Merci de prendre le temps de m'aider:

En ce qui concerne les propriétés BackStyle et ToolTipText, j'ai résolu le problème en passant la propriété Windoless du UserControl à True.

Pour la propriété Autosize, j'avais effectivement oublié le Call UserControl_Resize, mais cela n'a rien changé.

Pour le typage, le code que j'ai posté était celui généré par l'assistant brut de pomme pour des essais sur CETTE propriété seule. Dans le code mon contrôle, tout est typé ne craint rien.

Enfin tu dis:
>>soit tu "dessines le bon fond" avant (sur le >>usercontrol)
>>soit tu joues avec le MASK
>>soit tu ne te sert du usercontrol (alors >>invisible) qu'en coordonnées et tu détaches la >>box pour la rattacher aux coordonnées et parent >>direct du usercontrol

et là j'avoue que je nage un peu. Qu'est-ce que tu veux dire par là ?


Calade
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 déc. 2009 à 17:36
TextBox1.AutoSize = PropBag.ReadProperty("AutoSize", Faux)


tu peux coder en français toi?

ajoute OPTION EXPLICIT aussi, çà servira à remonter les erreurs d'absence de déclaration
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 déc. 2009 à 12:53
Bonjour,

J'avais utilisé le générateur uniquement pour essayer de voir mon erreur. Le fait qu'il "code" en français, vient d'un bug connu du générateur qui se base à tort sur les locales.

Le option Explicit est mis systématiquement en tête de toutes mes pages de code, il a du sauter ici lors du copier-coller.

Ceci dit, j'en suis toujours au même point. La propriété Autosize ne marche pas. Et là, je suis à court d'idées.

En tout cas merci de ton aide.

Calade
0
Rejoignez-nous