Tester le nom de tout les forms de mon application (VB.NET)

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 1 oct. 2007 à 12:40
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 6 déc. 2007 à 15:41
Bonjour
    J'ai un 'petit' problème :


    Je reçois (par WinSock) des demandes d'autre application.
Une de ces demandes est d'ouvrir le formulaire d'ont le nom (propriété 'Name') m'es
passé. Pour cela je pensais tester le nom de tous les formulaires existant de
mon application dans un 'foreach' (pour m'éviter un 'select' énorme).

    Sauf que je ne trouve pas la syntaxe  (je la trouve pour tous
les formulaires ouverts de mon application mais pas pour tous les formulaires existants/déclaré,
or très peut de formulaire doive être ouvert simultanément).


    Donc voila... Un problème de syntaxe quoi.


    Merci d'avance
Amicalement
Pensez "Réponse acceptée"

16 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 oct. 2007 à 12:02
On m'à répondu sur le forum MSDN (je commencés à ne plus y
croire)


Bon, ça demande à être modifier un poile (un quart de poile) mais ça m'ouvre la voie.




La solution (Merci à Henri d Orgeval ) :

----------------------------------------------------------------------------------------
   Public Sub startForm()
        ' on récupère l'assembly qui est en cours d'éxécution
        ' dans cet exemple il s'agit de votre application windows
        Dim myassembly As System.Reflection.Assembly = _
        System.Reflection.Assembly.GetCallingAssembly()
        ' On itère sur tous les types présents dans l'assembly
        For Each myType As System.Type In myassembly.GetTypes
            If myType.IsClass Then
                ' On récupère le nom de la classe
                Dim myTypeName As String = myType.Name
                ' On utilise une expression régulière
                ' pour vérifier que le nom est conforme à ce qu'on attend
                ' dans cet exemple, tous les formulaires qui s'appelle
                ' Form1, Form2, Form3, etc... seront traités
                Dim myPattern As String = "Form\d"
                Dim myRegex As New System.Text.RegularExpressions.Regex(myPattern)
                If myRegex.IsMatch(myTypeName) Then
                    ' on vérifie que la classe hérite bien de System.windows.Forms.Form
                    If myType.BaseType.Name = "Form" Then
                        ' on instancie le formulaire
                        Dim myInstance As System.Object
                        myInstance = Activator.CreateInstance(myType)
                        Dim myForm As System.Windows.Forms.Form
                        myForm = CType(myInstance, System.Windows.Forms.Form)
                        ' on affiche le formulaire à l'écran
                        myForm.Show()
                    End If
                End If
            End If
        Next
    End Sub
----------------------------------------------------------------------------------------
Le lient vers le topique MSDN : ici

Amicalement
Pensez "Réponse acceptée"
3
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
1 oct. 2007 à 14:07
C'est effectivement un souci que j'ai eue dans une de mes appli, possédant un formulaire MdiParent
Voici le code, qui active la form si elle a deja été instanciée

'Verifie si la form est ouverte ou non, dans ce cas il faudra l'initialiser
    Public Function VerifSiFormOuverte(ByVal formAppelante As Form, ByVal nomForm As String) As Boolean
        For Each f As Form In formAppelante.MdiChildren
            If f.Name = nomForm Then
                f.Activate()
                Return True 'on ne fait qu'activer la form et renvoyer oui
            End If
        Next
        Return False 'la form n'est pas activee: il faut l'ouvrir
    End Function

Si ce n'est pas le cas, on 'lactivera :
'Ouverture de formulaire dans la fenetre parent
    Public Sub OuvreForm(ByVal QuelForm As Form, ByVal FormParent As Form)
        Try
            QuelForm.MdiParent = FormParent
            QuelForm.Show()
        Catch ex As Exception
            MsgBox("Impossible d'ouvrir la Form: " & QuelForm.ToString & vbCrLf & ex.Message)
        End Try
    End Sub

En gros, on aura ce lancement :

    Private Sub MenuItem11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem11.Click
     'ouverture la form si elle n'etait pas ouverte
      If VerifSiFormOuverte(Me, "Recherche") Then Exit Sub Else  OuvreForm(New Recherche, Me)
    End Sub

Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
1 oct. 2007 à 15:16
Heeee, non ???

Je crois que ma question n'a pas été comprise...

Je reformule.




    J'ai une application (VB.NET) possédant un nombre important de formulaire
différant (à la louche 50).
    Je reçois (par WinSock) un Nom de formulaire à ouvrir (que celui-ci soit déjà ouvert
ou non ne me regarde pas, s’il est déjà ouvert j'en ouvre une nouvelle
instance).
    Problème je ne sais pas sur quelle classe (oui en VB.NET les form sont des
classes) va être basé cette form. Je veux donc tester le nom de toutes les
forms (ou toute les classe étant des forms, dans ce cas j'ajoute le teste "If (TypeOf Item Is Form) Then") de mon application pour trouver celle que je dois ouvrir.

Un truc du genre:

For Each Item As Form In TouteLesFormsDeMonAppli
    if (Item.Name = NomFormAOuvrir) then

       .......

    endif

Next


La seul donnée que je possède est 'NomFormAOuvrir' de type string donc le code
suivant ne peut pas marché (à moins que je ne raconte n’importe quoi)


Public Sub OuvreForm(ByVal QuelForm As Form, ByVal FormParent As Form)




Amicalement



Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
1 oct. 2007 à 15:18
Oups j'oublie la fin...

Ce que je cherche c'est la syntaxe de "TouteLesFormsDeMonAppli" dans le petit bout de code posté plus haut.

Merci

Amicalement
Pensez "Réponse acceptée"
0

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

Posez votre question
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
2 oct. 2007 à 10:13
C'est pourquoi il te faut une application utilisant MdiChild et MdiParent, afin de connaitre toutes les form lancées dans l'application, car la fenetre MdiParent recense toutes ses form filles.
J'ai déja cherché, on ne peut pas faire autrement... (enfin je pense )

Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 10:22
Merci quand même, je cherche toujours mais je commence
à croire aussi que ce n’est pas possible autrement (pourquoi quelque chose qui fonctionnais
sous VB6 ne fonction plus sous VB.NET, non je ne vais pas me re-mettre à
insulté Microplof)


En tout cas merci pour tes recherches.




Amicalement



Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 10:38
Pour connaître toute les forms ouvertes de
l'application la syntaxe est :

My.Application.OpenForms


Qui retourne une collection de form (de type "FormCollection" mais uniquement les forms déjà en mémoire)

Et il n'y à pas besoin de Mdi (parent ou child).


Mais ça ne corespond pas à mes attentes puisque le form à ouvrir n'a pas
forcément une instance d'ouverte.




Amicalement



Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 11:14
Je viens de lire (de nouveau) une rubrique d'aide (MSDN) intitulé
"Forms collection changes".


Je vais quand même insulté Microplof (bande de trollosses!!!
) qui note dans
ça rubrique d'aide, je site :
"A Visual Basic 6.0 Forms collection is
a collection whose elements represented each loaded form in an
application."

Forms en VB6 retourne l'ensemble des form de l'application et non pas
uniquement celle chargé.
Bande de %ùµ¤¨^% et encor je suis calme...





Amicalement



Pensez "Réponse acceptée"
0
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
2 oct. 2007 à 11:22
En effet, mais la c'est du .Net 2, que je ne connais pas
Si cela existe, ca pourrait etre la solution.
Dans tous les cas, tu peux ouvrir la form et tester , et la refermer quand tu as fini, ainsi tu ne pourras surcharger la mémoire
Cela dépend bien entendu du fonctionnement

Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 11:41
C'est exactement ce que j'ai en tête.

Au lancement de mon application je fais une boucle qui charge tous les form,
sauvegarde leur propriété 'Name' dans un tableau de string puis les ferme. Ainsi
je teste mon tableau, trouve l'index de 'forms' (en VB6) dont j'ai besoin,
j'ouvre une nouvelle instance et je travail dessus.
Mais cette put£¤$ de
collection n'existe plus...

Microplof =
Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 12:22
Je viens de posté sur le forum MSDN (oui de Microplof, sans trop y croire mais bon...)

On verra, de toute façon si je fini par trouvé une solution j'expliquerais ici
command j’ai fait.






Amicalement



Pensez "Réponse acceptée"
0
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
2 oct. 2007 à 13:01
"Au lancement de mon application je fais une boucle qui charge
tous les form, sauvegarde leur propriété 'Name' dans un tableau de
string puis les ferme"



Pourquoi ne pas ajouter un booléen qui indique s'ils sont deja ouverts dans ton tableau ??
Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
2 oct. 2007 à 13:34
Oui, pourquoi pas.
Sauf que dans mon cas l'utilité est limité puisque quoi qu'il arrive j'ouvre une nouvelle instance de la form demandé.

Amicalement
Pensez "Réponse acceptée"
0
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
5 oct. 2007 à 15:17
je me disais aussi que c'etait facile ...
Merci d'avoir posté, ca servira bien un jour, à moi ou n'importe qui d'autre !!!
Bonne continuation

Vaut mieux etre bourré que con: ca dure moins longtemps...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 oct. 2007 à 15:55
En tout cas merci de ton suivi.


A+ et au plaisir




Amicalement



Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
6 déc. 2007 à 15:41
Bon je suis là pour m'excuser au prés de Microplof (bà oui ça leur arrive d'avoir bon...)
J'avais posté le 02/10/2007 à 11:14:26 une connerie (qui m'a fais cassé du sucre sur le dos de Microplof)
Forms retourne bien la liste des form en mémoire (chargé) et non pas tout les form de l'appli (dommage pour moi en ce moment)...
Désolé

</gras></gras>Bon bà ... désolé Microplof .</gras>Dur à dire quand même
(je ferais plus attention avent de vous accusé de désinformation ...)

Par contre maintenant je cherche à faire la même chose mais en VB6
( Ras le bol qu'on change mon cahier des charge d'un développement au bout de 2/3 mois, alors qu'en plus il est fini )

Et donc pour faire ça en VB6 ([auteur/CAPUCCINOFR/241059.aspx capuccino_fr] tu semblais savoir) il faut forcément passé par un MDI parent ? Soit un MDIParent contenant toute les form du projet ? Bon ce serais une solution mais qui ne m'arrange VRAIMENTpas.

Pour faire différemment en VB6 (que par MDI) j'ai quelque idée mais je n'arrive pas à en mettre une en place.
ici : http://www.vbfrance.com/infomsg_TOUTE-FORM-PROJET-VB6_1044947.aspx#1
Amicalement
Pensez "Réponse acceptée"
0
Rejoignez-nous