Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

APPELLE DE FENETRE ET APPELLE DE FONCTION SANS CONNAITRE LE NOM DE LA FONCTION


Information sur la source

Catégorie :VB.NET Source .NET ( DotNet ) Classé sous : invoke, delegate, addressof Niveau : Initié Date de création : 26/04/2006 Vu / téléchargé: 5 778 / 264

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

Description

Cette classe permet de facilité les appelle bloquant entre fenetre :

Il permet à une fenetre A d'appeler un fenetre B et de se bloquer. Il permet de même de spécifier les méthodes à appeler à la fin de B. L'interêt est que grace à cette classe B n'a pas besoin de connaitre le nom des méthode à appeler.

L'utilité est trouver quand on a une fenetre fille qui peut être appeler par plusieurs fenetres mères et que chacune des fenetres mères à ces fonctions bien à elle.
 

Source

  • 'Comment utiliser l'objet gestionFenetre : du plus simple au plus perfectioner
  • 'déclaration :
  • 'dim gFen as new gestionFenetre(fenetre principale du prog)
  • 'ouverture de fenetre
  • '1°
  • ' gFen.affiche(truc)
  • '2°
  • ' gFen.affiche(truc, AddressOf MAJListe)
  • '3°
  • ' gFen.affiche(truc, New fonctionDeMiseAJourDeCetteFenetre(AddressOf MAJListe))
  • '4°
  • ' gFen.affiche(truc, New fonctionDeMiseAJourDeCetteFenetre() {AddressOf MAJListe, AddressOf MAJListe})
  • '5°
  • ' Dim f As fenetre
  • ' f = New fenetre(truc, New fonctionDeMiseAJourDeCetteFenetre() {AddressOf MAJListe, AddressOf MAJListe})
  • ' f.add(AddressOf MAJListe)
  • ' gFen.affiche(f)
  • 'fermeture de fenetre
  • 'gFen.fin() 'ferme et lance les méthodes
  • 'gFen.fin(false) 'ferme mais refuse de lancer les méthodes
  • 'cree un fonction délégate, en claire c'est un racourci vers une autre fonction lorsqu'on
  • 'créé un objet o du type fonctionDeMiseAJourDeCetteFenetre on spécifie l'addresse d'une fonction f
  • 'et en faisant o.invoke on execute la fonction f
  • Public Delegate Sub fonctionDeMiseAJourDeCetteFenetre()
  • 'classe permettant de géné des appelle de fenetre de façon bloquante
  • Public Class gestionFenetre
  • Protected fen As List(Of fenetre)
  • 'crée un nnouvel objet de gestion des affichage des fenetre
  • Public Sub New(ByRef mere As Windows.Forms.Form)
  • fen = New List(Of fenetre)
  • fen.Add(New fenetre(mere, AddressOf void))
  • End Sub
  • 'on demande un objet/un delegate fonctionDeMiseAJourDeCetteFenetre dans le constructeur, mais on peut ne passer que le AddressOf maFonction
  • 'puisque voyant que ce n'est pas le même type d'objet il tentera de créé un objet fonctionDeMiseAJourDeCetteFenetre avec AddressOf maFonction en
  • 'paramètre. de cette façon l'écriture est simplifier : gfen.affiche(fen1,AddressOf maFonctionMAJ)
  • Public Sub affiche(ByRef fenFille As Windows.Forms.Form, ByRef fonctionDeMiseAJours As fonctionDeMiseAJourDeCetteFenetre)
  • Me.affiche(New fenetre(fenFille, fonctionDeMiseAJours))
  • End Sub
  • 'on demande l'affichage d'une fenetre en informant qu'il faudra faire plusieurs fonctions après la fermeture de la fenetre
  • Public Sub affiche(ByRef fenFille As Windows.Forms.Form, ByRef fonctionDeMiseAJours() As fonctionDeMiseAJourDeCetteFenetre)
  • Me.affiche(New fenetre(fenFille, fonctionDeMiseAJours))
  • End Sub
  • 'on ne veut que afficher la fonction, dans ce cas la fonction appeler sera void une fonction qui ne fait rien
  • Public Sub affiche(ByRef fenFille As Windows.Forms.Form)
  • Me.affiche(fenFille, New fonctionDeMiseAJourDeCetteFenetre(AddressOf void))
  • End Sub
  • 'on affiche la form de l'objet passer et on ajout l'objet à la pile des fenetres affiché
  • Public Sub affiche(ByRef mafenetre As fenetre)
  • fen.Item(fen.Count - 1).getForm.Enabled = False
  • fen.Add(mafenetre)
  • mafenetre.getForm.Show()
  • End Sub
  • '-on redonne la main à l'avant dernière fenetre de la pile si c'est possible
  • '-on ferme la fenetre qui est a la fin de la pile
  • '-on appelle les fonction qui on été demander
  • Public Sub fin(Optional ByVal appelleLesFonctionsEnFinDeFenetre As Boolean = True)
  • If fen.Count > 1 Then fen.Item(fen.Count - 2).getForm.Enabled = True
  • If fen.Count > 1 Then fen.Item(fen.Count - 2).getForm.Activate()
  • fen.Item(fen.Count - 1).getForm.Dispose()
  • If appelleLesFonctionsEnFinDeFenetre Then fen.Item(fen.Count - 1).Invoke()
  • fen.RemoveAt(fen.Count - 1)
  • End Sub
  • 'fonction vide, on doit forcement avoir une fonction à lancer à la fermeture, si l'utilisateur n'en a pas mit alors on en met une
  • 'et une qui n'a aucune incidence sur le programme
  • Private Sub void()
  • End Sub
  • End Class
  • Public Class fenetre
  • Private fen As Windows.Forms.Form
  • Private fcn As List(Of fonctionDeMiseAJourDeCetteFenetre)
  • 'crée un objet fenetre avec une fenetre et plusieurs fonctions à lancer
  • Public Sub New(ByRef maForm As Windows.Forms.Form, ByRef MesFcn() As fonctionDeMiseAJourDeCetteFenetre)
  • fen = maForm
  • fcn = New List(Of fonctionDeMiseAJourDeCetteFenetre)
  • For i As Integer = 0 To MesFcn.Length - 1
  • fcn.Add(MesFcn(i))
  • Next
  • End Sub
  • 'crée un objet fenetre avec une fenetre et une fonction à lancer
  • Public Sub New(ByRef maForm As Windows.Forms.Form, ByRef MesFcn As fonctionDeMiseAJourDeCetteFenetre)
  • fen = maForm
  • fcn = New List(Of fonctionDeMiseAJourDeCetteFenetre)
  • fcn.Add(MesFcn)
  • End Sub
  • 'ajoute à l'objet fenetre une fonction à lancer
  • Public Sub add(ByRef MaFcn As fonctionDeMiseAJourDeCetteFenetre)
  • fcn.Add(MaFcn)
  • End Sub
  • 'geteur de fenetre
  • Public Function getForm() As Windows.Forms.Form
  • Return fen
  • End Function
  • 'appelle les fonction de cette objet
  • Public Sub Invoke()
  • For i As Integer = 0 To fcn.Count - 1
  • fcn.Item(i).Invoke()
  • Next
  • End Sub
  • End Class
