Création dynamique d'un composant

Signaler
Messages postés
8
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
18 mai 2006
-
Messages postés
61
Date d'inscription
vendredi 19 janvier 2007
Statut
Membre
Dernière intervention
29 juin 2008
-
Bonjour,

j'ai un boutton qui me permet créer des PictureBox dynamiquement avec un certain BackgroundImage dont j'ai besoin plus tard.

Le problème est le suivant, au moment de récupérer le contenu du BackgroundImage de ma PictureBox créé dynamiquement, le message suivant apparait:

La référence d'objet n'est pas définie à une instance d'objet.

Voici mon code:

public class WinForm : System.Windows.Forms.Form
{
public PictureBox aa;
...
private System.ComponentModel.IContainer components;
...

private void btn_ajout_tampon_Click(object sender, System.EventArgs e)
{
string nom_tampon = "pbx_";


nom_tampon = nom_tampon + nom_pbx.ToString();
nom_pbx = nom_pbx + 1;


//Création d'une PictureBox
aa = new PictureBox();


//Configuration de la pbx_?
aa.Location = p_tampon;
aa.Size = new Size(25,25);
aa.BackColor = Color.Transparent;


aa.BackgroundImage = Image.FromFile("E:\\Programmation\\PREPARATION_TIP\\programme\\image\\croix.bmp");
aa.BorderStyle = BorderStyle.FixedSingle;
aa.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pbx_source_MouseDown);


//Bon nom pour la pbx_?
aa.Name = nom_tampon;


components.Add(aa);
}
}

C'est au moment de récupérer le BackgroundImagede ma pbx_? créé dynamique que l'erreur se produit:

string s = "pbx_?";
Bitmap im;

im = new Bitmap(((System.Drawing.Image)(resources.GetObject(s))));

Je ne sais pas comment ajouter ma pbx_? dans le containeur components

11 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, tu dois ajouter le contrôle à la collection de contrôles de la forme :

// Pas comme ça..
<STRIKE>components.Add(aa);</STRIKE>

// .. mais comme ça
this.Controls.Add( aa );
Messages postés
8
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
18 mai 2006

Merci pour ta réponse rapide MAIS cela ne marche toujours pas...

Toujours le même message d'erreur comme quoi la référence de mon objet n'est pas définie à une instance d'objet.

J'ai rajouté un événement à mon pbx_? pour savoir si elles ont le nom que je veux

aa.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pbx_source_MouseMove);

private void pbx_source_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
MessageBox.Show(((PictureBox)sender).Name);
}

Elles ont le bon nom. L'erreur se situe toujours à la ligne suivante:

im = new Bitmap(((System.Drawing.Image)(resources.GetObject(s))));

En mode pas par pas, ma variable s vaut bien pbx_?

AU SECOURS :)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Tu es en .NET 1.1 ?

Rajoute le nom de ton namespace devant :

string s = MyNamespace.NomDeMaRessource.

Tu vas peut être avoir un problème aussi avec la couleur transparente..
Messages postés
8
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
18 mai 2006

Oui, je suis en .NET 1.1

Je ne suis pas sur d'avoir bien comprit ta réponse...

Je reprends:

s = pbx_? + ".BackgroundImage";

im = new Bitmap(((System.Drawing.Image)(resources.GetObject(s))));

Le but étant d'avoir pbx_?.BackgroundImage dans s pour ensuite récupérer l'image contenu dans le BackgroundImage de cette pbx_? créée dynamiquement.

J'ai essayé de faire ce que tu m'as dit càd:
s Programme.WinForm.tab_info[0] + ".BackgroundImage"; //tab_info[0] pbx_?

Maintenant, l'erreur est la suivante:
Une référence d'objet est requise pour la propriété, méthode ou champ non static 'Programme.Winform.tab_info'

Je ne pense pas que le problème vienne de ma pbx_?.BackColor = Color.Transparent; car en mettant une autre couleur cela ne change rien.

Le problème pourrait peut être venir de la variables ressources

System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(WinForm));

Cette ligne de code se trouve à 2 endroits: dans mon événement btn_ajout_tampon_Click et dans private void InitializeComponent()

Est-ce possible ? Si je la supprime dans mon événement btn_ajout_tampon l'erreur est la suivante:

