Vraiment c'est un générateur de variable qu'il me faut et ensuite il faut que je puissent déclarer objets en public avec la variable que je viens de générer sachant que chaque variable doit être unique.
Vraiment c'est un générateur de variable qu'il me faut et ensuite il faut que je puissent déclarer objets en public avec la variable que je viens de générer sachant que chaque variable doit être unique.
Déjà, dans ce bout de code,
tu as une erreur La variable locale 'x' est déjà déclarée dans le bloc actuel. Normal tu déclare 2 foix x (avec des types différents)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dans Dim x As String = "Alarm" & idAlarm Public x As Alarme = New Alarme
Par rapport à l'exemple que je t'ai donné cela se présenterait ainsi
Le premier élément du dico est la clé que tu généres par la concaténation entre un String "Alarm" et le numéro unique de l'alarme tu souhaites ajouter idAlarm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Public Sub AjoutAlarme(ByVal idAlarm As Integer, ByVal unit As String, ByVal moduleparam As String, ByVal description As String, ByVal niveaualarm As String, ByVal message As String, ByVal priority As String, ByVal seuil As String) _ Implements IAlarmes.AjoutAlarme Dim x As UneAlarme = New UneAlarme ' pour toi : Dim x As Alarme = New Alarme x.IdAlarm = idAlarm x.Unit = unit x.ModuleParam = moduleparam x.Description = description x.NiveauAlarm = niveaualarm x.Message = message x.Priority = priority x.Seuil = seuil MesAlarmes.DicoAlarmes.Add("Alarm" & idAlarm, x) ' c'est ici que tu génére la clé qui est la concaténation entre un String "Alarm" et le numéro unique de l'alarme tu souhaites ajouter.
C'est le dictionnaire MesAlarmes.DicoAlarmes qui est en public dans la classe DesAlarmes, qui permet de retrouver une alarme grâce à sa clé. (Si idAlarm = 2 => "Alarm" & idAlarm => Alarm2)
Le dico est juste un raccourci vers une alarme qui existe or lorsque la procédure AjoutAlarme prend fin, l'alarme créer dans cette procédure est supprimé.
Non, un élément t'échappe, le dictionnaire en public te permet l'accés à toutes tes alarmes. (c'est la clé du dictionnaire qui correspond au générateur de variable)
C'est le dictionnaire MesAlarmes.DicoAlarmes qui est en public dans la classe DesAlarmes, qui permet de retrouver une alarme grâce à sa clé. (Si idAlarm = 2 => "Alarm" & idAlarm => Alarm2)
MesAlarmes.DicoAlarmes("Alarm2") est un objet alarme qui contient toutes les données de l'alarme qui a l'identifiant (idAlarm) "2" .
la procédure AjoutAlarme cré une alarme en local
La méthode Add du dictionnaire ajoute cette nouvelle alarme à sa liste
nous avons un objet en mémoire qui est référencé par 2 variables :
la variable locale
le dictionnaire public
Quand on sort de la procédure, la variable locale est détruite, pas l'objet, celui-ci est toujours référencé par le dictionnaire.
Il me semblait bien l'avoir précisé.
Dans ce sujet, post 3 Voir le commentaire en fin de sub.
Je lance mon programme sans rien changer par rapport a ce que j'ai fait il y a 2H et poff le message d'erreur qui dit dico vide n'apparait plus.
J'ai trouver réellement mon problème, lorsque j’instancie la classe Alarme dans le VB6 qui me permet d'ouvrir par exemple mon Form2 ou d'ajouter des alarmes dans mon dico alors ces alarmes ne sont disponible que pour les appels de procédure qui utilise la même instance sur le VB6. Si par exemple, j'instancie ma classe dans mon Form2 pour pouvoir utiliser des procédure et par la même occasion pouvoir profité de mon dico, le programme me répond que le dico est vide étant donnée que lors de l'instanciation, il reprend tous à zéro.
Je voudrai bien une solution qui me permet soit d'utiliser l'interface et la classe appelé dans le programme VB6 dans tous mon programme Visual Studio via un Dico par exemple ou autre solution, etc....
Soit géré le mon tick du timer du form2 à l’intérieur de ma classe Alarme par un appel dans la fonction GestAlarme par exemple mais dans ce cas la, je sais pas si je pourrais agir sur les éléments du Form2 (datagridview, bouton, label, etc....)
Merci d'avance pour vos solution.
Je vais essayer de faire hérité mon Form2 de ma classe Alarme, normalement je verrai pouvoir faire appel au procédure et variable sans souci.
L'héritage de classe sur le Form2 mais crée plein d'erreur dans Form2.Designer.vb et je voulais pas trop toucher a ce fichier à l'origine.
J'ai l'impression que la solution ce trouve dans ce post ^^ je creuse un peu car j'ai sauté cette partie, il y a des truc très intéressant que je reviens sur les page précédente, j'ai l'impression que la réponse est déjà la !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part <<<@!1!@>>>
Mon programme marche très bien, j'arrive à récupérer ce qu'il ce trouve dans le dico mais j'ai un nouveau souci, lorsque je lance mon simulateur (Form1 en VB6 qui fait appel à un activeX "Échangeur thermique" ) avec un bouton start, puis quand je lance mon gestionnaire d'alarme, le timer de l'activeX arrêt de tourner ce qui arrêt mon simulateur. Alors il y a une procédure bizar avec le timer de l'activeX qui à était réalisé par mon tuteur, je vais d'abord voir avec lui et si je trouve pas de solution, je poste ton mon programme sur le Forum.
Effectivement normalement tu as tout dans cette discution
Je n'ai pas trop le temps je vais essayer de faire un résumé. Je redétaillerais plus ce soir s'il le faut
Je ne met que le code de la dll vb.net
Il y a une interface qui permet à vb6 de faire le lien (Instancié par vb6, cré l'objet)
elle permet à vb6 d'accéder au sub de la dll
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ''' <summary>L'interface représente un Wrapper de la classe Alarme pour les programmes exe vb6.</summary> ''' <remarks>Sera exportée dans la bibliothéque de type créé dans l'assembly.</remarks> Public Interface IAlarmes Sub GestAlarme() Sub AjoutAlarme(ByVal UnId As String, ByVal LaPriorite As Integer) Sub LitAlarmes(ByVal UnId As String, ByRef LaPriorite As Integer) End Interface
Ces sub sont implémenté dans InterfaceAlarmes
Les éléments importants sont
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Public Class InterfaceAlarme Implements IAlarmes ' contrat entre classe et interface. Private fenAlarmes As frmAlarmes = New frmAlarmes Private MesAlarmes As DesAlarmes = New DesAlarmes ' a voir la portée ''' <summary>Ajoute une alarme au dictionnaire.</summary> ''' <param name="UnId">Identifiant d'une alarme.</param> ''' <param name="LaPriorite">Une priorité.</param> ''' <remarks></remarks> Public Sub AjoutAlarme(ByVal UnId As String, ByVal LaPriorite As Integer) Implements IAlarmes.AjoutAlarme Dim NouvelleAlarme As UneAlarme = New UneAlarme NouvelleAlarme.IdAlarm = UnId NouvelleAlarme.ChangeNiveauPriorite(LaPriorite) MesAlarmes.DicoAlarmes.Add(NouvelleAlarme.IdAlarm, NouvelleAlarme) System.Windows.Forms.MessageBox.Show(" ajout " & MesAlarmes.DicoAlarmes("a1").Priority) End Sub Public Sub GestAlarme() Implements IAlarmes.GestAlarme fenAlarmes.MesAlarmes = MesAlarmes ' donne les alarmes à la fenêtre fenAlarmes.ShowDialog() MesAlarmes = fenAlarmes.MesAlarmes ' récupère les alamres traitées par la fenêtre End Sub Public Sub LitAlarmes(ByVal UnId As String, ByRef LaPriorite As Integer) Implements IAlarmes.LitAlarmes LaPriorite = MesAlarmes.DicoAlarmes(UnId).Priority End Sub End Class
Private MesAlarmes As DesAlarmes = New DesAlarmes. qui permet de créé une instance publique de DesAlarmes qui contient le dictionnaire qui est en public (voir (1))
Private fenAlarmes As frmAlarmes = New frmAlarmes.
qui cré une instance de la fenêtre de travail.
Ensuite les sub
AjoutAlarme alimente le dictionnaire qui est en public.
Les données des alarmes sont donc maintenant dans le dictionnaire.
GestAlarme passe à la fenêtre créée l'instance de DesAlarmes avec le dictionnaire en public qui contient toutes les alarmes
.
(1)
J'y reviendrai ce soir ci nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Public Class DesAlarmes Private mDicoAlarmes As Dictionary(Of String, UneAlarme) = New Dictionary(Of String, UneAlarme) Public Property DicoAlarmes() As Dictionary(Of String, UneAlarme) Get Return mDicoAlarmes End Get Set(ByVal value As Dictionary(Of String, UneAlarme)) mDicoAlarmes = value End Set End Property
A+, Hervé.
J'ai trouver le problème, j'avais mi ShowDialog() dans ma procédure GestAlarme() au lieu de Show(). En faite sa m'ouvre mon Form2 mais sa stopé mon simulateur sous VB6 du coup la sa marche super bien, je commence deja la partie optimisation puis je vais voir cette aprem ce que tu ma posté.
Post N°1 de la discution
Attention, Le simulateur devait être lancé par un bouton, c'est pour cela que dans mes exemples j'ai ouvert la fenêtre en modal par ShowDialog.
Lappli vb6 était ainsi bloquée, cela permettait de finir le traitement des alarmes reçues dans la fenêtre dll vb.net . Quand cell-ci était fermée on pouvait recliquer pour relancer le traitement d'un autre ensemble d'alarmes.
Par contre si cette fonctionnalité change (plus de bouton) et la fenêtre n'est plus n'est plus en modal, il faut faire attention.
qu'il n'y ai qu'une instance de DesAlarmes qui contient le dictionnaire des alarmes. (un singleton résoud le problème)
[Edit] On ne peut pas avoir d'élément shared au niveau de l'interface pour la rendre unique. [/Edit]
de gérer les envoies de données de vb6 vers la dll vb.net (beaucoup plus complexe à mon avis)
Une question : une fois les alarmes traitées doivent elles être renvoyées vers vb6 ?
Pour la classe DesAlarmes en instance unique par singleton
Def dans InterfaceAlarmes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Public Class DesAlarmes Private Shared _InstanceAlarmesUnique As DesAlarmes #Region "Unicité singleton" ''' <summary>GetInstance permet de récupérer une instance unique de "DesAlarmes"</summary> ''' <returns>Une instance unique.</returns> ''' <remarks>Si l'instance n'existe pas renvoie celle créée, sinon renvoie celle qui existe</remarks> Public Shared Function GetInstance() As DesAlarmes If _InstanceAlarmesUnique Is Nothing Then _InstanceAlarmesUnique = New DesAlarmes() Return _InstanceAlarmesUnique End Function #End Region Private mDicoAlarmes As Dictionary(Of String, UneAlarme) = New Dictionary(Of String, UneAlarme) Public Property DicoAlarmes() As Dictionary(Of String, UneAlarme) Get Return mDicoAlarmes End Get Set(ByVal value As Dictionary(Of String, UneAlarme)) mDicoAlarmes = value End Set End Property
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ''' <summary>La classe interface des alarmes visible hors bibliothèque.</summary> Public Class InterfaceAlarme Implements IAlarmes ' contrat entre classe et interface. Private fenAlarmes As frmAlarmes = New frmAlarmes Private MesAlarmes As DesAlarmes = DesAlarmes.GetInstance ' pas de new, il sera fait une seule fois dans Getinstance, c'est cette sub qui vérifie l'unicité.
Quelques petits tests.
Je ne connais pas Linq, mais j'ai voulu voir ces capacités.
Dans DesAlarmes, je veux définir une fonction compteur d'alarmes ayant une certaine priorité. (dans le dictionnaire des alarmes)
Avec Linq
est équivalent à (en vb classique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Public Function LinqNbAlarmesDePriorite(ByVal LaPriorite As Integer) As Integer Return (From entree In DicoAlarmes Where (entree.Value.Priority = LaPriorite) Select entree).Count End Function
Autre test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Public Function NbAlarmesDePriorite(ByVal LaPriorite As Integer) As Integer Dim NbAlarmes As Integer Dim paire As KeyValuePair(Of String, UneAlarme) For Each paire In DicoAlarmes If paire.Value.Priority = LaPriorite Then NbAlarmes += 1 Next Return NbAlarmes End Function
ce coup-ci dans la fenêtre d'affichage des alarmes toujours avec le dictionnaire des alarmes. (passé dans la propriété dictionnaire)
Je place un Datagridview sans rien
et je souhaite afficher toutes mes alarmes.
m'affiche effectivement toutes les alarmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MonDGW.AutoGenerateColumns = True MonDGW.DataSource = MesAlarmes.DicoAlarmes.Select((Function(kv) New With {.LesCles = kv.Key, .LesPriorités = kv.Value.Priority})).ToArray
(attention dans mes tests je n'ai que 2 propriétés, mais le principe est le même avec plus)
Mieux,
Toujours avec un autre datagridview sans rien
m'affiche dans le dgv toutes les alarmes ayant le niveau de priorité choisi (saisie par l'utilisateur dans txtNbAlPArPri.Text)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 dgvPri.AutoGenerateColumns = True dgvPri.DataSource = (From entree In MesAlarmes.DicoAlarmes Where (entree.Value.Priority = Integer.Parse(txtNbAlPArPri.Text)) Select entree).Select((Function(kv) New With {.LesCles = kv.Key, .LesPriorités = kv.Value.Priority})).ToArray
C'est une combinaison des 2 éléments précédants (sans le count pour avoir la liste) époustouflant en une ligne de code.
Cela peut être pratique pour toi pour montrer à l'utilisateur un certains nombre d'info suivant des critères de choix. (juste en visu)
Je ne sais pas si tu me suis.
A+, Hervé.
Merci beaucoup pour ton aide !!
Je prend la journée pour mettre en ordre mon programme et je l'affiche sur le forum en mode résolu
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager