Création dynamique d'un composant

cs_amlb Messages postés 8 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 18 mai 2006 - 10 mai 2006 à 21:57
HansPrestat Messages postés 61 Date d'inscription vendredi 19 janvier 2007 Statut Membre Dernière intervention 29 juin 2008 - 13 déc. 2007 à 22:56
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 mai 2006 à 23:38
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 );
0
cs_amlb Messages postés 8 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 18 mai 2006
11 mai 2006 à 08:41
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 :)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 mai 2006 à 10:25
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..
0
cs_amlb Messages postés 8 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 18 mai 2006
11 mai 2006 à 11:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 mai 2006 à 13:21
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..
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
11 mai 2006 à 14:32
Ca donne quelque chose comme ça :

ResourceManager rm = new ResourceManager("NomDuNamespace.NomDuFichierDeRessource", typeof( NonDeLaClasse ).Assembly );
Bitmap bmp = ( Bitmap )rm.GetObject( "NomDeLaRessource" );
0
cs_amlb Messages postés 8 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 18 mai 2006
12 mai 2006 à 08:49
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
0
cs_amlb Messages postés 8 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 18 mai 2006
12 mai 2006 à 13:19
J'AI REUSSI !!!

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

Merci pour tes réponses
0
HansPrestat Messages postés 61 Date d'inscription vendredi 19 janvier 2007 Statut Membre Dernière intervention 29 juin 2008
12 déc. 2007 à 21:25
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 déc. 2007 à 21:13
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; };
0
HansPrestat Messages postés 61 Date d'inscription vendredi 19 janvier 2007 Statut Membre Dernière intervention 29 juin 2008
13 déc. 2007 à 22:56
Oui oui c'est bien sur la PictureBox elle-même. Je te remercie de ce renseignement Lutinore.
0
Rejoignez-nous