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!
Bonjour, Pourquoi ne pas utiliser l'option C# de windev ? Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
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
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!
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!
Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens! a répondu en même temps que moi
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
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
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
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
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
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 . 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 . 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
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