'Comment utiliser l'objet gestionFenetre : du plus simple au plus perfectioner
'déclaration : 
'dim gFen as new gestionFenetre(fenetre principale du prog)
'ouverture de fenetre
'1°
'   gFen.affiche(truc)
'2°
'   gFen.affiche(truc, AddressOf MAJListe)
'3°
'   gFen.affiche(truc, New fonctionDeMiseAJourDeCetteFenetre(AddressOf MAJListe))
'4°
'   gFen.affiche(truc, New fonctionDeMiseAJourDeCetteFenetre() {AddressOf MAJListe, AddressOf MAJListe})
'5°
'   Dim f As fenetre
'   f = New fenetre(truc, New fonctionDeMiseAJourDeCetteFenetre() {AddressOf MAJListe, AddressOf MAJListe})
'   f.add(AddressOf MAJListe)
'   gFen.affiche(f)
'fermeture de fenetre
'gFen.fin()      'ferme et lance les méthodes
'gFen.fin(false) 'ferme mais refuse de lancer les méthodes


'cree un fonction délégate, en claire c'est un racourci vers une autre fonction lorsqu'on
'créé un objet o du type fonctionDeMiseAJourDeCetteFenetre on spécifie l'addresse d'une fonction f
'et en faisant o.invoke on execute la fonction f
Public Delegate Sub fonctionDeMiseAJourDeCetteFenetre()

