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

C# Discussion :

Initialiser plusieurs picturebox dand une boucle


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut Initialiser plusieurs picturebox dand une boucle
    Bonjour à tous,
    je viens ici car j'ai un problème, j'apprends le C# est pour cela j'ai voulu me créer un petit programme pour m'entrainer.
    Dans ce programme j'ai 55 pictureBox dont je doit changer l'image.
    Pour l'instant j'ai 55 lignes comme celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pictureBox1.Load(@".\image\1.png");
    ce qui est tout sauf une bonne façon de faire pour moi...
    je pense qu'avec une boucle on peut régler le problème mais je n'arrive pas a la faire fonctionner cette maudite boucle En gros je voudrais faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i=0; i>55; i++)
                {
                    pictureBox+i.Load(@".\image\i.png");
                 }
    j'en renommé mes images pour que pictureBox1 est a afficher 1.png et ainsi de suite

    J'ai également un autre problème toujours avec des pictureBox :
    je voudrais que lorsque l'on click sur l'image ça ouvre un nouveau form et de passer en paramètre le numéro de mon pictureBox.
    Le passage de paramètre j'y arrive sans soucis c'est de récupérer le numéro du PictureBox qui me pose un problème.Pour l'instant je l'ai codé "en dur" et je trouve que c'est une façon immonde de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
            {
                //on passe le numéro de l'image en paramètre et on ouvre le form
                int i = 1;
                Form form1 = new jeux(i);
                form1.Show();
    je me vois mal faire 55 copy/paste dans mon code...

    Merci d'avance pour l'aide que vous pourrez m'apporter !

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <List>PictureBox pictureBoxes = new <List>PictureBox () ;
    Control parentControl = form1 // ou panel1 ou ...
    for (int i=0;i<=55;i++) 
      pictureBoxes.Add(parentControl["pictureBox"+i.ToString()] ;
    for (int i=0; i>55; i++) pictureBoxes[i].Load(@".\image\i.png");
    Pour les events, fais simplement pointer toutes les pictureBox sur le même event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
    {
    //on passe le numéro de l'image en paramètre et on ouvre le form
    int i = int.Parse((Control)sender).Name.Replace("pictureBox","") ; 
    Form form1 = new jeux(i);
    form1.Show();
    }

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Mais tu va aussi devoir gerer la position de tes PictureBox dans la form

    Le picturebox est lui meme asser gourmand en ressource

    A mon avis une maniere beaucoup plus "propre" et rationelle de gerer cela
    est de definir UN SEUL picturebox et une liste de rectangle que tu utilisera pour faire un Draw des tes images sur ce picturebox

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Hello, tout d'abord merci pour la réponse ultra rapide je suis bluffé !

    pour les events les pictureBox pointer déjà tous vers le même donc j'ai tester ta méthode mais visual studio ne l'aime pas il me sort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Argument 1: impossible de convertir de 'System.Windows.Forms.Control' en 'string'	
    La méthode surchargée correspondant le mieux à 'int.Parse(string)' possède des arguments non valides
    en soulignant int.Parse((Control)sender) je comprends pourquoi y'a une erreur (on lui mets du "code" alors qu"il attend un string non ?) du coup j'ai essayer de le modifier en insérant une variable intermédiaire mais ça marche toujours pas ..

    quand a ton autre code je suis un peu boulet mais je vois pas ou l’insérer... dans le fichier form1.Designer.cs ? Si oui dans InitializeComponent()? ou bien je me plante complètement ?

    j'vais continuer a chercher merci !


    EDIT : je n'avais pas vu ton message olibara sorry ! c'est vrai que mon programme est long a charger les picturesbox (a tel point que je debug avec seulement 10img ) l'idée d'utiliser un seul pictureBox est pas bête et ça me fera apprendre aussi a dessiner des rectangles donc je vais surement modifier mon code une fois que j'arriverais a mes fins

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    quand a ton autre code je suis un peu boulet mais je vois pas ou l’insérer
    Dans form1.cs, juste après InitializeComponents().

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    en soulignant int.Parse((Control)sender) je comprends pourquoi y'a une erreur (on lui mets du "code" alors qu"il attend un string non ?) du coup j'ai essayer de le modifier en insérant une variable intermédiaire mais ça marche toujours pas ..
    Tu naurais pas oublié la propriété "Name" ou fait une rerreur sur le parenthésage ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Si je le mets juste après le InitializeComponents(). il me sort 17 erreurs j'en ai corrigé deux mais les 15 autres j'ai un peu plus de mal...

    par contre j'ai regardé sur un autre post et il initialiser les listes différemment, et si je suis leur exemple en le "mixant" avec le tien je n'obtiens plus que 2 erreurs .
    voila le code "mixé" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                List<PictureBox> pictureBoxes = new List <PictureBox> () ;
                Control parentControl = Fenetre_principal;
                for (int i=0;i<=55;i++) 
                pictureBoxes.Add(parentControl["pictureBox"+i.ToString()]) ;
                for (int i=0; i>55; i++) pictureBoxes[i].Load(@".\image\i.png");
    et les deux erreurs restantes sont :
    Erreur 2 'Lanceur_de_jeux.Fenetre_principal' est un 'type' mais est utilisé comme un 'variable'
    Erreur 3 Impossible d'appliquer l'indexation à l'aide de [] à une expression de type 'System.Windows.Forms.Control'
    ce code me semble plus prometteur mais vu mes talents actuels en C# c'est peut etre mauvais signe

    Pour le parseur je me suis dit que j'avais peut etre mal recopié donc j'ai fait un copy/paste j'ai vérifier les parenthèses et toujours ce même problème...

    En tout cas merci de l'aide apporté !

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    EDIT : je n'avais pas vu ton message olibara sorry ! c'est vrai que mon programme est long a charger les picturesbox (a tel point que je debug avec seulement 10img ) l'idée d'utiliser un seul pictureBox est pas bête et ça me fera apprendre aussi a dessiner des rectangles donc je vais surement modifier mon code une fois que j'arriverais a mes fins
    Je te conseille d'essayer tout de suite !
    Tu verra c'est pas tres sorcier et du coup tu maitrisera mieux un tas de truc beaucoup plus utile

    Pour crer un tableau de rectangle je te laisse faire
    Ensuite tu cree un graphics a partir de l'image ta picturebox

    En gros ca donne +/- ca (a la volée et de tete)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Image ImgPB=new Bitmap(MonPB.Width,MonPB.Height);
    Graphics gr=Graphics.FrommImage(ImgPb);
     
    for (int i=0;i<Rectangles.Count;i++)
    {
      Image I=Image.FromFile(...); // a améliorer
      gr.DrawImage(i,Rectangles[i],I.GetBounds(),....); // a completer
    }
    MonPB.Image=ImgPB;
    Apres il faut gerer le MousMove et le Click dans le PB mais c'est bon a apprendre

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Erreur 2 'Lanceur_de_jeux.Fenetre_principal' est un 'type' mais est utilisé comme un 'variable'
    il faut mettre l'instance du contrôle et pas son type.
    Par exemple si on a : Panel panel1
    ce sera : Control parentControl = panel1 et non Control parentControl = Panel;


    Erreur 3 Impossible d'appliquer l'indexation à l'aide de [] à une expression de type 'System.Windows.Forms.Control'
    Oups ! petite erreur de ma part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pictureBoxes.Add(parentControl.Controls["pictureBox"+i.ToString()])
    Par ailleurs, les conseils d'olibara sont totalement pertinents

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Merci pour les corrections Graffito mais ça marche toujours pas, mais je pense que ça doit venir de mon ICC
    Je verrais demain à tête reposée

    Et puisque vous vous accordez tous les deux pour dire qu'un seul PictureBox c'est mieux que 55 je vais essayer de modifier mon code pour transformer ça.
    par contre c'est possible de gérer le mouse click que sur une partie d'une PictureBox ? cad de gérer différents cas en fonction de l'endroit ou le click est capturé. (En gros faire un quadrillage du picturebox géant pour dissocier les cas sachant que toutes mes images font les mêmes tailles 195x205px)

    En tout cas merci pour votre aide et bonne nuit !

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    (En gros faire un quadrillage du picturebox géant pour dissocier les cas sachant que toutes mes images font les mêmes tailles 195x205px
    Tu va gerer ca avec ta liste de rectangle
    Sur un event MousClick du picturebox tu parcours les rectangles et tu verifie lequel contient le point clické (methode Contains)

Discussions similaires

  1. Récupérer les coordonnées de plusieurs DIV dans une boucle PHP
    Par renaud26 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/11/2009, 10h23
  2. [PHP 5.2] Implementer plusieurs fichiers dans une boucle
    Par Mugette dans le forum Langage
    Réponses: 5
    Dernier message: 17/08/2009, 18h44
  3. initialisation des variable avec une boucle
    Par grospatapouf dans le forum Langage
    Réponses: 10
    Dernier message: 10/01/2009, 12h17
  4. declarer plusieurs JcheckBox dans une boucle
    Par 01211983 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 21/02/2008, 01h47
  5. initialiser les vertex dans une boucle for
    Par StrikerFred dans le forum DirectX
    Réponses: 10
    Dernier message: 26/09/2006, 10h36

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