• Publicidad

Array de objetos y eventos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Array de objetos y eventos

Notapor Aceitunas » 2013-12-16 15:41 @695

Hola.

Tengo un array de botones creados con el módulo Win32::GUI. El problema es que quiero que todos los botones, al hacer clic, vayan al mismo evento, porque si no es una locura para manejarlos todos. Los creo de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $casillas[$i] = $ventana->AddButton(   # creamos botón
  2.     -name => "Boton$i",
  3.     -text => "$i",
  4.     -pos  => [ $posX, $posY ],
  5.     -size => [ 20, 20 ],
  6. );
  7.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

DATO: La variable $i contiene un número que va desde el 0 al 99. Y el array casillas contiene 100 objetos de botón.
Y los querría manejar algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Boton_Click
  2. {
  3. #$_[0] = Numero de botón que se pulso, por ejemplo se pulso el botón 20
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Espero que alguien me dé una solución!

Un saludo.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Publicidad

Re: Array de objetos y eventos

Notapor explorer » 2013-12-16 18:33 @815

No necesitas, para nada, almacenar los cien botones en un array.

La clave está en el atributo '-name' (ver página de manual Win32::GUI::UserGuide::Concepts, en la sección Objects).

Puedes acceder a ellos con un $ventana->{"Boton$i"}. Es decir: como sabes cómo se llaman, puedes acceder a ellos de forma directa.

Otro tema son las subrutinas que gestionen las pulsaciones sobre esos botones... la opción de crear 100 subrutinas es una pesadez:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Boton1_Click {
  2.     Boton_Click(1);
  3. }
  4. ...;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Una forma de abreviarlo es utilizar el mecanismo AUTOLOAD, de Perl.

Pero... lo que se puede hacer es definir la subrutina de gestión de la pulsación en el momento de crear el botón:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $ventana->AddButton(            # creamos botón
  2.     -name => "Boton$i",
  3.     -text => $i,
  4.     -pos  => [ $posX, $posY ],
  5.     -size => [ 20, 20 ],
  6.     -onClick => sub {
  7.              my $text = $_[0]->UserData('-text');
  8.              Boton_Click($text);
  9.     },
  10. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
No lo he probado (no uso Windows), pero lo que he leído por ahí dice que hay que usar UserData para acceder a los atributos del botón. Una referencia al botón pulsado es lo que se recibe en el gestor del clic, como primer argumento. Y del atributo '-text' sacamos el número de botón.

Otra forma sería (tampoco probada): my $text = $_[0]->{'-text'};

Ya digo que no tengo Windows, así que voy a ciegas :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Array de objetos y eventos

Notapor Aceitunas » 2013-12-17 08:31 @396

Mi intención era crear un juego similar al del buscaminas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!PERL
  2.  
  3. use Win32::GUI;
  4. use strict;
  5.  
  6. my $ventana = Win32::GUI::Window->new( # Generamos la ventana
  7.         -name   => 'buscaminas',
  8.         -text   => 'Buscaminas',
  9.         -pos    => [100,100],
  10.         -size   => [216,238],
  11. );
  12.  
  13. my $posX = 0;   # variables para colocar los botones.
  14. my $posY = 0;
  15. my $numcasillas = 0;
  16.  
  17. for (my $i = 0; $i < 100; $i++) # Dibujamos las casillas
  18. {
  19.    
  20.         if ($numcasillas > 9) # si hay 10 casillas en esta fila
  21.         {
  22.             $posX = 0;    # Posicion 0 en vertical
  23.             $posY = $posY + 20;  # sumamos una posicion en horizontal
  24.                
  25.             $numcasillas = 0;    
  26.         }
  27.        
  28.         $ventana->AddButton( # creamos boton
  29.         -name   => "Boton$i",
  30.                 -text   => '',
  31.                 -pos    => [$posX,$posY],
  32.                 -size   => [20,20],
  33.         );
  34.        
  35.         $posX = $posX + 20;
  36.         $numcasillas++;
  37.        
  38.         $ventana->{"Boton$i"}->Show(); # mostramos boton
  39. }
  40.  
  41. my @valorcasilla = "0" x 100;  
  42.  
  43. $ventana->Show();
  44. Win32::GUI::Dialog();
  45.  
  46. sub buscaminas_Terminate{return -1;} # Boton cerrar la ventana
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Al final creo que si lo quiero terminar voy a tener que hacer 100 eventos iguales. :cry:
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Array de objetos y eventos

Notapor explorer » 2013-12-17 11:02 @502

Que no... no necesitas crear 100 eventos. Vuelve a leer mi mensaje... ¿Has probado, lo que te digo al final, de la solución del onClick?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Array de objetos y eventos

Notapor Aceitunas » 2013-12-17 11:51 @535

Sí, he probado de todas las maneras posibles que se me han ocurrido, como tu has puesto en tu mensaje anterior también.

Si funcionara esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $ventana->AddButton(                   # creamos botón
  2.     -name    => "Boton",
  3.     -text    => $i,
  4.     -pos     => [ $posX, $posY ],
  5.     -size    => [ 20, 20 ],
  6.     -onClick => sub {
  7.         print $_[0]->UserData('-text') . "\n";
  8.  
  9.     },
  10. );
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quizás se podría hacer algún "apaño". Pero no funciona el evento -onClick.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Array de objetos y eventos

Notapor explorer » 2013-12-17 13:30 @604

¿Por qué le has quitado $i a '-name'?

Sin eso, no puedes crear botones diferentes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Array de objetos y eventos

Notapor Aceitunas » 2013-12-17 14:20 @639

explorer escribiste:¿Por qué le has quitado $i a '-name'?

Sin eso, no puedes crear botones diferentes.



Estaba haciendo pruebas haber si conseguía hacerlo funcionar de alguna manera... De todas formas ese no es el problema, ya que sigue sin funcionar. :x
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Array de objetos y eventos

Notapor explorer » 2013-12-17 14:34 @649

Bueno, pues prueba a acceder de forma directa:
print $_[0]->{'-text'} . "\n";
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Array de objetos y eventos

Notapor Aceitunas » 2013-12-17 14:45 @656

El problema es que tampoco va el evento -onClick .
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Re: Array de objetos y eventos

Notapor explorer » 2013-12-17 16:22 @724

Pues eso sí que es raro.

Por ejemplo, de esta página veo este ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $obMW->AddButton(
  2.     -name    => 'Button1',
  3.     -pos     => [ 10, 10 ],
  4.     -size    => [ 75, 23 ],
  5.     -text    => 'Button1',
  6.     -onClick => sub { Win32::MsgBox( "You just clicked " . $_[0]->UserData ) },
  7.  
  8. );
  9.  
  10. $obMW->Button1->UserData('Button1');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En esa misma página, hay un ejemplo que debería funcionarte para lo que quieres hacer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ### add button #########################
  2.  
  3. my $Button = new Win32::GUI::Button(
  4.     $Main,
  5.     -name    => "Test",
  6.     -tip     => "Test",
  7.     -width   => 15,
  8.     -height  => 15,
  9.     -left    => 600,
  10.     -onClick => 'Button_Clicked',
  11. );
  12. $Main->AddButton($Button);
  13.  
  14. ####################################
  15.  
  16. ####################################
  17. sub Button_Clicked {
  18.  
  19.     my ( $ButtonClicked, @other_params ) = @_;
  20.     my $ButtonName = $ButtonClicked->{-name};
  21.  
  22.     ### $ButtonName is now ready for use :) ###
  23.  
  24. }
  25. #####################################
  26.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Este caso es distinto: se usa new() de Win32::GUI::Button para crear el botón. Con el onClick se indica el nombre de la subrutina a ejecutar. Y lo que la subrutina hace es averiguar el nombre del botón.

Otra cosa importante: las rutinas de click() deben devolver un valor (1, 0 o -1) para indicar si el control debe pasar al siguiente nivel o no (más información en la sección Events de Win32::GUI::UserGuide::Concepts). Por eso habrás visto en los ejemplos que esas subrutinas acaban con una línea

0;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados