Je suis a la recherche d'une solution pour générer le nom de mes checkbox sélectionnés dans une liste box visible a coté en direct.
Photo ci dessous : pour la démonstration j'ai cliqué sur ma checkbox nommé 1A j'aurais voulu que son nom apparaisse dans la listbox et si possible d'y rajouter un complément de phrase.
Merci de votre aide, un jeune padawan qui a envie d'apprendre mais bloque un peu tout seul malgrés toutes les aides dispo sur le web.
Bonsoir.
Vous associez deux mots qui n'ont à priori pas de rapport.
Un handle est un identifiant vers une zone de mémoire allouée généralement dynamiquement par Windows à la demande d'un programme. Mais difficile de savoir si c'est réellement juste un indice ou carrément une adresse vers quelque chose. Bonjour les soucis pour ceux qui passent en 64bits.
Les Property, en VBA sont des sortes de procédure au même titre que les Sub et les Function. Le mot est suivi de Get, Let ou Set pour préciser comment on veut qu'elle fonctionne. La Get fonctionne exactement comme une Function. La seule différence est qu'on a le droit d'écrire aussi une Property Let ou Set portant le même nom. La Property Let peut se voir affecter une expression spécifiée derrière un signe '='. Elle est muni pour cela d'un faux dernier paramètre formel indiquant la valeur à affecter. La Property Set, c'est pareil sauf qu'elle s'invoque par un Set devant, et garantit que ce ne sera pas une propriété par défaut de l'objet affecté qui sera considérée, mais bien l'objet lui même.
Point A ) Ma question était posé par rapport au logiciel AUTOCAD :
Il y a pour un Objet de Propriété pour un Objet.
Exemple pour dessiné une polyligne sur un dessin DAO 2D avec Autocad
Une fois cette multiligne dessiné sur l'espace de dessin Autocad
Cette objet à 2 identifiants dit Unique (avec le choix dans ces propriétés.
Soit : l'objet c'est la polyligne object.Handle
An object ID and a unique handle are the two ways of referencing an object. A handle is persistent (stays the same) in a drawing for the lifetime of the object.
Ou object.ObjectID
An object ID and a unique handle are both ways of referencing an object.
In general, use a handle unless you plan to work with certain ObjectARX functions that require an object ID.
Je connais pas la différence ?
Point B )
votre exemple que vous avez joint WithEvents en liens avecEvent
2 Modules de Classes : CkxCollect et SupportCkx
c'est astucieux cette méthode dans votre classe SupportCkx :
Private Parent As CkxCollect
Public Sub Init(ByVal It As CkxCollect, ByVal Ctl As MSForms.CheckBox, ByVal Caption As String)
Set Parent = It Depuis la classeSupportCkx vous recupérer toute la classe CkxCollect (Avec Parent)
C'est vraiment bien pensé
Je ne maîtrise pas encore vraiment (Tous combiné et refaire votre code sans exemple, même avec exemple c'est dur !
Point C )
Ce qui me ramène au point C
J'ai donc fait l'exercice de corrigé le code de cette personne qui est la suite d'une partie du code qu'il à assemblé en se servant de l'aide du Forum.
Je pense que j'ai bricolé par rapport à vous, mais j'aimerais savoir mes erreurs pour les comprendre si vous acceptez de regarder et corrigé :
Le résultat a obtenir et dans l'Userform
dans la procedure : Private Sub ToggleButton7_Click()
La correction :
VB:
' Boucle sur les resultats pour test
Dim i As Integer
Dim Tresultat() As Variant
Tresultat = CkxCln.TAcadCircleRes
For i = LBound(Tresultat, 1) To UBound(Tresultat, 1)
If Tresultat(i, 6) <> Empty Then
Debug.Print "Centre x : " & Tresultat(i, 3) & " Centre x : " & Tresultat(i, 4) & " Code : " & Tresultat(i, 5)
CC(0) = Tresultat(i, 3): CC(1) = Tresultat(i, 4)
End If
Next i
J'ai créer une variable tableau dans le module de classe ! CkxCollect (Module de Classe)
Private TabCircle() As Variant
Mais je voulais en créer une collection comme avez fait pour initialisé l'userform CkxCln.Add "1A", 21.961525, 259.807625
L'dée etait de créer une collection dans la classe CkxCollect (Module de Classe)
Comme vous avez fait pour initialisé l'userform
soit récupérer les positions
Centre X et Centre Y pour 1 A CkxCln.CentreXYString, Double, Double ' String = 1A / Double = -120 / Double = -207.8461
Mais je n'ai pas su ajouter une nouvelle collection !
Je suis passé par une variable Tableau
C'est possible d'ajouter une Nouvelle collection pour c'est nouvelle valeurs !
Comme votre exemple ?
VB:
Public Sub [COLOR=rgb(184, 49, 47)][B]Add[/B][/COLOR](ByVal Nom As String, x As Double, ByVal Y As Double)
Dim SocleCkx As SupportCkx
Dim Ctl As MSForms.Control
Set SocleCkx = New SupportCkx
Set Ctl = Cts.Add("Forms.CheckBox.1")
SocleCkx.Init Me, Ctl, Nom
Cln.Add SocleCkx, Nom
Ctl.Left = x: Ctl.Top = Y
End Sub
Je ne suis pas arrivé a créer une nouvelle collection !
Public Sub CentreXY(ByVal Nom As String, x As Double, ByVal Y As Double)
Je suis bloqué lorsque je suis dans une classe pour récupérer l'intégralité d'une autre comme je vous ai expliqué en point B
je vous remercie @Dranreb j'ai beaucoup appris avec votre aide et j'applique vos conseilles, c'est une autres partie que je doit encore apprendre si vous acceptez de me corrigé sur ses nouvelles méthodes que je suis entrains d'apprendre
Je ne peux guère répondre pour Autocad, n'ayant pas ce logiciel ni donc la bibale pour l'utiliser en VBA.
J'utilise le préfixe Ckx exclusivement pour les CheckBox ! (Parce que CBx est déjà pris pour les ComboBox). Je ne comprends pas ce que vous vous expliquez par 'récupérer l'intégralité d'une autre classe'. Vous savez, une variable objet c'est juste un pointeur vers son exemplaire, rien d'autre. J'en ai seulement besoin pour exécuter la MéthodeRéservéeÀSupportCkx de celui ci en réaction à un clic sur la CheckBox.
Merci @Dranred
C'est un peux comme le principe de l’héritage entre classe (Mais cela n'existe pas en VBA) vous m'avez déjà expliqué
J'ai fait l'exemple (qui fonctionne pas) mais j'ai tous commenté
Pour un exemple très simple
Je ne sais pas trop où vous voulez en venir.
Mais faites en sorte qu'un module de classe soit le plus autonome possible. Il ne faudrait pas intervenir dedans à partir d'un code externe. Il faut l'équiper de méthodes simples vues de l'extérieur, surtout pour la partie utilisatrice, et c'est à lui de se débrouiller pour s'organiser comme il faut. En dehors de ses propriétés et méthodes, on ne devrait plus avoir à penser à la programmation d'un module de classe quand on n'est plus dedans.
En Poste #19 (J'ai refait tous le code)
J'arrive a récupérer les propriété d'une classe depuis une autre.
Lorsque je met le Point après l'objet (J'ai toutes les propriété d'une autre classe) Mais lorsque je lance la commande (Il y a un bug) Je pense que c'est les déclaration de variable (Public et Privé)
J'ai fais des copie décans.
C'est possible de corrigé cela (Le but et de récupérer toutes les propriété d'une autre classe)
Un grand merci pour vos conseille et votre aide @Dranreb
Bonjour
Si l'exemplaire de ModClassB n'est pas créé pas le ModClasseA, il n'a pas à le connaitre en tant que parent. Vous n'aviez pas assimilé le principe de la méthode Add de mon CkxCollect, qui crée un SupportCkx puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument. Le nom It (lui) n'a pas été choisi au hasard, c'est le pendant de Me (moi) dans l'autre.
* Qu'elle sont les étapes à suivre en ModClasseA : Pour
* Comment cela s'écrit dans le code du ModClasseA ?
- Si l'exemplaire de ModClassB n'est pas créé par le ModClasseA
* La méthode Add de mon (CkxCollect = C'est votreModule de Classe) et (SupportCkx = un Objet)
* Comment cela s'articule (s'écrit et se code) !
- le principe de la méthode Add de mon CkxCollect, qui crée un SupportCkx
* A qu'elle endroit faire cette initialisation ?
* Comment les lignes de codes s'écrivent ? surtout pour parent au 1er argument.
- puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument.
* It est un (Mots reservé pour VBA "au même titre que For/Each/Worksheet/ Ect.)
* Me (C'est un Mot reservé je sais = est votre principe (Me = Le module de Classe ?)
- Le nom It (lui) n'a pas été choisi au hasard, c'est le pendant de Me (moi) dans l'autre.
Je ne sais pas. Comme ça, là, maintenant, je ne crois pas qu'il faille gérer autre chose que les CheckBox par des modules de classe. Il ne me semble pas qu'il faille d'autre support aux informations de base que le tableau en A1:E43 du classeur du demandeur. Même les positions des CheckBox sont données par
Left = 51,961525 + CentreX / 4 et Top = 207,8461 - CentreY / 4.
Ce que je ne comprend juste pas c'est pourquoi il n'y a pas une colonne diamètre aussi (voire plusieurs, j'ai vu quelque part une histoire de cercles concentriques).
Ni pourquoi il fait si compliqué avec un Multipage.
Je crois qu'il faudrait juste un Userform de mise à jour de ce tableau, et faire le traçage dans une procédure indépendante. Après tout on saurait que le trou n'est pas à tracer si les diamètres sont à 0, non ?
re @Dranred
En Réponse au Poste #22
Suivant vos conseilles en Poste #22 la Procédure Fonctionne.
Je Poste le fichier
Vous me dite si vous êtes d'accord sur le Principe et si j'ai compris !
D'une classe vers une autres.
Je regarde votre Poste #24
et je vous répond
Pièces jointes
ModuleDeClasse_Heritage (VBA Commente avec Exemple).xlsm
Je crois qu'une autre classe n'est pas adaptée au besoin du demandeur.
En revanche peut être une propriété supplémentaire du SupportCkx donnant le numéro de ligne dans le tableau source pourrait être utile.
Re @Dranreb En Réponse au Poste #24
Je ne sais pas. Comme ça, là, maintenant, je ne crois pas qu'il faille gérer autre chose que les CheckBox par des modules de classe.
Il ne me semble pas qu'il faille d'autre support aux informations de base que le tableau en A1:E43 du classeur du demandeur. (J'ai utilisé une variable tableau dans le module de classe)
Même les positions des CheckBox sont données par :
- Left = 51,961525 + CentreX / 4 et Top = 207,8461 - CentreY / 4.
Ce que je ne comprend juste pas c'est pourquoi il n'y a pas une colonne diamètre aussi (voire plusieurs, j'ai vu quelque part une histoire de cercles concentriques).
C'est en relation avec Autocad donc :
Pour dessiner un cercle :
VB:
Sub Example_AddCircle()
' This example creates a circle in model space.
Dim circleObj As AcadCircle
Dim centerPoint(0 To 2) As Double
Dim radius As Double
' Define the circle
centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
radius = 5#
' Create the Circle object in model space
Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
ZoomAll
End Sub
Ni pourquoi il fait si compliqué avec un Multipage (Je suis d'accord avec vous)
Je crois qu'il faudrait juste un Userform de mise à jour de ce tableau (C'est quoi l'idée je ne vois pas ?), et faire le traçage dans une procédure indépendante (Le tracage se fait depuis Autocad
Avec l'object AcadCircle)
Après tout on saurait que le trou n'est pas à tracer si les diamètres sont à 0, non ? (C'est avec les Methodes, Propriétes de la classe Circle de l'objet Autocad)
Bref, ce qui manque c'est un dialogue essentiellement basé sur la plage A1:E43, qu'il conviendrait d'ailleurs de mettre sous forme de tableau.
Je ne pourrais jamais tester l'UserForm si les instructions qui dialoguent avec Autocad sont dedans.
Pour mon fichier avec l'exemple en Poste #25 (J'ai Compris se que vous m'avez expliqué en Poste #22 ?)
J'ai pas compris cela :
la méthode Add de mon CkxCollect, qui crée un SupportCkx puis l'initialise par sa méthode Init en s'y spécifiant comme parent au 1er argument