'classe permettant de géné des appelle de fenetre de façon bloquante
Public Class gestionFenetre
    Protected fen As List(Of fenetre)


    'crée un nnouvel objet de gestion des affichage des fenetre
    Public Sub New(ByRef mere As Windows.Forms.Form)
        fen = New List(Of fenetre)
        fen.Add(New fenetre(mere, AddressOf void))
    End Sub

    'on demande un objet/un delegate fonctionDeMiseAJourDeCetteFenetre dans le constructeur, mais on peut ne passer que le AddressOf maFonction
    'puisque voyant que ce n'est pas le même type d'objet il tentera de créé un objet fonctionDeMiseAJourDeCetteFenetre avec AddressOf maFonction en
    'paramètre. de cette façon l'écriture est simplifier : gfen.affiche(fen1,AddressOf maFonctionMAJ)
    Public Sub affiche(ByRef fenFille As Windows.Forms.Form, ByRef fonctionDeMiseAJours As fonctionDeMiseAJourDeCetteFenetre)
        Me.affiche(New fenetre(fenFille, fonctionDeMiseAJours))
    End Sub

    'on demande l'affichage d'une fenetre en informant qu'il faudra faire plusieurs fonctions après la fermeture de la fenetre
    Public Sub affiche(ByRef fenFille As Windows.Forms.Form, ByRef fonctionDeMiseAJours() As fonctionDeMiseAJourDeCetteFenetre)
        Me.affiche(New fenetre(fenFille, fonctionDeMiseAJours))
    End Sub

    'on ne veut que afficher la fonction, dans ce cas la fonction appeler sera void une fonction qui ne fait rien
    Public Sub affiche(ByRef fenFille As Windows.Forms.Form)
        Me.affiche(fenFille, New fonctionDeMiseAJourDeCetteFenetre(AddressOf void))
    End Sub

    'on affiche la form de l'objet passer et on ajout l'objet à la pile des fenetres affiché
    Public Sub affiche(ByRef mafenetre As fenetre)
        fen.Item(fen.Count - 1).getForm.Enabled = False
        fen.Add(mafenetre)
        mafenetre.getForm.Show()
    End Sub

    '-on redonne la main à l'avant dernière fenetre de la pile si c'est possible
    '-on ferme la fenetre qui est a la fin de la pile
    '-on appelle les fonction qui on été demander
    Public Sub fin(Optional ByVal appelleLesFonctionsEnFinDeFenetre As Boolean = True)
        If fen.Count > 1 Then fen.Item(fen.Count - 2).getForm.Enabled = True
        If fen.Count > 1 Then fen.Item(fen.Count - 2).getForm.Activate()
        fen.Item(fen.Count - 1).getForm.Dispose()
        If appelleLesFonctionsEnFinDeFenetre Then fen.Item(fen.Count - 1).Invoke()
        fen.RemoveAt(fen.Count - 1)
    End Sub

    'fonction vide, on doit forcement avoir une fonction à lancer à la fermeture, si l'utilisateur n'en a pas mit alors on en met une
    'et une qui n'a aucune incidence sur le programme
    Private Sub void()
    End Sub
End Class

