• Publicidad

Crear interfaz gráfica con Win32::GUI

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

Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-15 06:27 @310

Hola a todos. He creado mis pantallas con Win32::GUI. He podido ejecutar varios script pulsando los botones correspondientes pero tengo una duda:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $main2 = Win32::GUI::Window->new(
  2.             -name => 'Main2',
  3.             -text => 'Principal',
  4.             -pos => [ 350, 200 ],
  5.             -width => 600,
  6.             -height => 600,
  7.             -background => [153,0,0],
  8.     );
  9.     my $EditFont = new Win32::GUI::Font (
  10.             -name => "Fixedsys",
  11.             -size => 12,
  12.         );
  13.      
  14.     $main2->AddTextfield(
  15.         -name      => "Mostar",
  16.         -pos       => [200, 100],
  17.         -size      => [360, 360],
  18.         -multiline => 1,
  19.         -hscroll   => 1,
  20.         -vscroll   => 1,
  21.         -autohscroll => 1,
  22.         -autovscroll => 1,
  23.         -keepselection => 1 ,
  24.         -font => $EditFont,
  25.     );
  26.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Quiero que en el panel AddTextField se muestren los contactos que tengo en la base de datos y que se puedan seleccionar. Para que me entendáis mejor quiero que se muestren los contactos como cuando abres hotmail y se te muestran los correos que los puedes seleccionar con un clic. Pues me gustaría lo mismo pero solo mostrar el nombre del contacto en cada línea. ¿Alguna opción?
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Publicidad

Re: Crear interfaz gráfica con Win32::GUI

Notapor explorer » 2011-09-15 06:36 @316

Pues para la parte de acceso a la base de datos, hay bastantes hilos con ejemplos (usa el sistema de búsqueda), y en la página de tutoriales tienes un ejemplo de acceso a una base de datos MySQL.

Y en cuanto AddTextfield(), no tengo idea, pero a lo mejor viene en el manual de Win32::GUI...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-15 11:05 @503

Sí, esas las estuve mirando junto con http://perl-win32-gui.sourceforge.net y bueno, seguiré hasta encontrar cómo ponerlo. Tengo unos pequeños problemas.

1) A la hora de crear la interfaz estoy teniendo que crearlo todo en el mismo script las diferentes pantallas. Intenté hacer una en un script ventana.pl y otra en un script ventan2.pm. Hacia un use en el ventana.pl para poder usar esa pantalla pero, por ejemplo, si en ventana2 tenía un botón con el método $ventana2->Hide();, no funcionaba. Y para poder abrir la ventana2 desde la ventana1 tenía que crearme un método abrir en ventana2 y ejecutarlo desde ventana1. Yo creo que un lio, pero bueno, el problema es que solo me funcionaba con Show(); con Hide() no me funciona.

2) He incorporado en paquete Grupo.pm al script donde estoy diseñando la interfaz. He creado la siguiente subrutina en el script de la interfaz:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Button13_Click {
  2.         my $texto = $ventanaCG->TextFieldcg1->Text();
  3.         Grupo->new($texto);
  4.        
  5.         $ventanaCG->TextFieldcg2->Text("¡¡¡¡¡Listo!!!!!");  
  6.         return 0;
  7. };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