Le type ou le nom d'espace de noms 'ressources' est introuvable (une directive using ou une référence est-elle manquante ?)

Merci pour ton éventuelle réponse rapide
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Me souviens plus en .NET 1.1 , ce qui est sûr c'est que VS nomme les ressources d'une manière particulière, avec le nom de l'assembly ou de l'espace de nom, utlises >Reflector< pour voir le nom de tes ressources..
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Ca donne quelque chose comme ça :

ResourceManager rm = new ResourceManager("NomDuNamespace.NomDuFichierDeRessource", typeof( NonDeLaClasse ).Assembly );
Bitmap bmp = ( Bitmap )rm.GetObject( "NomDeLaRessource" );
Messages postés
8
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
18 mai 2006

Oulala, on commence à faire dans le compliqué...

Je reprends, le trucs c'est que mes pbx_? sont créées dynamiquement dans un TabPage... Détail qui me paraissait négligeable mais qui ne l'est pas :)

Voilà ce que j'ai fait: comme mes pbx_? sont créées dynamiquement, il faut les traiter de façon dynamique et cela donne ca:

s = tab_info[0] //s <-- pbx_?

//Parcourt tous les onglets de tab_control
foreach (object p in tab_control.Controls)
{
TabPage tbp = (TabPage)p;
//Parcourt toutes les pbx_? créées dynamiquement dans ce TabPage
foreach (object o in tbp.Controls)
{
PictureBox pbx = (PictureBox)o;

//Si je trouve la pbx_? dont j'ai besoin, je récupère sont .BackgroundImage pour ensuite faire un Graphics.DrawImage(im,etc...)
if (pbx.Name == s)
{
s = s + ".BackgroundImage";
im = (Bitmap)rm.GetObject(s);
}
}
}

J'ai déclaré ma variable rm de cette façcon:
ResourceManager rm = new ResourceManager("Programme.resources",typeof(WinForm).Assembly);

namespace: Programme
public class WinForm : System.Windows.Forms.Form

J'ai un erreur de barbare du style:

'Un nom de base ResourceManager ne doit pas terminer par .resources. Il doit être identique à MyResources, que ResourceManager peut transformer en MyResources.<culture>.resources ; par exemple, MyResources.en-US.resources.

Qu'est-ce que je doi mettre comme NomDuFichierDeRessource ? .resources ?
Qu'est-ce que je dois mettre comme NomDeLaRessource ? pbx_?.BackgroundImage ?

AU SECOURS
Messages postés
8
Date d'inscription
lundi 30 janvier 2006
Statut
Membre
Dernière intervention
18 mai 2006

J'AI REUSSI !!!

Sans entrer dans les détails, j'ai utilisé un ArrayList :)

Merci pour tes réponses
Messages postés
61
Date d'inscription
vendredi 19 janvier 2007
Statut
Membre
Dernière intervention
29 juin 2008

Tant qu'on est dans la création de PictureBox dynamique, je voudrai savoir comment créer un évènement du genre: un clique change le BackColor de la PictureBox.
Voici mon code:
PictureBox

unePictureBox =
new
PictureBox();unePictureBox.Location =

new
Point(280, 32);unePictureBox.Size =

new
Size(123,123);unePictureBox.BackColor =

Color.White;
unePictureBox.Name =

"kiki";

this.Controls.Add(unePictureBox);
Je crois que c'est un truc comme ça:
unePictureBox.BackColor = ..........Et là je connais pas le code.
Si quelqu'un a une idée n'hésitez pas ça va beaucoup m'aider pour le logiciel du siècle lol.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, ce thread date de Mai 2006..

Un clique oui.. mais où ça, sur un bouton ou dans la PictureBox elle même ?

PictureBox pb = new PictureBox( );
pb.Parent = this;
pb.Location = new Point( 0, 0 );
pb.Size = new Size( 250, 250 );
pb.BackColor = Color.Blue;pb.Click +delegate { pb.BackColor Color.Lime; };
Messages postés
61
Date d'inscription
vendredi 19 janvier 2007
Statut
Membre
Dernière intervention
29 juin 2008

Oui oui c'est bien sur la PictureBox elle-même. Je te remercie de ce renseignement Lutinore.