Public Class fenetre
    Private fen As Windows.Forms.Form
    Private fcn As List(Of fonctionDeMiseAJourDeCetteFenetre)

    'crée un objet fenetre avec une fenetre et plusieurs fonctions à lancer
    Public Sub New(ByRef maForm As Windows.Forms.Form, ByRef MesFcn() As fonctionDeMiseAJourDeCetteFenetre)
        fen = maForm
        fcn = New List(Of fonctionDeMiseAJourDeCetteFenetre)
        For i As Integer = 0 To MesFcn.Length - 1
            fcn.Add(MesFcn(i))
        Next
    End Sub

    'crée un objet fenetre avec une fenetre et une fonction à lancer
    Public Sub New(ByRef maForm As Windows.Forms.Form, ByRef MesFcn As fonctionDeMiseAJourDeCetteFenetre)
        fen = maForm
        fcn = New List(Of fonctionDeMiseAJourDeCetteFenetre)
        fcn.Add(MesFcn)
    End Sub

    'ajoute à l'objet fenetre une fonction à lancer
    Public Sub add(ByRef MaFcn As fonctionDeMiseAJourDeCetteFenetre)
        fcn.Add(MaFcn)
    End Sub

    'geteur de fenetre
    Public Function getForm() As Windows.Forms.Form
        Return fen
    End Function

    'appelle les fonction de cette objet
    Public Sub Invoke()
        For i As Integer = 0 To fcn.Count - 1
            fcn.Item(i).Invoke()
        Next
    End Sub
End Class

Conclusion

Je n'ai pas réussi à faire que l'on puissent donner des paramètres aux méthodes: il y avait bien le dynamicInvoke mais l'implementation pour prendre en compte chaque type d'en-tête de méthode était lourd. Donc les méthodes doivent être sans paramètre.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de gbilloet le 27/04/2006 07:57:03

Merci de corriger les fautes d'orthographe dans le code et le descriptif. C'est trop pénible à lire.

Bon courage.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Delegate, SetTimer et AddressOf) [ par vinscoco ] bonjour, je voudrais avoir quelques precision concernant une partie de code que je dois faire passer de VB6 a VB.Net.dans un premier temps, voici les [.net] plusieurs question sur thread, delagate invoke etc... [ par Lucyberad ] Bonjour a tous,j'ai quelque petite question afin d'éclaircir mon savoir (et principalement savoir ce que j'utilise).donc voila j'ai fais un peu d créer une delegate action [ par pfovez ] Voici mon problème:j'ai créé une classe pour définir un enregistrementet j'utilise une liste pour stocker tous mes enregistrementsen gros voici mon co Multithreading et Forms (delegate, class et invoke) [ par shackleton1986 ] Je vais essayer mon problème de la manière la plus simple ...Mon but est de pouvoir modifier un contrôle TextBox de ma fenêtre principale  à partir de Invoke dans une class [ par OneHacker ] Bonjour j'ai créer une classe vide mais ce n'est pas un contrôle, est-ce qu'il y la posibilité d'implémenté un code pour que la classe puisse utiliser Delegate, non asynchrone [ par OneHacker ] Bonjour, alors j'appelle une procédure de façon asynhrone come on me l'a expliqué mais ca ne marche pas :     Delegate Sub LoadLink(ByVal link As Stri Invoke / Thread [ par tweeder ] Bonjour à tous,Quand je programme une fenêtre, je peux utiliser Invoke pour me resynchroniser sur un thread. Est-ce qu'il y a moyen d'appeler une fonc invoke et module [ par Anakkin ] Bonjour, J'ai un probleme avec un module qui contient des fonctions pour la gestion du thread.Mon formulaire principal contient un textbox et un bouto passer un delegate en parametre [ par narfight ] Bonjours,Je voudrais passer un delegate en parametre a une de mes fonctions. le delegate en question serait toujours constitué des même parametres mai invoke sur string() [ par Megafan ] Bonjour,J'ai besoin d'aide de la part des experts en .NETle point de départ:- Une Form avec une listbox (LstClients)- Une Classe Serveur->  Envoie


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.