y en Grupo.pm lo recogería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub new {
  2.     print "Estoy en new\n";
  3.    
  4.     my $grupo = @_;
  5.    
  6.     return $grupo;
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


pero el problema es que cuando ejecuto el script de la interfaz, nada más hacerlo sin pulsar ningún botón me saca por pantalla:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0
estoy en new
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Por qué lo ejecuta sin que yo pulse nada?
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Crear interfaz gráfica con Win32::GUI

Notapor explorer » 2011-09-15 13:43 @613

Bueno, no está todo el código, pero yo diría que en alguna parte se ha ejecutado un new().

Y creo que

my $grupo = @_;

se debería realmente escribir como

my($grupo) = @_;

o

my $grupo = shift;

(Los paréntesis son significativos.)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-16 10:49 @492

Hola. He mirado y cambiado la subrutina que recibe la información pero sigue imprimiendo el primer print() de "estoy en new" y un 0 por cada print() que imprime el $grupo en crearGrupo.pm.

Código interfaz.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. use strict;
  4. use warnings;
  5. use Win32::GUI();
  6. use Spreadsheet::Read;          # Módulo Requerido por Excel.
  7. use autodie;                    # Módulo requerido para finalizar programa en algunos casos.
  8. use Data::Dumper;               # Módulo para realizar algunas acciones.
  9. use ConectarDB;                 # Módulo requerido para conectar a la base de datos.
  10. use DBI;
  11. use crearGrupo;
  12.  
  13. #  Variables a necesitar #
  14.  
  15. my $font = Win32::GUI::Font->new(
  16.         -name => "Arial",
  17.         -size => 14,
  18. );
  19.  
  20. ## Pantalla principal ##
  21.  
  22. my $ventanap = Win32::GUI::DialogBox->new(
  23.         -name => 'Main',
  24.         -text => 'ventana1',
  25.         -pos => [ 350, 200 ],
  26.         -width => 600,
  27.         -height => 600,
  28.         -background => [153,0,0],
  29.         -pushexstyle => 2,
  30. );
  31.  
  32. $ventanap->AddButton(
  33.         -name => "Button1",
  34.         -text => "Abrir",
  35.         -pos  => [ 400, 150 ],
  36.         -size => [ 150, 35 ],
  37.         -onClick => \&buscarArchivo,
  38. );
  39.  
  40. $ventanap->AddButton(
  41.         -name => "Button2",
  42.         -text => "Contactos",
  43.         -pos  => [ 400, 250 ],
  44.         -size => [ 150, 35 ],
  45. );
  46.  
  47. $ventanap->AddLabel(
  48.         -text => " Abrir archivo EXCEL: ",
  49.         -font => $font,
  50.         -pos => [ 70, 160 ],
  51. );
  52.  
  53. $ventanap->AddLabel(
  54.         -text => " Contactos:                ",
  55.         -font => $font,
  56.         -pos => [ 70, 260 ],
  57. );
  58.  
  59.  
  60.  
  61.  
  62. ## Pantalla contactos ##
  63.  
  64. my $ventanaC = Win32::GUI::Window->new(
  65.         -name => 'Main2',
  66.         -text => 'ventana2',
  67.         -pos => [ 350, 200 ],
  68.         -width => 600,
  69.         -height => 600,
  70.         -background => [153,0,0],
  71. );
  72.  
  73. $ventanaC->AddButton(
  74.         -name => "Button5",
  75.         -text => "Volver",
  76.         -pos  => [ 430, 500 ],
  77.         -size => [ 130, 35 ],
  78. );
  79.  
  80. $ventanaC->AddButton(
  81.         -name => "Button6",
  82.         -text => "AñadirContacto",
  83.         -pos => [ 20, 100 ],
  84.         -size => [ 150, 35 ],
  85. );
  86. $ventanaC->AddButton(
  87.         -name => "Button7",
  88.         -text => "AñadirGrupo",
  89.         -pos => [ 20, 150 ],
  90.         -size => [ 150, 35 ],
  91. );
  92. $ventanaC->AddButton(
  93.         -name => "Button8",
  94.         -text => "Eliminar",
  95.         -pos => [ 20, 200 ],
  96.         -size => [ 150, 35 ],
  97. );
  98. $ventanaC->AddButton(
  99.         -name => "Button9",
  100.         -text => "SeleccionarTodo",
  101.         -pos => [ 20, 300 ],
  102.         -size => [ 150, 35 ],
  103. );
  104. $ventanaC->AddButton(
  105.         -name => "Button10",
  106.         -text => "DeseleccionarTodo",
  107.         -pos => [ 20, 350 ],
  108.         -size => [ 150, 35 ],
  109. );
  110. my $EditFont = new Win32::GUI::Font (
  111.         -name => "Fixedsys",
  112.         -size => 12,
  113.     );
  114.  
  115. $ventanaC->AddTextfield(
  116.     -name      => "Mostar",
  117.     -pos       => [200, 50],
  118.     -size      => [360, 400],
  119.     -multiline => 1,
  120.     -hscroll   => 1,
  121.     -vscroll   => 1,
  122.     -autohscroll => 1,
  123.     -autovscroll => 1,
  124.     -keepselection => 1 ,
  125.     -font => $EditFont,
  126. );
  127.  
  128.  
  129.  
  130.  
  131. ## Pantalla Agregar Contacto ##
  132.  
  133. my $ventanaAG = Win32::GUI::DialogBox->new(
  134.         -name => 'Main3',
  135.         -text => 'Agregar Contacto',
  136.         -pos => [ 350, 200 ],
  137.         -width => 450,
  138.         -height => 400,
  139.         -background => [153,0,0],
  140. );
  141. my $labelag = $ventanaAG->AddLabel(
  142.         -text       => "ESCRIBIR LA INFORMACION DEL CONTACTO",
  143.         -font       => $font,
  144.         -left       => 15,
  145.         -top        => 30,
  146.         -foreground => 0x0000FF,
  147. );
  148.  
  149. my $labelag1 = $ventanaAG->AddLabel(
  150.         -text       => "Escribir información del grupo: ",
  151.         -font       => $font,
  152.         -left       => 30,
  153.         -top        => 100,
  154. );
  155. my $labelag2 = $ventanaAG->AddLabel(
  156.         -text       => "Ejemplo: pepe\@hotmail.com",
  157.         -font       => $font,
  158.         -left       => 30,
  159.         -top        => 190,
  160.         -foreground => 0x0000FF,
  161. );
  162. $ventanaAG->AddTextfield(
  163.         -name   => "TextFieldag1",
  164.         -left   => 30,
  165.         -top    => 150,
  166.         -width  => 350,
  167.         -height => 30,
  168.         -readonly => 0,
  169.         -multiline => 1,
  170.  
  171. );
  172. $ventanaAG->AddCombobox(
  173.         -name   => "comboBoxag",
  174.         -left   => 30,
  175.         -top    => 250,
  176.         -width  => 350,
  177.         -height => 30,
  178.         -dropdownlist => 1,
  179.         -vscroll  => 1,
  180.         -onChange => \&loadInfo,
  181.  
  182. );
  183. $ventanaAG->AddButton(
  184.         -name => "Button11",
  185.         -text => "Abrir",
  186.         -left   => 300,
  187.         -top    => 300,
  188.         -width  => 30,
  189.         -height => 20,
  190. );
  191. $ventanaAG->AddButton(
  192.         -name => "Button12",
  193.         -text => "volver",
  194.         -left   => 220,
  195.         -top    => 300,
  196.         -width  => 50,
  197.         -height => 20,
  198. );
  199.  
  200.  
  201. ##  Pantalla Crear grupo ##
  202.  
  203. my $ventanaCG = Win32::GUI::DialogBox->new(
  204.         -name => 'Main4',
  205.         -text => 'Agregar Grupo',
  206.         -pos => [ 350, 200 ],
  207.         -width => 400,
  208.         -height => 400,
  209.         -background => [153,0,0],
  210. );
  211. my $labelcg = $ventanaCG->AddLabel(
  212.         -text       => "ECRIBIR LA INFORMACIÓN DEL GRUPO",
  213.         -font       => $font,
  214.         -left       => 15,
  215.         -top        => 30,
  216.         -foreground => 0x0000FF,
  217. );
  218.  
  219. my $labelcg1 = $ventanaCG->AddLabel(
  220.         -text       => "Escribir información del grupo: ",
  221.         -font       => $font,
  222.         -left       => 30,
  223.         -top        => 100,
  224. );
  225. my $labelcg2 = $ventanaCG->AddLabel(
  226.         -text       => "Ejemplo: Grupo 1",
  227.         -font       => $font,
  228.         -left       => 30,
  229.         -top        => 190,
  230.         -foreground => 0x0000FF,
  231. );
  232.  
  233. $ventanaCG->AddTextfield(
  234.         -name   => "TextFieldcg1",
  235.         -left   => 30,
  236.         -top    => 150,
  237.         -width  => 350,
  238.         -height => 30,
  239.         -readonly => 0,
  240.         -multiline => 1,
  241.  
  242. );
  243. $ventanaCG->AddTextfield(
  244.         -name   => "TextFieldcg2",
  245.         -left   => 30,
  246.         -top    => 250,
  247.         -width  => 350,
  248.         -height => 30,
  249.         -readonly => 0,
  250.         -multiline => 1,
  251.  
  252. );
  253. $ventanaCG->AddButton(
  254.         -name => "Button13",
  255.         -text => "Añadir",
  256.         -left   => 300,
  257.         -top    => 300,
  258.         -width  => 30,
  259.         -height => 20,
  260. );
  261. $ventanaCG->AddButton(
  262.         -name => "Button14",
  263.         -text => "volver",
  264.         -left   => 220,
  265.         -top    => 300,
  266.         -width  => 50,
  267.         -height => 20,
  268. );
  269.  
  270. $ventanap->Show();
  271. Win32::GUI::Dialog();
  272. exit(0);
  273.  
  274. ## Terminar ventana ##
  275. sub ventanap_Terminate {
  276.         return -1;
  277. };
  278. sub ventanaC_Terminate {
  279.         return -1;
  280.  
  281. };
  282. sub ventanaAC_Terminate {
  283.         return -1;
  284.  
  285. };
  286. sub ventanaCG_Terminate {
  287.         return -1;
  288.  
  289. };      
  290.  
  291.  
  292. ## Métodos Botones ##
  293.  
  294.     # Pantalla principal #
  295. sub Button2_Click {
  296.         $ventanaC->Show();
  297.         return 0;
  298. }
  299.  
  300.    
  301.     # Pantalla contactos #
  302.  
  303. sub Button5_Click {
  304.         $ventanaC->Hide();
  305.         return 0;
  306. }
  307. sub Button6_Click {
  308.         $ventanaAG->Show();
  309.         return 0;
  310. }
  311. sub Button7_Click {
  312.         $ventanaCG->Show();
  313.         return 0;
  314. }
  315.  
  316.    # Pantalla Agregar Contacto #
  317.  
  318. sub Button12_Click {
  319.         $ventanaAG->Hide();
  320.         return 0;
  321. }
  322.  
  323.     # Patanlla Agregar grupo #
  324.  
  325. sub Button13_Click {
  326.         my $texto = $ventanaCG->TextFieldcg1->Text();
  327.         print $texto,"\n";
  328.        
  329.         crearGrupo->recibir($texto);
  330.        
  331.         $ventanaCG->TextFieldcg2->Text("Listo!!!!!");  
  332.         return 0;
  333. };
  334. sub Button14_Click {
  335.         $ventanaCG->Hide();
  336.         return 0;
  337. };
  338.  
  339.  
  340. ## Metodos ##
  341.  
  342. sub buscarArchivo {
  343.    
  344.     my $self = shift;
  345.     my $file = Win32::GUI::GetOpenFileName(
  346.                    -owner  => $ventanap,
  347.                    -title  => "Abrir archivo",
  348.                    -filter => [
  349.                        'Excel 2003 (*.xls)' => '*.xls',
  350.                        'Excel 2007 (*.xlsx)' => '*.xlsx',
  351.                     ],
  352.                    );
  353.  
  354.    
  355.     return 0;
  356.        
  357. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


y el código de crearGrupo es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package crearGrupo;                
  4. use DBI;
  5. use ConectarDBcon;                                      # Módulos requeridos  por el programa.
  6. use autodie;
  7. use Modern::Perl;
  8.  
  9.  
  10.  
  11.  
  12.  
  13. sub recibir{
  14.     print "Estoy en new\n";
  15.    
  16.     my $grupo = @_;
  17.    
  18.     print $grupo,"\n";
  19.    
  20.     return $grupo;
  21. }
  22.  
  23. # Subrutina crearTabla.
  24.  
  25. sub  crearTabla {
  26.  
  27.       my($conexion,$tabla);
  28.  
  29.       $tabla = $_[0];
  30.  
  31.       $conexion = $_[1];                                                                           #Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  32.  
  33.       eval  {$conexion->do("CREATE TABLE $tabla (nombre VARCHAR(30), correo VARCHAR(100))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  34.  
  35.       if ($@) {
  36.  
  37.             printf("La tabla existe \n")                                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  38.  
  39.       }
  40.  
  41. }
  42.  
  43.  
  44. #Subrutina  comprobarDB.
  45.  
  46. sub comprobarDB {
  47.  
  48.  
  49.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => ''});# Cogemos la lista de bases de datos presentes en el sistema.
  50.  
  51.         my $base_datos = 'contactos';                              #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  52.  
  53.         my $dsn = "DBI:mysql:$base_datos";                         # Conformamos el DSN de esa base de datos.
  54.  
  55.         unless ($dsn ~~ @databases) {                              # Si el $dsn no está entre las @databases la creamos.
  56.  
  57.                 my $drh = DBI->install_driver("mysql");            # Carga del controlador mysql
  58.  
  59.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', '', 'admin');# Creamos la base de datos.
  60.         }
  61.  
  62. }
  63.  
  64.  
  65. # Conectar base de datos y mirar si existe.
  66.  
  67. &comprobarDB();               # Llamada a subrutina CompararDB.
  68.  
  69.  
  70. my($conexion,$sth,$grupo);               # Decalaración de las  variables que utilizaremos a continuación.
  71.  
  72. $conexion = ConectarDBcon->connect(); #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  73.  
  74.  
  75. $grupo  = &recibir();
  76. #Leer datos.
  77.  
  78. print "$grupo\n";
  79.  
  80.  
  81. #Crear.
  82.  
  83. &crearTabla($grupo, $conexion);
  84.  
  85.  
  86. #Desconectar.
  87.  
  88. $conexion->disconnect;
  89.  
  90. 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Si alguien ve cuál puede ser el fallo por el que se ejecuta el programa na más inciar la interfaz.
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Crear interfaz gráfica con Win32::GUI

Notapor explorer » 2011-09-16 11:29 @520

Te cuento qué es lo que está pasando...

En la línea 11 del interfaz estás dando la orden de la importación del espacio de nombres del módulo crearGrupo.

Perl busca, lee, y ejecuta el contenido de ese módulo.

Eso quiere decir que, aparte de la definición de todas las subrutinas, también ejecutará todo código ejecutable que encuentre.

Esto lo hace Perl por la siguiente razón: si, tras ejecutar el código del módulo, el resultado (la última instrucción ejecutada dentro del módulo) devuelve un valor positivo, entonces Perl asume que la carga ha sido correcta.

Como lo normal es que los módulos solo contengan definiciones de subrutinas, métodos y variables (ningún código directamente ejecutable), esa es la razón por la cual se coloca un '1;' como última línea del módulo, para que Perl acepte la carga del módulo.

Pero en tu caso... sí que hay código ejecutable: a partir de la línea 67 del módulo.

Esa es la razón por la cual sale el mensaje de "new": Perl está ejecutando ese trozo de código (la línea 75), cuando llega a la línea 11 del interfaz.

Algunas veces sí que es interesante que se ejecute código en el momento de la carga del módulo, como por ejemplo, código de inicialización.

Tu verás qué quieres que haga ese código, en ese momento.

En cuanto a los mensajes de los ceros, se produce por lo siguiente.

En la línea 75 del módulo, estás llamando a recibir(), sin ningún argumento. En las líneas 13 a 21 del módulo está ese método. En la línea 16 estás asignando el número de argumentos pasados a recibir() a la variable $grupo. Como no has pasado ninguno, el valor es cero, y eso es lo que imprime.

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

Re: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-16 11:42 @529

Vale, una pregunta. Si yo uso use crearGrupo; eso significa que ya puedo usar todas las subrutinas y todo del módulo pero también leí en un tema, no me acuerdo muy bien cuál, que no hace falta cargar el módulo; simplemente realizando una llamada con system() o qx(), si no recuerdo mal. De esta manera, no ejecutaría el módulo y solo lo haría cuando yo pulsase el botón, ¿no?
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Crear interfaz gráfica con Win32::GUI

Notapor explorer » 2011-09-16 12:08 @547

Si usas system() o qx() (o do()) ya estás ejecutando el código.

Si lo que quieres es que esa parte del código se ejecute cuando pulsas un botón, lo que tienes que hacer es "encerrar" ese código dentro de un método, que será llamado por la subrutina del botón.

Si quieres ejecutar código en el arranque del módulo, puedes meter el código dentro del método especial BEGIN{}.

De esa manera, ya no queda código ejecutable suelto dentro del módulo, salvo el venerable '1;'.

Si haces un perldoc -f require verás el código al que se equivale require (que es otra versión de use), y verás que, después de localizar el módulo, lo carga y ejecuta con un do(). Y luego comprueba que el resultado de esa ejecución sea 'verdadero',
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-19 05:49 @284

He intentado lo del BEGIN{} pero me dice en la línea 73 "BEGIN failed--compilation aborted"

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin
  2.  
  3. package crearGrupo;                
  4. use DBI;
  5. use ConectarDBcon;                                      # Módulos requeridos  por el programa.
  6. use autodie;
  7. use Modern::Perl;
  8.  
  9. # Subrutina crearTabla.
  10.  
  11. sub  crearTabla {
  12.  
  13.       my($conexion,$tabla);
  14.  
  15.       $tabla = $_[0];
  16.  
  17.       $conexion = $_[1];                                                                           #Desde la llamada a la subrutina le pasamos la  conexión a  la base de datos. Desde la llamada  sería la  segunda  variable  que le pasamos.
  18.  
  19.       eval  {$conexion->do("CREATE TABLE $tabla (nombre VARCHAR(30), correo VARCHAR(100))")};     #Hacemos un eval, cuya función será dejar que la tabla   se cree o no dependiendo de si existe,y desde la conexión a la  base de datos hacemos  crearemos la tabla  si  no existe  ya.
  20.  
  21.       if ($@) {
  22.  
  23.             printf("La tabla existe \n")                                                            # Se captura el error si la tabla existe y nos dice que "La  tabla  existe".
  24.  
  25.       }
  26.  
  27. }
  28.  
  29.  
  30. #Subrutina  comprobarDB.
  31.  
  32. sub comprobarDB {
  33.  
  34.  
  35.         my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => 'password'});# Cogemos la lista de bases de datos presentes en el sistema.
  36.  
  37.         my $base_datos = 'contactos';                              #Introducimos el nombre de la  base de datos que queremos comprobar que está  en la variable $base_datos.
  38.  
  39.         my $dsn = "DBI:mysql:$base_datos";                         # Conformamos el DSN de esa base de datos.
  40.  
  41.         unless ($dsn ~~ @databases) {                              # Si el $dsn no está entre las @databases la creamos.
  42.  
  43.                 my $drh = DBI->install_driver("mysql");            # Carga del controlador mysql
  44.  
  45.                 my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', 'password', 'admin');# Creamos la base de datos.
  46.         }
  47.  
  48. }
  49.  
  50.  
  51. # Conectar base de datos y mirar si existe.
  52. BEGIN{
  53.     &comprobarDB();               # Llamada a subrutina CompararDB.
  54.  
  55.     my $grupo = @_;
  56.     my($conexion,$sth);               # Decalaración de las  variables que utilizaremos a continuación.
  57.  
  58.     $conexion = ConectarDBcon->connect(); #  Conectamos con la  base de datos desde el paquete ConectarDB y lo dejamos en la variable $dbh.
  59.  
  60.     #Leer datos.
  61.  
  62.     print "$grupo\n";
  63.  
  64.  
  65.     #Crear.
  66.  
  67.     &crearTabla($grupo, $conexion);
  68.  
  69.  
  70.     #Desconectar.
  71.  
  72.     $conexion->disconnect;
  73. }
  74. 1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

Re: Crear interfaz gráfica con Win32::GUI

Notapor explorer » 2011-09-19 06:21 @306

El problema con BEGIN es que se ejecuta inmediatamente, incluso antes de que sea compilado el resto del programa.

Quizás sea mejor que el código de inicialización sea arrancado desde el programa principal.

Meterlo en un new o init, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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