none
utilisation de FormCollection (ou autre solution) RRS feed

  • Discussion générale

  • Bonjour à tous..!

    J'utilise plusieurs forms et j'ai regroupé les routines communes (affichage, saisie, etc.) dans la 1ère. Pour savoir quels contrôles de ces forms sont concernés par les instruction j'ai imaginé:

    "FormCollection.Item(DtyFrm).dtes(LIG).BackColor = Color.Transparent"

    où DtyFrm (public) est l'item du form concerné et "dtes" la  collection de contrôles mais ça provoque une erreur

    "Une référence à un membre non partagé requiert une référence d'objet."

    Avant cela j'avais essayé avec une collection d'objets "FRM":

    "FRM(DtyFrm).dtes(LIG).BackColor = Color.Transparent"

    mais cela suscitait un avertissement "liaison tardive" que je ne suis pas arrivé à résoudre.

    Un bon coup de main ne serait pas de trop

    Merci d'avance..!

    Cordialement 

    • Modifié FredDorine samedi 7 janvier 2012 09:24 précisions
    • Type modifié Ciprian Duduiala jeudi 12 janvier 2012 09:56 attente de feedback
    vendredi 6 janvier 2012 14:17

Toutes les réponses

  • Bonjour,

    Il est assez difficile de voir clairement votre problème sur 2 ou 3 lignes.

    Je pense que DtyFrm doit-être déclaré en tant que Public Shared !!

    Bien à vous.


    ZGuideTV.NET project Admin/Dev : http://zguidetv.codeplex.com/

    vendredi 6 janvier 2012 19:29
  • Merci mais c'est déjà le cas..!

    samedi 7 janvier 2012 09:06
  • Bonjour,

    Pouvez-vous nous montrer un peu plus de code ? Il est difficile pour nous de comprendre votre problème.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 8 janvier 2012 22:32
    Modérateur
  • Bonjour..!

    L’application « ProAstOr » est destinée à la gestion d’un cabinet d’expert-conseil-indépendant. Elle est organisée autour de cinq feuilles (forms) qui composent le menu principal:

    - ACS : accueil et reconnaissance de l’utilisateur + routines communes

    - ORG : planning et organisation du cabinet – bureau d’ordre

    - PAO : prospection téléphonique assistée

    - EVA : évaluation des risques

    - XPR : expertise et diagnostic

    - MIS : missions ponctuelles

     

    Chacune des feuilles gère ses événements à l’aide de routines locales ou « public ». Les routines « public » (affichage du planning hebdo, affichage des listes etc.) sont regroupées dans le code de la form « ACS ». Les variables sont déclarées « public » dans la form « ACS » lorsqu’elles affectent les routines « public »

     

    Public Class ACS

     

        'boucles For/Next

        'ATTENTION: NE PAS DECLARER

        'ƒ = alt + 159 - Å = alt + 143

     

        'VARIABLES PARTAGÉES

           

        Public ß(23) As Integer

        'VARIABLES LOCALES

        Dim CHN, fdatas, HollyDays, InpTxt, KeyStg, TchStg As String

        Dim ITG, NxtPqs, ChrKey, LenTxt As Integer

        Dim BYT, LIG As Byte

        Dim DBL As Double

        Dim FRM As New Microsoft.VisualBasic.Collection()

     

        'ß(21), ß(22) et ß(23)=VARIABLES AFFECTÉES & RÉSERVÉES: NE PAS ATTRIBUER

       

     

        Public Sub DspPlg() ' PLANNING

            LIG = 0

            DtyDay = 1

            DtsLig = 0

            DebLig = 0

            IstDte = DateAdd(DateInterval.Day, 7 * PlgPrd, DayDte)

            If DtyFrm = 1 Then

                LibTxt(3, 9)

    ORG.plg1.Text = STG + ORG.fle2.Text

            End if

            'lecture de l'horaire de travail

            For Å = 1 To 28 : HreDtv(Å) = CInt(dts.AGD0.Rows(DtyHdt).Item(Å)) : Next

            Do While LIG < 7 'affichage du jour

                PlgDay = Weekday(IstDte, )

                ITG = 1 + ((PlgDay - 1) * 4)

                ß(16) = 0

                Frm(DtyFrm).dtes(LIG).BackColor = Color.Transparent

                LibTxt(3, PlgDay) : FRM(DtyFrm).dtes(LIG).Text = STG & " " & Mid(IstDte.ToString, 1, 5)

                For ƒ = 0 To 57

                    If ƒ + 1 > HreDtv(ITG) - 1 And ƒ + 1 < HreDtv(ITG + 1) + 1 Or ƒ + 1 > HreDtv(ITG + 2) - 1 And     

    ƒ + 1 < HreDtv(ITG + 3) + 1 Then

                        RdvClr(ƒ) = 1 'OnDuty

                    Else

                        If IstDte = DayDte Then RdvClr(ƒ) = 4 Else RdvClr(ƒ) = 0 'OffDuty

                    End If

                    If RdvClr(ƒ) = 1 And ß(4) > 0 Then RdvClr(ƒ) = 3 'mission

                Next

    'extraction de la chaine jours fériés/chômés

                LibTxt(3, 8) : CHN = FRM(DtyFrm).dtes(LIG).text.ToString

                If InStr(STG, Mid(CHN, 5, 5)) > 0 Then 'jour férié/chômé

                    For ƒ = 0 To 57

                        If IstDte = DayDte Then RdvClr(ƒ) = 4 Else RdvClr(ƒ) = 0 'OffDuty

                    Next

                End If

                If ß(4) > 0 Then ß(4) = ß(4) - 1 'ajustement du compteur jours de mission

                Do While DtsLig < IstNbr + 1 'balayage des instances de l'agenda

                    IstJrs = dts.AGD1.Rows(DtsLig).Item(8).ToString

                    IstMth = dts.AGD1.Rows(DtsLig).Item(9).ToString

                    IstYar = dts.AGD1.Rows(DtsLig).Item(10).ToString

                    If Not IstYar = "0000" Then

                        PlgDte = Convert.ToDateTime(IstJrs + "/" + IstMth + "/" + IstYar) : ß(16) = 1 'OnDuty = 0

                    End If

                    If ß(16) = 1 And PlgDte = IstDte Then 'instance à la date de la ligne

                        IstNtr = CInt(dts.AGD1.Rows(DtsLig).Item(2))

                        IstOwr = CInt(dts.AGD1.Rows(DtsLig).Item(1))

                        IstLst = CInt(dts.AGD1.Rows(DtsLig).Item(7))

                        If IstNtr > 4 And IstOwr = PlgOwr Then ß(16) = 1 'IstNtr > 4 + DtyMbr = IstOwr

                        If IstNtr > 4 And IstLst > 0 And Not IstOwr = PlgOwr Then

                            'IstNtr > 4 + IstLst>0 + Not DtyMbr = IstOwr

                            For ƒ = 0 To LstNbr 'recherche DtyMbr dans les participants

                                If dts.AGD2.Rows(ƒ).Item(1) Is dts.AGD1.Rows(DtsLig).Item(0) Then

                                    If CInt(dts.AGD2.Rows(ƒ).Item(2)) = PlgOwr Then ß(16) = 1 : Exit For 'participant = membre

                                End If

                            Next

                        End If

                        If ß(16) = 1 Then 'instance à afficher sur le planning

                            ß(4) = CInt(dts.AGD1.Rows(DtsLig).Item(13))

                            DBL = CInt(dts.AGD1.Rows(DtsLig).Item(17)) / 15 : ITG = CInt(DBL)

                            ß(17) = (CInt(dts.AGD1.Rows(DtsLig).Item(16)) * 4) + ITG 'durée du trajet

                            DBL = CInt(dts.AGD1.Rows(DtsLig).Item(12)) / 15 : ITG = CInt(DBL)

                            ß(18) = 2 + (CInt(dts.AGD1.Rows(DtsLig).Item(11)) - 6) * 4 + ITG 'heure du rdv

                            DBL = (CInt(dts.AGD1.Rows(DtsLig).Item(15)) / 15) - 1 : ITG = CInt(DBL)

                            ß(19) = (CInt(dts.AGD1.Rows(DtsLig).Item(14)) * 4) + ITG 'durée du rdv

                            If ß(17) > 0 And Not ß(4) > 0 Then

      For ƒ = ß(18) - ß(17) To ß(18) – 1

                                  RdvClr(ƒ - 1) = 2  

      Next 'trajet aller

                            If ß(4) > 0 Then 'mission

                                For Å = ß(18) To HreDtv(ITG + 3)

                                    If Å > HreDtv(ITG) - 1 And Å < HreDtv(ITG + 1) + 1 Or Å > HreDtv(ITG + 2) - 1 And Å < HreDtv(ITG + 3) + 1 Then

                                        RdvClr(Å - 1) = 3

                                    End If

                                Next

                                ß(4) = ß(4) - 1

                            Else

                                For ƒ = ß(18) To ß(18) + ß(19) : RdvClr(ƒ - 1) = 3 : Next

                            End If

                            If ß(17) > 0 And Not ß(4) > 0 Then For ƒ = ß(18) + ß(19) + 1 To ß(18) + ß(19) + ß(17) : RdvClr(ƒ - 1) = 2 : Next 'trajet retour

                        End If

                    End If

                    DtsLig = DtsLig + 1 : ß(16) = 0

                Loop

                For ƒ = 0 To 57

                    ß(20) = ƒ + (58 * LIG)

                    Select Case RdvClr(ƒ)

                        Case 0 : FRM(DtyFrm).rdvs(ß(20)).BorderColor = Color.PowderBlue

                        Case 1 : FRM(DtyFrm).rdvs(ß(20)).BorderColor = Color.LightPink

                        Case 2 : FRM(DtyFrm).rdvs(ß(20)).BorderColor = Color.Yellow

                        Case 3 : FRM(DtyFrm).rdvs(ß(20)).BorderColor = Color.DarkRed

                        Case 4 : FRM(DtyFrm).rdvs(ß(20)).BorderColor = Color.Aquamarine

                    End Select

                Next

                IstDte = DateAdd(DateInterval.Day, 1, IstDte) : DtsLig = 0 : LIG = LIG + CByte(1)

            Loop

        End Sub

     

    Les noms de variables sont des abreviations/contractions de l’anglais (quelquefois mélangé de français)

     

    Tous les codes surlignés provoquent un avertissement « liaison tardive » que je voudrais d’autant plus résoudre qu’il y en a plus d’une centaine et qu’ils ralentissent le programme…

    Cela vous convient-il ?

    Merci d'avance pour vos conseils, cordialement

    vendredi 13 janvier 2012 15:11
  • Bonjour,

    Que cherchez vous à faire ? Accéder à la fenêtre "DtyFrm" ? Si oui essayez ceci :

    DtyFrm.rdvs(B(20)).BorderColor = ...
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    vendredi 13 janvier 2012 21:31
    Modérateur
  • Bonjour et merci de votre interet pour mon problème... mais ce n'est pas tout à fait cela.

    DtyFrm est l'intex d'une collection FRM et rdvs(ß(20) est une ligne qui matérialise une période de temps (15mn) sur le planning. Tel qu'il est écrit, le code fonctionne bien mais provoque un avertissement "liaison tardive" donc est susceptible de provoquer des erreurs à l'execution et dans tout les cas ralentit le programme.

    Comme toutes les routines partagées (affichage, gestion de liste, gestion d'options et autres menus...) utilisent la mème formulation, le nombre d'avertissements est considérable.

    Ce que je cherche c'est à formuler ce type d'instruction sans provoquer la "liaison tardive".

    A la place de la collection FRM j'ai essayé (sans succès):

       - dim FRM as list(of form)

       - dim FRM(5) as object

    J'espère que ces précisions vous éclairerons.

    Cordialement

    samedi 14 janvier 2012 07:31
  • Bonjour,

    Ou faire plutôt un projet vierge avec juste le code minimal qui permet de montrer directement votre problème.

    Je crois comprendre que l'on cherche à faire un même traitement sur plusieurs formulaire mais :
    - si la collection est "objet", on est obligé de faire du "late binding"
    - si on utilise Form, les contrôles ne sont pas vus car pas exposés par ce type

    Dans ce cas, on peut déclarer explicitement des fonctions communes via interface ou héritage ce qui permettra de les traiter via ce type.

    Cela me parait aussi curieux de manipuler plusieurs formulaires de l'extérieur. Ces manip ne devrait-elle pas être prise en charge par un contrôle utilisateur Agenda ?

    Concrètement je pense à qq chose comme une interface IAgenda :

    Interface IAgenda
        Sub SetColor(ByVal c As Color)
    End Interface
    

    Dans les formulaires voulus on implémente cette interface :

    Public Class Form2
        Implements IAgenda
        Public Sub SetColor(c As System.Drawing.Color) Implements IAgenda.SetColor
            Button1.ForeColor = c
        End Sub
    etc...
    

    On traite les formulaires ouverts concernés :

            For Each f In My.Application.OpenForms
                If TypeOf f Is IAgenda Then CType(f, IAgenda).SetColor(Color.Red)
            Next
    
    

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 14 janvier 2012 10:22
    Modérateur