1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

AIDE Classe .NET ReadOnlyCollection

Discussion dans 'Windev' créé par Pascal, Mar 16, 2021.

  1. Pascal

    Pascal Active Member
    MEMBRE WX

    Inscrit:
    Fev 11, 2018
    Messages:
    82
    J'aime reçus:
    126
    Bonjour tout le monde,

    J'aurais besoin d'aide car là je sèche sur la déclaration de la classe .NET ReadOnlyCollection en windev.
    Voici le code C# que je souhaiterais convertir en windev :

    Code (Text):
    using System;
    using System.Globalization;
    using System.IO;
    using System.Collections.ObjectModel;

    public class Example
    {
       public static void Main()
       {
          ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
     
          foreach (TimeZoneInfo timeZone in timeZones)
          {
         
          }
        }
    }
    Si quelqu'un à une idée ?

    Merci d'avance.
    Cordialement.
    Pascal

    PS :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
    Tags:
  2. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    554
    J'aime reçus:
    305
    Bonjour,
    Pourquoi ne pas utiliser l'option C# de windev ?

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
    Pascal apprécie ceci.
  3. Pascal

    Pascal Active Member
    MEMBRE WX

    Inscrit:
    Fev 11, 2018
    Messages:
    82
    J'aime reçus:
    126
    Bonjour et merci

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Bonne idée mais il faut déjà au minimum windev 23.
    Ce serait comme même dommage qu'avec windev, on ne puisse pas déclarer une classe .NET pour récupérer une collection d'objets.

    Je retiens ta solution si personne n'a une autre idée.

    Cordialement,
    Pascal
     
  4. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    554
    J'aime reçus:
    305
    Déjà, tu n'as pas précisé la version de windev que tu utilisais j'ai donc supposé que c'étais la 26.
    Ensuite, as tu importé la description de l'assemblage que tu désires utiliser, comme précisé dans la doc ?

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
  5. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,885
    J'aime reçus:
    1,533
    Peut être que je me trompé car je ne suis pas très bon en .net
    Mais si tu fais
    Clic Droit sur Assemblages .Net > Utiliser un assemblage .Net dans le Projet

    Dans la fenêtre qui apparait
    Est ce que tu as
    Un objet .net qui ne peut pas te servir
    Voir

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    Et

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

     
  6. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,885
    J'aime reçus:
    1,533

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    a répondu en même temps que moi
     
  7. Pascal

    Pascal Active Member
    MEMBRE WX

    Inscrit:
    Fev 11, 2018
    Messages:
    82
    J'aime reçus:
    126
    Bonjour,

    Merci pour votre aide.
    Oui j'ai bien importé l'assemblage .NET dans mon projet.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Mon problème c'est que je ne comprends pas comment instancier ce type de classe dans windev.

    Cordialement,
    Pascal
     
  8. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    554
    J'aime reçus:
    305
    Une fois importé, l'assemblage se comporte comme une classe "classique"
    Code (Windev):
    MonInstance est ReadOnlyCollection<T>
    Par contre les '<' '>' risquent peut être de poser problème
     
  9. Pascal

    Pascal Active Member
    MEMBRE WX

    Inscrit:
    Fev 11, 2018
    Messages:
    82
    J'aime reçus:
    126
    Désolé mais non ce type de classe ne se comporte pas comme une classe "classique". Quand on essai de faire ce type déclaration, l'auto complétion de windev ne la propose même pas.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    C'est pour cela que je pose la question, si quelqu'un a déjà instancier ce type de classe dans windev ?

    Cordialement,
    Pascal
     
  10. cyberripper

    cyberripper Active Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 26, 2018
    Messages:
    76
    J'aime reçus:
    176
    Bonjour

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Avec windev, tu ne peux pas instancier des classes .NET génériques directement. Par contre, il faut les instancier indirectement.

    Pour faire une instanciation indirecte dans windev :

    Tu crées un fichier texte vide "MyClass.cs" par exemple et tu copies le code ci-dessous dedans.

    Code (Text):
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;

    namespace WD
    {
        public class MyTimeZoneInfo : ReadOnlyCollection<TimeZoneInfo>
        {
            public MyTimeZoneInfo(IList<TimeZoneInfo> timeZones)
            :base(timeZones)
            {
            }
        }
    }
    Ensuite tu ouvres une fenetre DOS à l'emplacement de ton fichier et tu le compiles pour obtenir une bibliothèque avec cette commande :

    "C:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /target:library /out:"MyClass.dll" MyClass.cs

    Après dans windev, tu importes la bibliothèque crée "MyClass.dll" comme nouvel assemblage DOTNET. Il faut aussi conserver les autres assemblages utilisés (mscorlib, etc..) et tu instancies ta nouvelle classe. Comme ta nouvelle classe hérite de la classe ReadOnlyCollection<TimeZoneInfo>, elle se comportera à l'identique.

    Code (Text):
    pclTimezone est un MyTimeZoneInfo dynamique
    pclTimezone = allouer un MyTimeZoneInfo(TimeZoneInfo.GetSystemTimeZones())
    Trace(pclTimezone.Count)
    @+ Cyber
     
  11. cyberripper

    cyberripper Active Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 26, 2018
    Messages:
    76
    J'aime reçus:
    176
    Petit oubli de ma part.
    Avec cette methode, tu peux aussi maintenant directement instancier une classe "ReadOnlyCollection<TimeZoneInfo>" dans windev sans utiliser ta nouvelle classe.

    Code (Text):
    clMyClass est un "ReadOnlyCollection<TimeZoneInfo>"(TimeZoneInfo.GetSystemTimeZones())
    Trace(clMyClass.Count)
    @+ Cyber
     
    mma77 et Pascal aiment ça.
  12. Pascal

    Pascal Active Member
    MEMBRE WX

    Inscrit:
    Fev 11, 2018
    Messages:
    82
    J'aime reçus:
    126
    Bonjour et merci

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    J'ai testé ta solution et elle fonctionne très bien :openedeyewink:. Je n'aurai jamais trouvé cette technique pour instancier des classes génériques de type <T>.
    J'ai créé la DLL avec ton code et je l'ai importé comme assemblage .NET avec mscorlib et maintenant je peux instancier la classe ReadOnlyCollection<TimeZoneInfo> et parcourir tous les objets TimeZoneInfo.
    Code (Text):
    clMyClass est un "ReadOnlyCollection<TimeZoneInfo>"(TimeZoneInfo.GetSystemTimeZones())
    POUR TOUT i DE clMyClass
        Trace(i.ID)
    FIN
    Pour info j'ai aussi testé la solution de

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    d'écrire directement du code C# dans windev sans succès :cryingface:.
    J'ai créé une nouvelle collection de procédures globales avec une seule procédure globale de type C# avec le code suivant :
    Code (Text):
    using System;
    using System.Collections.ObjectModel;

    public static void TestCSharp()
    {
        ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
       
        foreach (TimeZoneInfo timeZone in timeZones)
        {
       
        }
    }
    mais windev refuse de la compiler et j'ai les messages d'erreurs suivants :
    Erreur : error CS0246: The type or namespace name 'TimeZoneInfo' could not be found (are you missing a using directive or an assembly reference?)
    COL_ProcéduresGlobales2.TestCSharp, Procédure locale, ligne 3, colonne 21
    Erreur : error CS0103: The name 'TimeZoneInfo' does not exist in the current context
    COL_ProcéduresGlobales2.TestCSharp, Procédure locale, ligne 3, colonne 47
    Erreur : error CS0246: The type or namespace name 'TimeZoneInfo' could not be found (are you missing a using directive or an assembly reference?)
    COL_ProcéduresGlobales2.TestCSharp, Procédure locale, ligne 5, colonne 11


    Je ne comprends pas pourquoi car j'ai bien déclaré les assemblages avec "using".

    Merci encore pour votre aide à tous et encore merci à toi Cyberripper pour ta solution.

    Cordialement,
    Pascal
     
    cyberripper apprécie ceci.
  13. mma77

    mma77 New Member

    Inscrit:
    Mar 5, 2021
    Messages:
    10
    J'aime reçus:
    24
    Bonjour Pascal

    Je pense que ces erreurs sont liées au framework .NET utilisé par windev pour compiler ton code C#.
    Quand tu écris du code C#, windev génère un répertoire .NET dans ton projet. Dans ce répertoire, tu retrouves le fichier .cs avec le code C# écrit dans windev et un fichier Compile.bat.
    Dans ce fichier .BAT, windev doit utiliser le compilateur csc en version 2.0.50727 (Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.8922) au lieu du compilateur csc version 4.0.30319 (Microsoft (R) Visual C# Compiler version 4.6.1586.0 for C# 5) pour générer la DLL. Et quand tu compiles ton projet windev, le code C# est aussi compilé avec csc et les erreurs sont remontées dans windev.

    Il faudrait pouvoir dire à windev quelle version du compilateur C# à utiliser mais je sais pas si c'est possible ou si une option existe.

    Au plaisir.
    mma77
     
    #13 mma77, Mar 19, 2021
    Dernière édition: Mar 19, 2021

Partager cette page

Chargement...