IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Optimisation code de gestion richtextbox dans onglets


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Optimisation code de gestion richtextbox dans onglets
    Bonjour, je développe actuellement un logiciel Open-Source, et je voulait avoir des conseils concernant la gestion des richtextbox dans les onglets.

    Voila, actuellement pour pouvoir faire une action dans la richtextboix qui correspond à l'onglet séléctionné je procède comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each rtb As Object In Ribbon_Tab.SelectedTab.Controls
    If TypeOf (rtb) Is RichTextBoxPrintCtrl Then
     
    'Mon code ici
     
    End if
    Next
    Mais je trouve cette manière un peu "sale", déja car je déclare en objet la richtextbox et ensuite parce qu'il me faut deux boucles imbriquées dans quasiment chaque procédure, ce qui ralentit le traitement.

    D'où ma question, comment faire pour optimiser ça et le coder de manière plus propre ?

    Merci

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonsoir,

    Ton tabPage ne contient pas que des contrôles ?

    Citation Envoyé par moimael Voir le message
    il me faut deux boucles imbriquées dans quasiment chaque procédure, ce qui ralentit le traitement.
    Elles servent à quoi ces 2 boucles ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Mon tabpage contient une richtextbox + un composant qui sert à afficher le numéro de ligne, d'ou la necessité de declarer la richtextbox en object (sinon il me dit que le composant servant a afficher les lignes n'est pas une richtextbox).

    Les deux boucles sont celles de mon premier messages :

    For Each rtb As Object In Ribbon_Tab.SelectedTab.Controls
    If TypeOf (rtb) Is RichTextBoxPrintCtrl Then

    'Mon code ici

    End if
    Next

    Elles servent à réaliser l'action dans l'onglet qui est séléctionné. (l'onglet actif)

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    parcourir des collections en .net est quelque chose d'immensément rapide à exécuter
    et controls est une collection, donc moi y a rien qui me choque dans ton code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Le problème c'est que ce n'est pas pratique du tout, y'aurais pas moyen de le déclarer une fois pour toute au lieu de le réécrire dans chaque procédure (environ une bonne cinquantaine de fois dans mon code) ?

    J'ai également beacoup vu qu'il était très déconseiller de déclarer les variable en object, en plus niveau codage, c'est assez peu pratique.

    Bon au pire je ferais avec mais si quelqu'un à une méthode pour simplifier ou faciliter le codage je suis preneur

    En tout cas merci à vous deux pour vos réponses rapides

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    as object c'est pas pratique parce que t'as pas l'intellisense entre autre
    mais dans un for each (bien qu'ici je le ferais as windows.forms.control) ca ne change rien
    vu que tu fais du typeof et que si tu trouves un rchtxt tu seras dans tous les cas obligé de directcaster

    il y a moyen de faciliter le code de ce que tu fais mais il faut qu'on sache un peu plus ce que tu veux faire

    mais par exemple si tu veux faire un traitement sur tous les richtextbox de ton appli, tu peux :
    dès que tu créé un richtextbox tu l'ajoutes dans une collection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim mesricthtextbox as new system.collections.generic.list(of richtextbox)
    mesricthtextbox.add(untel)
    comme ca tes for each tu les feras sur une collection qui ne contient que ce que tu cherches

    après si tu veux pas faire 50 for each, tu peux faire une sub d'itération
    en gros tu aurais une sub qui fait un traitement sur un rtxt (donc une sub par traitement)
    et une sub ou tu spécifie le traitement que tu veux faire sur tous

    avec quelques lignes de code ca doit etre plus simple à comprendre:


    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
     
    public sub TraitementRTXT(d as delegate)
      for each rtxt as richtextbox in mesrichtextbox
         d.invoke(rtx)
      next
    end sub
     
     
     Public Delegate Sub DEffaceLeTexte(ByVal rtxt As RichTextBox)
     Public Delegue_EffaceLeTexte As New DEffaceLeTexte(AddressOf EffaceLeTexte)
     
    public sub EffaceLeTexte(rtxt as richtextbox)
      rtxt.text = ""
    end sub
     
     
     
    public sub autre_sub_de_code
      TraitementRTXT ' et hop ca appelle cette sub pour tous les rtxt
    end sub
    ici j'ai utilisé un délégué que je passe en paramètre, il aurait aussi été possible de passer juste le nom et taper par reflection, c'est un peu plus simple et lisible mais un peu moins sur
    il est par conre possible si tu n'aimes pas les délégués de passer une enum et de faire un select case géant pour appeler la sub à la main

    au passage ca te fais des sub que tu peux appeler que pour un rtxt donc ca reste assez pratique
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonjour,

    Citation Envoyé par moimael Voir le message
    + un composant qui sert à afficher le numéro de ligne, d'ou la necessité de declarer la richtextbox en object (sinon il me dit que le composant servant a afficher les lignes n'est pas une richtextbox).
    )
    Pourquoi ton composant n'hérite pas de Component ou UserControl ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Je ne connais pas bien les délégués (à part les adresseOf),
    concrétement j'ai ce code qui est ma sub que j'apelle a chaque fois que je crée un onglet :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Private Sub newtab()
     
            Dim LocRM As New ResourceManager("Notepaddotnet.NotepadStrings", GetType(Notepad).Assembly)
                Ribbon_Tab.ContextMenuStrip = ContextMenuStrip1
                Dim Tabp As New RibbonTab
                With Tabp
                    .Text = LocRM.GetString("strNew") & Space(1) & nbOnglet
                    .AllowDrop = True
                End With
                Ribbon_Tab.Controls.Add(Tabp)
                Dim rtb As New RichTextBoxPrintCtrl
                With rtb
                    .Size = New Size(790, 410)
                    .Parent = Tabp
                    .ScrollBars = RichTextBoxScrollBars.ForcedVertical
                    .ShortcutsEnabled = True
                    .AllowDrop = True
                    .Dock = DockStyle.Fill
                    .BorderStyle = BorderStyle.None
                    .AllowDrop = True
                    .ContextMenuStrip = ContextMenuStrip2
                End With
                rtb.CreateControl()
                Dim line As New LineNumbers_For_RichTextBox
                With line
                    ._SeeThroughMode_ = False
                    .AutoSizing = True
                    .BackgroundGradient_AlphaColor = System.Drawing.Color.FromArgb(CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer), CType(CType(0, Byte), Integer))
                    .BackgroundGradient_BetaColor = System.Drawing.Color.LightSteelBlue
                    .BackgroundGradient_Direction = System.Drawing.Drawing2D.LinearGradientMode.Horizontal
                    .BorderLines_Color = System.Drawing.Color.SlateGray
                    .BorderLines_Style = System.Drawing.Drawing2D.DashStyle.Dot
                    .BorderLines_Thickness = 1.0!
                    .Dock = System.Windows.Forms.DockStyle.Left
                    .DockSide = LineNumbers_For_RichTextBox.LineNumberDockSide.Left
                    .GridLines_Color = System.Drawing.Color.SlateGray
                    .GridLines_Style = System.Drawing.Drawing2D.DashStyle.Dot
                    .GridLines_Thickness = 1.0!
                    .LineNrs_Alignment = System.Drawing.ContentAlignment.TopRight
                    .LineNrs_AntiAlias = True
                    .LineNrs_AsHexadecimal = False
                    .LineNrs_ClippedByItemRectangle = True
                    .LineNrs_LeadingZeroes = True
                    .LineNrs_Offset = New System.Drawing.Size(0, 0)
                    .Location = New System.Drawing.Point(0, 0)
                    .Margin = New System.Windows.Forms.Padding(0)
                    .MarginLines_Color = System.Drawing.Color.SlateGray
                    .MarginLines_Side = LineNumbers_For_RichTextBox.LineNumberDockSide.Right
                    .MarginLines_Style = System.Drawing.Drawing2D.DashStyle.Dot
                    .MarginLines_Thickness = 1.0!
                    .Padding = New System.Windows.Forms.Padding(0, 0, 2, 0)
                    .Show_BackgroundGradient = True
                    .Show_BorderLines = False
                    .Show_GridLines = True
                    .Show_LineNrs = True
                    .Show_MarginLines = True
                    .Size = New System.Drawing.Size(18, Tabp.Height)
                    .TabIndex = 2
                    .Parent = Tabp
                    .ParentRichTextBox = rtb
                End With
                Tabp.Controls.Add(line)
                AddHandler rtb.DragEnter, AddressOf lstTarget_DragEnter
                AddHandler rtb.DragDrop, AddressOf lstTarget_DragDrop
                AddHandler rtb.SelectionChanged, AddressOf TxtCtrlRtfSelectionChanged
                AddHandler rtb.SelectionChanged, AddressOf Count_Select
                AddHandler rtb.TextChanged, AddressOf TxtChanged
                AddHandler btn_gras.Click, AddressOf font_click
                AddHandler btn_italique.Click, AddressOf font_click
                AddHandler btn_souligné.Click, AddressOf font_click
                AddHandler btn_barré.Click, AddressOf font_click
                AddHandler btn_aligngauche.Click, AddressOf font_click
                AddHandler btn_centre.Click, AddressOf font_click
                AddHandler btn_aligndroite.Click, AddressOf font_click
                AddHandler btn_puces.Click, AddressOf font_click
                AddHandler rtb.KeyUp, AddressOf Count_Line
                AddHandler rtb.MouseUp, AddressOf Count_Line
                AddHandler rtb.KeyUp, AddressOf Count_Col
                AddHandler rtb.MouseUp, AddressOf Count_Col
        End Sub
    si maintenant par exemple je veut appliquer ta méthode sur cette sub, je fais comment ? :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub save()
     
            Dim LocRM As New ResourceManager("Notepaddotnet.NotepadStrings", GetType(Notepad).Assembly)
     
            Try
                For Each rtb As Object In Ribbon_Tab.SelectedTab.Controls
                    If TypeOf (rtb) Is RichTextBoxPrintCtrl Then
                    With SaveFileDialog1
                        .Filter = LocRM.GetString("strSaveFilter")
                        .DefaultExt = "txt"
                        .FileName = Ribbon_Tab.SelectedTab.Text
                    End With
                        If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                            Dim texte As String, textertf As String, titre As String
                            texte = rtb.Text
                            textertf = rtb.Rtf
                            titre = SaveFileDialog1.FileName
                            Dim SW As New StreamWriter(titre)
                            Dim fi As New FileInfo(titre)
                            Select Case fi.Extension
                                Case ".txt", ".htm", ".html", ".xhtml"
                                    With SW
                                        .WriteLine(texte)
                                        .Close()
                                    End With
                                Case ".rtf"
                                    With SW
                                        .WriteLine(textertf)
                                        .Close()
                                    End With
                            End Select
                            Ribbon_Tab.SelectedTab.Text = Path.GetFileNameWithoutExtension(titre)
                        End If
                    End If
                Next
            Catch ex As System.Exception
                MsgBox(LocRM.GetString("strMsgboxError"), MsgBoxStyle.Critical)
            End Try
     
        End Sub
    (je veut etre sur de ne pas me tromper, parce qu'il faut que je recode une grande partie du logiciel :p)
    Merci beaucoup

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    plutot que d'essayer de comprendre ton code, je vais t'expliquer les délégués ^^



    alors un délégué est en fait un genre de pointeur vers une sub



    prenons une sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public sub Save(rtxt as ricthtextbox)
    ' code pour sauvegarder le rtxt donné en paramètre
    end sub
    pour avoir un délégué sur cette sub, il faut déclarer le délégué de la sorte (c'est un genre de variable sur la classe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate sub DelegueSave(rtxt as ricthtextbox)
    le délégué et la sub qu'il va représenter doivent avoir les meme parametres (nombre et types)

    en fait ce "delegate sub" est un type, il faut ensuite instancier le délégué pour avoir une variable, qui pourra etre passé en paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    friend MonDeleguePoursave as new DelegueSave(addressof Save)
    donc ma variable MonDeleguePoursave est un DelegueSave qui pointe vers Save

    vu que c'est une variable on peut la passer en paramètre à une sub
    et cette variable peut appeler la sub de la sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDeleguePoursave.invoke(unrichtextbox)
    et niveau débug, on voit que ca arrive dans la sub Save


    les délégués peuvent aussi servir à faire de l'évènementiel, par exemple tu appelle une sub de traitement long en passant un délégué, et la sub à la fin de son traitement invoke le délégué

    les délégués peuvent aussi servir à changer de thread
    par exemple, un thread autre que le thread principal n'a pas le droit de manipuler un objet graphique (qui est créé par le thread principal)
    (je passe les détails)
    mais la feuille a la possibilité d'invoker un délégué sur son thread
    ce qui donne dans certaines sub des feuilles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if me.invokerequired then 
       me.invoke (le_delegue_qui_pointe_vers_cette_meme_sub_mais_qui_lui_ne_sera_pas_inovkerequired_du_coup)
      exit sub
    end if


    bref revenons à nos moutons
    avec ma méthode, tu auras donc une sub par traitement, et un délégué par sub
    par exemple, la sub Save tu lui mets en parametre le richtextbox sur lequel tu veux sauvegarder

    comme ca tu peux avoir un bouton disquette qui sauvegarde le ricthtexbox selectionné
    et un avec plusieurs disquettes qui sauvegarde tout


    et donc ca donnerais

    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
     
    private delegate sub typeDelegateSave
    private DelegateSave as new typeDelegateSave(adressof save)
     
    Private Sub save(richt as richtextbox)
    'code
    end sub
     
     
    private delegate sub typeDelegateFerme
    private DelegateFerme as new typeDelegateFerme(adressof save)
     
    Private Sub Ferme(richt as richtextbox)
    'code
    end sub

    et tu gardes la sub qui cherche les richtexbox pour faire les invoke
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Merci d' avoir pris le temps de m'expliquer, j'ai a peu pres compris je pense.
    Mais du coup l'utilisation de délégué me rajoute du code non ?
    J'ai tésté un peu, ca fonctionne bien, mais ca complique un peu le code et ca ne m'enleve pas mes boucles, donc je vois pas trop l'interet (dans mon cas en tout cas, ou alors j'ai pas tout compris :p)

    Pour ton exemple avec les disquettes, pas besoin de délégués, il suffit juste d'enregistrer toutes les richtextbox présentes dans la collection que tu cite plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim mesricthtextbox as new system.collections.generic.list(of richtextbox)
    mesricthtextbox.add(untel)
    En tout cas ça m'a permis d'ajouter une option tout sauvegarder

    Du coup avec les délégués ca me donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Delegate Sub typeDelegateSave(ByVal rtb As RichTextBoxPrintCtrl)
        Private DelegateSave As New typeDelegateSave(AddressOf save)
     
        Private Sub save(ByVal rtb As RichTextBoxPrintCtrl)
    ' mon code de sauvegarde
    End Sub
    et quand on clique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub btn_enregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_enregistrer.Click
            For Each rtb As Object In Ribbon_Tab.SelectedTab.Controls
                If TypeOf (rtb) Is RichTextBoxPrintCtrl Then
                    DelegateSave.Invoke(rtb)
                End If
            Next
        End Sub
    Alors qu'avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub save(ByVal rtb As RichTextBoxPrintCtrl)
    For Each rtb As Object In Ribbon_Tab.SelectedTab.Controls
                If TypeOf (rtb) Is RichTextBoxPrintCtrl Then
    ' mon code de sauvegarde
    End If
            Next
    End Sub
    et quand on clique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub btn_enregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_enregistrer.Click
     
    save()
    End Sub
    Merci beaucoup de ton aide

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu avais relu mon premier post
    (relire A qu'on vient de comprendre B permet de comprendre A encore plus ^^)
    tu aurais remis la sub suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public sub Traitement_Sur_Tous_Les_RTB(d as delegate)
      for each rtb as richtextbox in mesrichtextbox
         d.invoke(rtb)
      next
    end sub

    et donc pour sauvegarder tous les rtb tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Traitement_Sur_Tous_Les_RTB (MonDelegateSave)
    et pour fermer tous les rtb tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Traitement_Sur_Tous_Les_RTB (MonDelegateFermer)
    ou encore effacer le texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Traitement_Sur_Tous_Les_RTB (MonDelegateEffacer)
    la boucle est faite dans cette sub et que dans celle là du coup, et c'est elle qui s'occupe d'appeler la sub (qui fait le traitement pour un seul rtb) sur tous les rtb (c'est un peu comme passer un nom de sub en paramètre pour qu'elle soit rappelée)

    ce qui te laisse la possibilité d'appeler directement une sub pour un seul rtb aussi (et là pas la peine d'utiliser le délégué, tu peux appeler la sub directement)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    VS ne me laisse pas mettre (Byval d as delegate), car les mots clef ne peuvent renfermer un type et quand je le remplace par [Delegate] il me dit que invoke n'enfait pas partit.

    Pourrait tu (si ce n'est aps trop demander) me donne run exemple pour appeler un seul rtb ? car une fois dans la collection je ne peut pas savoir quel rtb correspond a quel tabpage.

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faut bien mettre [delegate] ou alors system.delegate

    les exemples de code que je t'ai mis sont tapés ici, donc non testés et approximatifs (bien qu'à peu près bons en général lol)

    donc en effet y a pas invoke mais il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public sub Traitement_Sur_Tous_Les_RTB(d as delegate)
      Dim arguments(0) As Object
      for each rtb as richtextbox in mesrichtextbox
         d.Method.Invoke(Me, arguments)
      next
    end sub
    attention : l'argument Me passé en premier doit etre une instance d'une classe qui comprend la sub désignée par le délégué, j'ai mis Me car y a de forte probabilité que ca soit ca qu'il te faut mais ca dépend de comment t'as architecturé tes classes

    j'ai trouvé d.DynamicInvoke aussi mais je sais pas ce que fait ...


    et donc si tu as une sub Save(rtb as richtextbox)
    et que tu veux l'appeler pour un seul, tu dois bien savoir lequel c'est, non ??
    c'est celui du tab qui est actuellement visible je pense

    enfin après à la place du list of rtb tu peux aussi faire un dictionary of tabpage,rtb
    comme ca pour un tabpage tu obtiens le rtb qu'il y a dessus
    ca renverra dico(selectedtabpagenumero) as rtb donc c'est pratique

    si tu as des questions sur le fonctionnement du system.collections.generic.dictionary, cherche dans msdn ou google, il doit y avoir des explications
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    Points : 27
    Points
    27
    Par défaut
    Oki merci beaucoup, je devrais me debrouiller avec tout ca

    (justement je ne connais pas quel rtb est associé a chaque tab, ils sont créées dynamiquement et n'ont pas de nom qui leur est propre) La methode des dictionary a l'air très interressante, je vais essayer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Optimiser le code VBA (gestion de liste)
    Par BAHIRI dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/03/2011, 01h10
  2. optimiser le code d'une recherche dans une feuille excel
    Par h_adil dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/05/2008, 21h20
  3. Réponses: 6
    Dernier message: 21/06/2005, 15h06
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11
  5. Réponses: 12
    Dernier message: 26/02/2003, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo