Bonjour, voila, j'essaye de faire une file de boutons (file comme la queue leu-leu hein, pas le file comme un faille-leu ), j'ai donc défini le type non sans m'aider des formidables tutos de fbeaulieu par ailleurs, mais comme je ne veux pas faire une file de TPersonnes, mais une file de TMenuBoutons (qui sont comme leur nom l'indique subtilement, des boutons d'un menu).
Bref, avec le debugger j'ai l'impression que tout se passe bien jusqu'à l'opération Enfiler, qui pose un petit problème.
Version colorée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // le type File type PFileElem = ^TFileElem; TFileElem = record Elem : TMenuBouton; Suivant : PFileElem; end;
version colorée
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 // la fonction enfiler function FLEnfiler(F : PFileElem; B : TMenuBouton ) : PFileElem; var tmp, parcours : PFileElem; begin new(tmp); // hop on cré le pointeur tmp^.suivant:= nil; // on initialise le pointeur de la variable ajoutée tmp^.Elem:= B; // on initialise la valeur de la variable ajoutée if F = nil then // si F est vide, on retourne directement ce qu'on ajoute begin result:= tmp; end else // sinon begin parcours:= F; // parcours servira à parcourir la file (héhé) while parcours^.suivant <> nil do // tant qu'on n'a pas atteint la fin de la file begin parcours:= parcours^.suivant; // on va à l'élément suivant end; // on est au bout de la vile parcours^.suivant:= tmp; // on fait que le pointeur pointe vers la variable qu'on veut ajouter result:= F; // on retourne F end; end;
Ce code vient bien sur de celui qui se trouve sur la page de fbeaulieu
Ensuite je veux utiliser cette fonction pour enfiler des TMenuBoutons dans une file qui se trouve dans la classe TFiledeboutons.
voila en gros mon code:
version colorée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // la classe TFiledeboutons type TFiledeboutons = class public constructor Init; procedure afficher; procedure ajouter(width, height, x, y : integer; transparence : double; couleur : string); private Elts : PFileElem; end;
version colorée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TFiledeboutons.ajouter(width, height, x, y : integer; transparence : double; couleur : string); var tmp : TMenuBouton; begin tmp:= TMenuBouton.Create(width, height); tmp.x:= x; tmp.y:= y; tmp.SetButtonTransparence(transparence); tmp.SetButtonColor(couleur); Elts:= FLEnfiler(Elts, tmp); end;
Donc voila, dans le code, tout d'abord j'initialise l'objet boutons (de classe TFiledeboutons)
puis j'ajoute un TMenuBouton, puis je l'affiche.
Version colorée
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 program interface; {$APPTYPE CONSOLE} uses SysUtils, OpenGL, glfw, Unit1 in 'Unit1.pas', Unit2 in 'Unit2.pas'; var running : boolean; boutons : TFiledeboutons; {... qqes fonctions et procédures ...} procedure Display; begin glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glEnable(GL_BLEND) ; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ; boutons.afficher; glDisable(GL_BLEND); glFlush; glfwSwapBuffers; end; { ... encore d'autres fonctions et procédures ...} begin {... initialisations diverses et variées ...} boutons:= TFiledeboutons.Init; { début de l'ajoutage de boutons } boutons.ajouter(300, 30, 50, 50, 0.5, 'red'); while running do begin Display; running:= (glfwGetKey(GLFW_KEY_ESC) = 0) and (glfwGetWindowParam(GLFW_OPENED) = 1); end; glfwTerminate; end.
la fonction qui est sensée afficher tous les boutons de la file:
version colorée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TFiledeboutons.afficher; var tmp : PFileElem; begin tmp:= Elts; while tmp <> nil do begin FLTete(tmp).Display(FLTete(tmp).x, FLTete(tmp).y); FLDefiler(elts); end; dispose(tmp); end;
et la fonction qui est sensée ajouter un bouton
version colorée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TFiledeboutons.ajouter(width, height, x, y : integer; transparence : double; couleur : string); var tmp : TMenuBouton; begin tmp:= TMenuBouton.Create(width, height); tmp.x:= x; tmp.y:= y; tmp.SetButtonTransparence(transparence); tmp.SetButtonColor(couleur); Elts:= FLEnfiler(Elts, tmp); end;
Donc voila, quand je compile, ça me donne "Project interface.exe raised exception class EInvalidPointer with message 'Invalid Pointer Operation'. Process stopped. Use step or Run to continue.".
J'avoue que j'ai débuté hier avec les pointeurs, et qu'il est possible que j'ai fait une fausse opération quelquepart, seulement mon manque d'expérience m'a empéché de trouver l'erreur, même avec le debugger (quoi qu'il m'a permis de supposer que l'erreur se trouve aux alentours de la fonction d'enfilement).
Donc si quelqun avait une idée d'où provient l'erreur, et surtout de comment la supprimer, je suis preneur
Si jamais il manque un bout de code ou quoi que ce soit, n'hésitez pas à me demander.
Merci d'avoir pris le temps de me lire.
iLUV
Partager