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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    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 émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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 émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 42
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    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

+ 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