Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1046 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  WinBinder : Impossible d'accèder à mon objet [Résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

WinBinder : Impossible d'accèder à mon objet [Résolu]

n°1556019
dwogsi
Défaillance cérébrale...
Posté le 06-05-2007 à 15:19:34  profilanswer
 

Bonjour,
bon vous allez penser que j'ai de bien drôles d'idées à vouloir faire des fenêtres avec du PHP. Je suis bien d'accord et je fais ça juste à titre expérimental. J'utilise donc pour cela l'extension WinBinder.
Bref, j'ai un petit soucis et franchement je ne vois pas ou est mon erreur. Voici donc un exemple de code simplifié au possible et qui ne fonctionne pas :
 

Code :
  1. <?
  2. require('include/winbinder.php');
  3. define('IDC_BUTTONOK',1001);
  4. function EventHandler($window,$id)
  5. {
  6. switch($id) {
  7.  case IDCLOSE:
  8.   wb_destroy_window($window);
  9.   break;
  10.  case IDC_BUTTONOK:
  11.   global $main;
  12.   $main->OnClickOk(); // Call to a member function on a non-object
  13.   break;
  14. }
  15. }
  16. class main
  17. {
  18. function main()
  19. {
  20.  $winmain = wb_create_window(null, AppWindow, APP_NAME, WBC_CENTER, WBC_CENTER, 542, 419, 0x00000000, 0);
  21.  wb_create_control($winmain, PushButton, 'ok', 1, 1, 115, 25, IDC_BUTTONOK);
  22.  wb_set_handler($winmain, 'EventHandler');
  23.  wb_main_loop();
  24. }
  25. function OnClickOk()
  26. {
  27.  // Du code, OSEF
  28. }
  29. }
  30. $main = new main();
  31. ?>


 
Dans le switch de la fonction EventHandler, je ne parviens pas à avoir accès à mon objet main puisque je me tape l'erreur suivante en cas de clique sur le bouton ok :
Call to a member function on a non-object
 
Et à vrai dire je ne comprends pas tellement pourquoi. Si quelqu'un a une idée.
L'autre solution serait d'utiliser une méthode de mon objet comme fonction de callback mais apparemment c'est impossible.


Message édité par dwogsi le 07-05-2007 à 15:05:46

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
mood
Publicité
Posté le 06-05-2007 à 15:19:34  profilanswer
 

n°1556387
supermofo
Hello World !
Posté le 07-05-2007 à 10:49:46  profilanswer
 

Je comprends pas. L application est server side ou bien client side ?

n°1556472
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 13:47:27  profilanswer
 

Côté client.
J'y éxécute via la ligne de commande.


Message édité par dwogsi le 07-05-2007 à 13:50:35

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1556478
kao98
...
Posté le 07-05-2007 à 14:19:16  profilanswer
 

Il ne faut pas déclarer la classe avant la fonction EventHandler ?


Message édité par kao98 le 07-05-2007 à 14:20:46

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1556485
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 14:33:16  profilanswer
 

Non ça ne change rien.

 

Edit :
Je viens de faire un test avec un bou de code encore plus simple :

Code :
  1. <?
  2. class main
  3. {
  4. function main()
  5. {
  6.  EventHandler();
  7. }
  8. function OnClickOk()
  9. {
  10.  echo 'ok';
  11. }
  12. }
  13. function EventHandler()
  14. {
  15. global $test;
  16. $test->OnClickOk(); // Call to a member function on a non-object
  17. }
  18. $test = new main();
  19. ?>


Et j'ai exactement la même erreur.
Le global sur un objet n'est-il pas censé fonctionner?

Message cité 1 fois
Message édité par dwogsi le 07-05-2007 à 15:47:53

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1556488
skeye
Posté le 07-05-2007 à 14:46:43  profilanswer
 

ça m'a l'air très alambiqué comme système...ya pas moyen de se passer d'objet global dans ton truc?[:autobot]


---------------
Can't buy what I want because it's free -
n°1556489
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 14:48:57  profilanswer
 

Ba je vois pas comment... Je ne peux pas passer de paramètres supplémentaires à ma fonction de callback et je ne peux pas non plus définir une méthode comme fonction de callback. Je vois pas vraiment d'autre solution que de faire du global.


Message édité par dwogsi le 07-05-2007 à 14:49:17

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1556490
skeye
Posté le 07-05-2007 à 14:52:08  profilanswer
 

Faire de ton main un singleton? Dans ton eventhandler tu récupèrerais l'instance déjà créée...


---------------
Can't buy what I want because it's free -
n°1556499
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 15:05:04  profilanswer
 

J'veux bien faire un singleton mais je ne vois pas en quoi ça pourrait m'aider à récupérer l'instance.

 

Sinon ça y est, je crois avoir compris pourquoi j'avais une erreur.
Dans le premier code que j'ai donné je lance la boucle principale dans le constructeur de ma classe. Or il est bien précisé dans le manuel de WinBinder que tout ce qui se trouve après la fonction wb_main_loop(); sera ignoré. On peut donc supposer que mon constructeur ne se "termine pas" et que par conséquent la variable censée récupérer mon instance ne récupère rien. Donc le code suivant fonctionne :

 
Code :
  1. <?
  2. require('include/winbinder.php');
  3. define('IDC_BUTTONOK',1001);
  4. function EventHandler($window,$id)
  5. {
  6. switch($id) {
  7.  case IDCLOSE:
  8.   wb_destroy_window($window);
  9.   break;
  10.  case IDC_BUTTONOK:
  11.   global $main;
  12.   $main->OnClickOk();
  13.   break;
  14. }
  15. }
  16. class main
  17. {
  18. function main()
  19. {
  20.  $winmain = wb_create_window(null, AppWindow, APP_NAME, WBC_CENTER, WBC_CENTER, 542, 419, 0x00000000, 0);
  21.  wb_create_control($winmain, PushButton, 'ok', 1, 1, 115, 25, IDC_BUTTONOK);
  22.  wb_set_handler($winmain, 'EventHandler');
  23.  wb_main_loop();
  24. }
  25. function OnClickOk()
  26. {
  27.  // Du code, OSEF
  28. }
  29. }
  30. $main = new main();
  31. wb_main_loop(); // Suffisait de mettre ça à la fin
  32. ?>
 

Et idem pour le second code que je donne, j'imagine que ça foire puisque j'appelle la fonction avant que mon constructeur "se termine".
Va falloir que j'étudie de plus prêt la façon dont PHP gère tout ça.

Message cité 1 fois
Message édité par dwogsi le 07-05-2007 à 15:05:28

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1556501
skeye
Posté le 07-05-2007 à 15:07:56  profilanswer
 

dwogsi a écrit :

J'veux bien faire un singleton mais je ne vois pas en quoi ça pourrait m'aider à récupérer l'instance.


Bah le principe du singleton, c'est que tu ne peux l'instancier qu'une fois...[:dawa]
Donc si tu l'as déjà utilisé, tu vas récupérer la même instance la seconde fois.[:dawa]
M'enfin c'était pas ça le soucis...donc bon pas grave, même si ça reste plus propre amha.:o

Message cité 1 fois
Message édité par skeye le 07-05-2007 à 15:08:24

---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le 07-05-2007 à 15:07:56  profilanswer
 

n°1556506
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 15:11:54  profilanswer
 

skeye a écrit :

Bah le principe du singleton, c'est que tu ne peux l'instancier qu'une fois...[:dawa]


Je suis au courant oui.

skeye a écrit :

Donc si tu l'as déjà utilisé, tu vas récupérer la même instance la seconde fois.[:dawa]


Oui mais je ne récupérais rien du tout. Donc singleton ou pas, ça changeait rien.
Edit : Non rien... J'ai eut un soucis d'intelligence là.

skeye a écrit :

M'enfin c'était pas ça le soucis...donc bon pas grave, même si ça reste plus propre amha.:o


Mais je suis aussi de cet avis, m'enfin pour un truc qui relève de l'expérimental je cherche pas non plus à faire ce qu'il y a de plus propre.

 

Edit : Non mais en fait tu as complètement raison. Le singleton c'est la meilleur solution, quoique je sais pas si c'est vraiment faisable en PHP4. Je vais étudier ça.
Edit2 : Oui c'est faisable, j'aurais dû y penser. Merci.


Message édité par dwogsi le 07-05-2007 à 15:36:35

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1556597
kao98
...
Posté le 07-05-2007 à 16:35:46  profilanswer
 

dwogsi a écrit :

Non ça ne change rien.
 
Edit :
Je viens de faire un test avec un bou de code encore plus simple :

Code :
  1. <?
  2. class main
  3. {
  4. function main()
  5. {
  6.  EventHandler();
  7. }
  8. function OnClickOk()
  9. {
  10.  echo 'ok';
  11. }
  12. }
  13. function EventHandler()
  14. {
  15. global $test;
  16. $test->OnClickOk(); // Call to a member function on a non-object
  17. }
  18. $test = new main();
  19. ?>


Et j'ai exactement la même erreur.
Le global sur un objet n'est-il pas censé fonctionner?


Et si tu met le $test = new main(); avant la déclaration de EventHandler ?
Je sais, ça peut paraître tordu, mais je crois que j'ai déjà eu ce genre de problème !
 
Edit: mince, j'avais pas vu que vous aviez déjà une solution ! Je vais d'ailleurs l'étudier :P


Message édité par kao98 le 07-05-2007 à 16:36:49

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1556613
dwogsi
Défaillance cérébrale...
Posté le 07-05-2007 à 16:54:20  profilanswer
 

Et oui ^^
Pour faire un singleton, en PHP4, c'est pas bien compliqué en fait. Suffit d'ajouter une méthode un peut particulière :

Code :
  1. function &getInstance() {
  2.   static $instance = null;
  3.   if (is_null($instance)) $instance = new ClassName();
  4.   return $instance;
  5. }


Et à chaque fois que tu veut utiliser ton objet tu fais un appel static à ta méthode getInstance :
$myObject = & ClassName::getInstance();

 

Comme ça tu es sûr d'avoir une seule instance et de toujours la récupérer.


Message édité par dwogsi le 07-05-2007 à 17:05:59

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  WinBinder : Impossible d'accèder à mon objet [Résolu]

 

Sujets relatifs
[Résolu]La JMF et Manager.createDataSource()[Résolu] Variables dynamiques ?
[résolu] subject dans un mail[asp.net]"Impossible d'afficher la page" sur un traitement long
upload via PHP - telechargement impossible via FTP[Resolu] [XEmacs] Controle-Espace ne marche pas
[résolu]Utilisation du logiciel ChSCiTE[Résolu] Compteur + somme
[resolu] [VBA] Cacher check box sous conditions[Résolu] Autorun ou menu DVD ?
Plus de sujets relatifs à : WinBinder : Impossible d'accèder à mon objet [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR