[C#] exception NullReferenceExc lors de changement d'image de fond

exception NullReferenceExc lors de changement d'image de fond [C#] - C#/.NET managed - Programmation

Marsh Posté le 25-05-2008 à 16:09:20    

Salut à tous,
 
J'ai programmé un petit soft en c# qui en gros affiche des labels dans des tableaux, qui sont à la base des jpeg stocké en ressources incorporées dans l'executable.
 
Suivant un timer, il remplissent chacun leur tour l'image de fond
 
Le problème c'est que lorsque je change cette image de fond par un simple
 

Code :
  1. diap.ActiveForm.BackgroundImage = WindowsApplication1.Properties.Resources.MonImage;


 
il me renvoie et celà totalement aléatoirement (le temps de fonctionnement du programme avant l'exception est aléatoire), l'exception:
 
NullReferenceException
 
La référence d'objet n'est pas définie à une instance d'un objet.
 
Je vois pas où est le mal étant donné qu'il s'agit d'une image en ressource  :??:  
 
si quelqu'un a une idée elle est plus que la bienvenue


Message édité par ingodidonttrust le 25-05-2008 à 16:09:40
Reply

Marsh Posté le 25-05-2008 à 16:09:20   

Reply

Marsh Posté le 25-05-2008 à 17:18:22    

poste plus de code stp... t'es sur que tu ne fais pas pointer ta référence vers un autre objet ou que tu ne la met pas à null ? ça me parait un peu gros que ta référence soit collectée par le GC sans intervention de ta part


Message édité par Harkonnen le 25-05-2008 à 17:18:31
Reply

Marsh Posté le 25-05-2008 à 19:11:58    

Merci pour ta réponse
 
voici la quasi totalité, je n'ai oté que les setvisible en gros...
 
j'ai aussi essayé en créant deux Bitmap dans lesquelles je mets les deux ressources mais c'est pareil
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. namespace WindowsApplication1
  9. {
  10.     public partial class diap : Form
  11.     {
  12.         decimal[] Valtab = new decimal[10];
  13.         decimal[] CValtab = new decimal[10];
  14.         System.Windows.Forms.Timer timer= new System.Windows.Forms.Timer();
  15.         int TimerFini=0;
  16.         System.Drawing.Point Temposition = new System.Drawing.Point();
  17.         Bitmap Page1 = new Bitmap(WindowsApplication1.Properties.Resources.change_pointok);
  18.         Bitmap Page2 = new Bitmap(WindowsApplication1.Properties.Resources.change_point_page1);
  19.         public diap()
  20.         {
  21.             InitializeComponent();
  22.         }
  23.         public void timer_Tick(object sender, EventArgs eArgs)
  24.         {
  25.             if(TimerFini==0)
  26.             {
  27.                 diap.ActiveForm.BackgroundImage = Page2;
  28.                 timer.Interval=10000;
  29.                 TimerFini = 1;
  30.             }
  31.             else
  32.             {
  33.                 if(TimerFini==1)
  34.                 {
  35.                     diap.ActiveForm.BackgroundImage = Page1;
  36.                     timer.Interval=20000;
  37.                     TimerFini = 0;
  38.                 }
  39.             };
  40.             timer.Start();
  41.         }
  42.         private void PlayDiap_Click(object sender, EventArgs e)
  43.         {
  44.             int j = 0;
  45.             while (j != 2)
  46.             {
  47.                 diap.ActiveForm.Size = MaximumSize;
  48.                 diap.ActiveForm.Dock = 0;
  49.                 System.Drawing.Point topleft = new System.Drawing.Point();
  50.                 topleft.X = 0;
  51.                 topleft.Y = 0;
  52.                 diap.ActiveForm.Location = topleft;
  53.                 diap.ActiveForm.FormBorderStyle = 0;
  54.                 j++;
  55.             };
  56.             timer.Enabled = true;
  57.             timer.Tick += new EventHandler(timer_Tick);
  58.             timer.Start();   
  59.         }
  60.     }
  61. }


 

Reply

Marsh Posté le 26-05-2008 à 09:59:09    

:)

Reply

Marsh Posté le 26-05-2008 à 10:36:20    

peux tu donner la ligne exacte qui te renvoit l'exception stp ?

Reply

Marsh Posté le 26-05-2008 à 14:34:46    

diap.ActiveForm.BackgroundImage = Page2;
 
ou
 
diap.ActiveForm.BackgroundImage = Page1;
 
aléatoirement
 
Merci pour ton interêt :) :hello:

Reply

Marsh Posté le 26-05-2008 à 18:19:11    

vu l'intervalle que tu donnes à tes timers, il y a de fortes chances que tes références Page1 et Page2 soient ramassées par le Garbage Collector entre 2 ticks du timer. Quel est l'intervalle initial que tu donnes à ton timer ?

Reply

Marsh Posté le 27-05-2008 à 10:25:03    

10 et 20 secondes
 
Oui c'est effectivement ce qui semble se passer mais pourquoi cela se produit-il également avec les variable bitmap?
 
Comment puis-je éviter ce phénomène?

Reply

Marsh Posté le 13-06-2008 à 14:22:54    

j'ai essayé en passant par une classe assembly et avec un timer d'une seconde c'est toujours pareil :s

Reply

Marsh Posté le 13-06-2008 à 17:00:49    

et en debuggant pas à pas, tu n'arrives pas à voir le souci ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 13-06-2008 à 17:00:49   

Reply

Marsh Posté le 15-06-2008 à 18:25:32    

En débuggant je constate que en observant les variables locales j'ai au bout d'un temps mes Bitmap page1 et 2 qui passent à null
 
Bizarrement celà se produit systèmatiquement lorsque je switch de fenêtre apparemment sinon cela se produit aléatoirement

Reply

Marsh Posté le 20-06-2008 à 15:45:45    

Au lieu de passer par Page1 et Page2, ça donne qui si tu fais ça ?
 
diap.ActiveForm.BackgroundImage = WindowsApplication1.Properties.Resources.change_pointok;

Reply

Marsh Posté le 09-08-2008 à 19:06:58    

identiquement pareil j'avais ça au départ c'est ce qui me parait d'ailleurs le plus simple

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed