Bonjour tous le monde,
j'aimerai passer une classe par référence à une méthode qui détruit tous simplement cette classe et ses enfants,
ceci se passe dans un environnement graphique et du coup cette méthode me sert a détruit les objets qui ne sont plus utilisables,
la méthode est :
pour IGfx c'est une Interface pour les classes Bmp (Bitmap), Rec (Rectangle), Anim (Animation), Txt (Text) qui hèrite de cette interface
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public static void DisposeIGfxAndChild(IGfx igfx) { #region // supression d'un IGfx et de ses enfants if (igfx != null) { // cast de l'objet if (igfx.GetType() == typeof(Bmp)) { Bmp b = igfx as Bmp; b.Visible = false; b.Child.Clear(); } else if (igfx.GetType() == typeof(Rec)) { Rec r = igfx as Rec; r.Visible = false; r.Child.Clear(); } else if (igfx.GetType() == typeof(Anim)) { Anim a = igfx as Anim; a.Visible(false); a.Close(); // arret de l'animation a.img.Child.Clear(); } // supression du parent if (igfx.GetType() == typeof(Bmp)) { (igfx as Bmp).Visible = false; (igfx as Bmp).bmp = null; igfx = null; } else if (igfx.GetType() == typeof(Anim)) { (igfx as Anim).img.Visible = false; (igfx as Anim).Close(); (igfx as Anim).img = null; igfx = null; } else if (igfx.GetType() == typeof(Rec)) { (igfx as Rec).Visible = false; igfx = null; } else if (igfx.GetType() == typeof(Txt)) { (igfx as Txt).Visible = false; igfx = null; } } // netoyage des list IGfxList.RemoveAll(f => f == null); #endregion }
donc quand j'appel la méthode DisposeIGfxAndChild avec le code suivant :
la y a un truc qui ne passe pas comme je le souhaite, c'est que l'objet passé par référence ne se retire pas de la liste après l'avoir mis sur null
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 IGfx __PlayerStats = IGfxList.FindAll(f => f.GetType() == typeof(Rec) && (f as Rec).name == "__playerStatesInBattleRecParent"); DisposeIGfxAndChild(__PlayerStats);
c-à-d le code suivant :
IGfxList.RemoveAll(f => f == null);
ne supprime pas l'objet de la liste, et après débogage, l'objet passé par référence n'a pas subit de changement et n'est null, mais on dirai que c'est l'objet en cours qui est null, du coup aucune correspondance dans la liste IGfxList alors que l'objet existe toujours puisque je le trouve sous le nom "__playerStatesInBattleRecParent" mais pas null
j'ai compris alors qu'il faut passer l'objet pas le mot clef Ref,
chose faite et j'appel avec :
et j'ai créée une surcharge de la méthode de destruction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DisposeIGfxAndChild(ref __PlayerStats);
Erreur de compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public static void DisposeIGfxAndChild(Ref IGfx igfx) { ... }
Une propriété, un indexeur ou l'accès au membre dynamique ne peut pas être passé en tant que paramètre de sortie (out) ni de référence (ref)
je pige rien, une idée svp ?
Partager