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

Windows Forms Discussion :

Tableau de string : path files [Débutant]


Sujet :

Windows Forms

  1. #21
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Alors pour aller chercher le chemin de l'image de la ligne 0 par exemple avec la classe News.cs je faisais de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.PicturePaths[0];
    Mais cette méthode ne fonctionne pas si je mets ta fonction dans mon MainForm.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = MainForm.GetImages[0];
    "Impossible d'appliquer l'indexation à l'aide de [] à une expression de type 'groupes de méthodes'


    De plus je dois mettre en public static
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static List<String> GetImages(String path)
    Pour qu'il me propose le .GetImages dans ma deuxième Form mais pourtant j'ai quand même l'erreur "Impossible d'appliquer l'indexation à l'aide de [] à une expression de type 'groupes de méthodes'

    De plus j'aimerais passer le count de ta liste dans une autre private void de ma Main Form mais je n'y arrive pas.

    (Pour info j'ai mis ta fonction dans ma MainForm.cs) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     public static List<String> GetImages(String path)
            {
                List<FileInfo> lst = new List<FileInfo>();
                Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
                         .Where(f =>
                                f.ToLower().EndsWith(".jpg") ||
                                f.ToLower().EndsWith(".png") ||
                                f.ToLower().EndsWith(".bmp")
                               )
                         .ToList()
                         .ForEach(f => lst.Add(new FileInfo(f)));
     
                return lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
            }

  2. #22
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Forcément, ma fonction attend un chemin pour aller chercher tes images.
    Tu as un problème de conception. Tu avais une classe News qui devait contenir les chemins des tes images. Dans cette classe, tu places la fonction qui permet de construire la liste des images de ton répertoire . Ensuite tu peux faire une méthode qui te permettra d'aller chercher une image via un index.
    Par exemple :
    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
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
     
    class News
    {
        public News(String path)
        {
            ImgFileName = BuildImages(path);
        }
     
        public int GetCount()
        {
            return ImgFileName.Count;
        }
     
        public String GetImgFileName(int index)
        {
            if (index < ImgFileName.Count)
                return ImgFileName.ElementAt(index);
            return String.Empty;
        }
     
        private List<String> ImgFileName = new List<String>();
        private List<String> BuildImageList(String path)
        {
            List<FileInfo> lst = new List<FileInfo>();
            Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
                     .Where(f =>
                            f.ToLower().EndsWith(".jpg") ||
                            f.ToLower().EndsWith(".png") ||
                            f.ToLower().EndsWith(".bmp")
                           )
                     .ToList()
                     .ForEach(f => lst.Add(new FileInfo(f)));
     
            return lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
        }
    }
    BuildImageList : Construit la liste des images,
    GetCount : retourne le nombre de fichiers image,
    GetImgFileName(int index) : retourne le chemin de l'image en fonction d'un index (commence à zéro)

    C'est fait rapidement, sans test et sans gestion d'erreurs mais l'esprit est là je pense.

  3. #23
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Alors ça marche ma fenêtre s'ouvre bien avec les images cependant un problème elles ne sont pas triées pour autant

    J'appelle comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.GetImgFileName(0);

  4. #24
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Re,

    le code de ebastien fonctionne comme une classe "normale", à instancier. Il y a donc quelques modifications à apporter pour avoir le même comportement que précédemment. Aussi, n'oublie pas de déclarer ta classe dans le même espace de nom que le reste du programme, et publique.
    Plus je connais de langages, plus j'aime le C.

  5. #25
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    Re,

    le code de ebastien fonctionne comme une classe "normale", à instancier. Il y a donc quelques modifications à apporter pour avoir le même comportement que précédemment. Aussi, n'oublie pas de déclarer ta classe dans le même espace de nom que le reste du programme, et publique.
    Ok merci mais quoi à modifier et comment la déclarer .. et le même espace de nom ?

    je suis débutant et c'est pas facile, je sais même pas quoi chercher sur internet pour m'aider

  6. #26
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    * espace de nom = namespace (elle était facile celle-là )

    * déclarer la classe publique = coller le mot-clé public devant la définition de ta classe.
    Ça veut dire qu'elle sera visible par tout code dans le même espace de nom, ou utilisant (using) cet espace de nom.

    * classe, attributs et méthodes statiques : pour comprendre ce concept en .NET je te conseille de lire un peu de doc
    C'est pas très compliqué à comprendre mais assez long à expliquer, en gros :
    Les attributs et méthodes statiques ne sont pas spécifiques à une instance de ta classe, mais communs à toutes.
    Si ta classe ne déclare que des membres statiques alors elle peut-être déclarée elle-même statique.
    Du coup tu ne pourras même pas instancier un objet de ce type.
    Au niveau du code ça consiste à coller un static devant les classes/membres que tu veux statiques.
    Plus je connais de langages, plus j'aime le C.

  7. #27
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Salut

    merci c'est exactement ce que j'ai fait :

    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
    public class News {
     
            public News(String path)
            {
                ImgFileName = BuildImageList(path);
            }
     
            public static int GetCount()
            {
                return ImgFileName.Count;
            }
     
            public static String GetImgFileName(int index)
            {
                if (index < ImgFileName.Count)
                    return ImgFileName.ElementAt(index);
                return String.Empty;
            }
     
            public static List<String> ImgFileName = new List<String>();
            public static List<String> BuildImageList(String path)
            {
                List<FileInfo> lst = new List<FileInfo>();
                Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
                         .Where(f =>
                                f.ToLower().EndsWith(".jpg") ||
                                f.ToLower().EndsWith(".png") ||
                                f.ToLower().EndsWith(".bmp")
                               )
                         .ToList()
                         .ForEach(f => lst.Add(new FileInfo(f)));
     
                return lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
            }
    }
    Tout ça était déjà juste et déjà fait

    Je fais donc ça dans le MainForm pour utiliser sa fonction comme la tienne et pour trouver les fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    News.BuildImageList(strPath);
    Cependant dans mon autre form Form21News je balance ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.GetImgFileName(1);
    Mais le PictureBox reste vide ?

    Je m'excuse c'est pas faute d'essayer je teste toutes les solutions possible, peut-être que c'est pas mon truc..

  8. #28
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Effectivement, je suis allé un peu vite, je n'avais pas vu que tu voulais travailler avec une classe static. Dans la classe que je t'ai fournie, la méthode BuildImageList retourne la liste des fichiers image.
    Donc si tu appelles directement cette méthode depuis ta form, la liste ne sera pas stockée au niveau de la classe News. C'est pourquoi j'appelais cette méthode dans le constructeur qui permettait de stocker cette liste dans une List<String>.
    Ce que je peux te conseiller, c'est : D'une part de comprendre le code (!!!) et de débugger en mettant des points d'arrêt dans le code ce qui te permettra de comprendre ce qui ce passe. D'autre part tu peux créér une méthode static Initialize() par exemple qui remplacera le constructeur (un constructeur c'est la méthode appelée lorsque tu crées une instance de la classe avec le mot clé New). Cette méthode Initialize appellera la méthode BuildImageList et stockera le resultat dans la List<String>. Par la suite, lorsque tu appelleras getImageFileName(...), la méthode retouvera l'image dans la liste qu'il aura stockée.
    Comme l'écrivait très justement jopopmk, n'hésite pas à lire un peu de doc pour comprendre la notion d'objet et la différence entre une classe static et une instance de classe.

  9. #29
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Ok désolé mais concrètement je ne sais pas comment faire

    Peux-tu me donner un lien de doc pour initialize que je puisse comprendre au moins

    merci beaucoup et désolé..

  10. #30
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Pas de problème. En fait, dans mon idée, Initialize() serait une méthode à toi, mais bon, on va simplifier. On va dire que BuildImageList() ne retourne rien et construit la liste interne. Tu l'appelles une fois pour initialiser la liste. J'ai refais la classe en static pour simplifier ta compréhension et renommer un ou deux trucs :
    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
     
    public static class News
    {
     
        public static int GetCount()
        {
            return ImgFilesPath.Count;
        }
     
        public static String GetImgFileName(int index)
        {
            if (index < ImgFilesPath.Count)
                return ImgFilesPath.ElementAt(index);
            return String.Empty;
        }
     
     
        private static List<String> ImgFilesPath = new List<String>();
     
        public static void  BuildImageList(String path)
        {
            List<FileInfo> lst = new List<FileInfo>();
            Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
                     .Where(f =>
                            f.ToLower().EndsWith(".jpg") ||
                            f.ToLower().EndsWith(".png") ||
                            f.ToLower().EndsWith(".bmp")
                           )
                     .ToList()
                     .ForEach(f => lst.Add(new FileInfo(f)));
     
            ImgFilesPath = lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
        }
    }
    Maintenant, la classe static fonctionne ici car tu n'as besoin que d'une recherche dans un répertoire. Imagine maintenant que tu aies 3 Form qui utilisent chacune cette classe mais avec un dossier de recherche différent . La solution serait alors de transformer cette classe en non static et de créer 3 instances de News différentes. Chacune des instances pourrait alors avoir sa propre liste de fichiers image. A méditer..

  11. #31
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je propose cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            public static string[] GetFilesExts(string path, string[] exts, SearchOption so)
            {
                return System.IO.Directory.GetFiles(path, "*.*", so).Where(a => exts.Contains(Path.GetExtension(a), StringComparer.InvariantCultureIgnoreCase)).ToArray();
            }
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string[] lst = GetFilesExts(@"C:\Dossier", new string[] { ".Txt", ".exe" }, SearchOption.AllDirectories);

  12. #32
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    J'ai réussi, merci à tous pour votre aide

  13. #33
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Bonjour

    Je me suis donc rendu compte d'un bug. Je recherche les images comme-ci dans la classe :

    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
    class News {
     
            public static List<string> PicturePaths = new List<string>();
            public static int iNbFiles;
     
            public static string strPath = ReadIni.ReadValue("General", "Path", ReadIni.strPathIni);
     
            public static void SearchPictures(string parentFolder)
            {
                iNbFiles = 0;
                List<FileInfo> lst = new List<FileInfo>();
     
                News.PicturePaths.Clear();
     
                Directory.GetFiles(parentFolder, "*.*", SearchOption.AllDirectories)
                         .Where(f =>
                                f.ToLower().EndsWith(".jpg") ||
                                f.ToLower().EndsWith(".png") ||
                                f.ToLower().EndsWith(".bmp")
                               )
                         .ToList()
                         .ForEach(f => lst.Add(new FileInfo(f)));
     
     
                PicturePaths = lst.OrderByDescending(f => f.LastWriteTime).Select(f => f.Name).ToList();
                iNbFiles = lst.Count();
            }
        }
    Que je lance de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    News.SearchPictures(strPath);
    Je prends donc toutes les images que je trouve dans mon répertoire et sous-répertoire strPath, je prends les noms et je les trie par date d'écriture dans la classe ci-dessus.

    Le problème c'est que je me retrouve avec les noms des images mais pour les afficher, galère du coup !

    Alors j'ai fait de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.strPath + @"\" + News.PicturePaths[0];
    Ça a bien fonctionné tant que toutes les images étaient seulement à la racine du répertoire strPath, mais dès que j'ai créé des sous-dossiers, et ben je me suis rendu compte du bug !

    Il me met strPath devant le fichier de l'image, mais celui-ci manque une partie (le sous-répertoire), donc n'affiche rien

    Comment faire ?

  14. #34
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    J'ai résolu en modifiant ceci , f.Name en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImgFilesPath = lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
    f.FullName

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImgFilesPath = lst.OrderBy(f => f.CreationTime).Select(f => f.Name).ToList();
    Et en ne l'utilisant plus comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.strPath + @"\" + News.PicturePaths[0];
    Mais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pbxL1C1.ImageLocation = News.PicturePaths[0];

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. conversion d'un tableau de string en tableau de file
    Par sroux dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 01/12/2006, 11h19
  2. [J2SE] tableau de string
    Par Jules82 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 17/03/2005, 14h35
  3. Ranger un tableau de String dans ma HashMap
    Par jeyce dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 26/08/2004, 22h41
  4. [Collections] Conversion de Vector en tableau de String
    Par java_math dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/06/2004, 12h55
  5. [Collections] Tableau de String
    Par gexti dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/06/2004, 15h42

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