• 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.

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

Notapor explorer » 2011-09-28 11:16 @511

No sé muy bien por qué falla en primera opción, pero sí que veo un problema y un detalle.

El problema es que los bucles while() pueden entrar en bucle infinito: vas incrementando de línea en línea, pero la condición de salida es mientras $text sea una cadena vacía, lo cual creo que es cierto para todas las líneas que están más allá de las líneas existentes de la rejilla.

Deberías poner un control más, algo así:

while ($text eq "" and $row <= $GridC->GetRows()) {

siendo $GridC->GetRows() el número de líneas actuales de la rejilla.

Y el detalle: el código para activar y desactivar los controles, siempre es el mismo. Solo cambia el valor a poner en las celdas.

Quedaría algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Grid_Click {
  2.     my ( $row, $col ) = @_;
  3.      
  4.     my $estado  = $GridC->GetCellCheck( $row, $col );    
  5.      
  6.     if ($col == 0) {    # si el clic es en la primera columna...
  7.         $col = 1;       #    pasamos a la siguiente celda
  8.         $row++;
  9.  
  10.         my $max_row = $GridC->GetRows();                  # tamaño de la rejilla
  11.  
  12.         do {                                              # hacemos...
  13.             $GridC->SetCellCheck( $row, $col, $estado );  # todos los controles iguales
  14.  
  15.             $row++;                                       # en todas las filas
  16.  
  17.         } while (                                         # mientras
  18.                  $row < $max_row                          # estemos dentro de la rejilla,
  19.              and $GridC->GetCellText($row, $col) eq ""    # y no haya texto
  20.         );
  21.     }
  22. }
  23.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
El porqué comprobamos antes el valor de $row que si la celda contiene texto, es por una cuestión de eficiencia (se deja al lector el averiguarlo).
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

Publicidad

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

Notapor Txemaracas » 2011-09-29 11:44 @530

Siento ser tan pesado con cosas como esta pero me vuelvo loco buscando en Internet alguna solución sin encontrar el porqué a mi no me funciona. Quiero reajustar los botones y demás de la pantalla, pero no lo hace.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Pantalla contactos ##
  2.  
  3. my $ventanaC = Win32::GUI::Window->new(
  4.         -name => 'Main2',
  5.         -text => 'Contactos',
  6.         -pos => [ 400, 200 ],
  7.         -width => 600,
  8.         -height => 600,
  9.         -background => [153,0,0],
  10.         -onResize   => \&Reajustar,
  11.         -parent  => $ventanap,
  12. );
  13.  
  14. $ventanaC->AddButton(
  15.         -name => "Button5",
  16.         -text => "Volver",
  17.         -pos  => [ 430, 500 ],
  18.         -size => [ 130, 35 ],
  19. );
  20.  
  21. $ventanaC->AddButton(
  22.         -name => "Button6",
  23.         -text => "AñadirContacto",
  24.         -pos => [ 20, 100 ],
  25.         -size => [ 150, 35 ],
  26. );
  27. $ventanaC->AddButton(
  28.         -name => "Button7",
  29.         -text => "AñadirGrupo",
  30.         -pos => [ 20, 150 ],
  31.         -size => [ 150, 35 ],
  32. );
  33. $ventanaC->AddButton(
  34.         -name => "Button8",
  35.         -text => "Eliminar",
  36.         -pos => [ 20, 200 ],
  37.         -size => [ 150, 35 ],
  38.         -disabled => 1,
  39. );
  40. $ventanaC->AddButton(
  41.         -name => "Button9",
  42.         -text => "SeleccionarTodo",
  43.         -pos => [ 20, 300 ],
  44.         -size => [ 150, 35 ],
  45. );
  46. $ventanaC->AddButton(
  47.         -name => "Button10",
  48.         -text => "DeseleccionarTodo",
  49.         -pos => [ 20, 350 ],
  50.         -size => [ 150, 35 ],
  51. );
  52.  
  53. my $GridC = $ventanaC->AddGrid (
  54.       -name    => "Grid",
  55.       -pos     => [200, 50],
  56.       -size    => [360, 400],
  57.       -rows    => 1,
  58.       -columns => 4,
  59.       -fixedrows    => 1,
  60.       -fixedcolumns => 0,
  61.       -editable => 1,
  62.   ) or die "new Grid";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


He usado metodos como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Reajustar {
  2.    
  3.   my ($self) = @_;
  4.   my ($width, $height) = ($self->GetClientRect())[2..3];
  5.   $self->Grid->Resize($width+1, $height+1) if exists $self->{Edit};
  6.  
  7. }
  8. sub ventanaC_Resize {
  9.    
  10.     my ($width, $height) = ($ventanaC->GetClientRect)[2..3];
  11.     $GridC->Resize ($width, $height);
  12. }
Coloreado en 0.001 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-29 13:03 @585

No conozco apenas nada de Win32::GUI, pero, ¿no es posible decirle en las propiedades de la rejilla que se autoajuste al tamaño del control padre en que reside.

Vamos, es algo normal en la construcción de los diálogos... no realizarlo de forma programada, sino que es una de las propiedades del widget.
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: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-30 06:31 @313

No, en principio lo he intentado con -resizable =>1, pero no lo he conseguido. Por si a alguien le interesa, he conseguido hacerlo con el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub ventanaC_Resize {
  2.     my ($width, $height) = ($ventanaC->GetClientRect)[2..3];
  3.     $GridC->Resize ($width - 240, $height-200);
  4.     $ventanaC->Button5->Left($width-150);
  5.     $ventanaC->Button5->Top($height-50);
  6.     $ventanaC->Button9->Top($height-250);
  7.     $ventanaC->Button10->Top($height-200);
  8.    
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema que veo es que en el Grid las celdas quedan muy pequeñas. Me gustaría que ocuparan todo el ancho de la tabla. Quizás esto tenga también algún parecido en la forma de hacerlo con Gtk o algún otro módulo.

Otra cosilla más, para poder cambiar el estado del check_box la celda tiene que ser editable. ¿Se puede hacer que solo sean editables las celdas que contienen el check_Box?
Adjuntos
pant.JPG
pant.JPG (52.62 KiB) Visto 682 veces
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-30 10:00 @458

En la propia sinopsis del módulo Win32::GUI::Grid aparecen las líneas que activan el redimensionado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Resize Grid Cell
  2. $Grid->AutoSize();
  3.  
  4. # Event loop
  5. $Window->Show();
  6. Win32::GUI::Dialog();
  7.  
  8. # Main window event handler
  9. sub Window_Terminate {
  10.   return -1;
  11. }
  12.  
  13. sub Window_Resize {
  14.   my ($width, $height) = ($Window->GetClientRect)[2..3];
  15.   $Grid->Resize ($width, $height);
  16. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te recomiendo que mires, en esa página, todas las propiedades y métodos que contengan la palabra 'size'.

En cuanto a la editabilidad de las celdas, creo (viendo esa página), que debería ser con SetCellEditable().

Lo que no estoy seguro es que se pueda hacer eso: editar el texto de la caja con la opción. Que yo recuerde, eso no lo he visto nunca en Windows. Y si lo he visto, era con una imitación: una celda pequeña que solo contenía el botón de opción, y la celda de la derecha, editable.
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: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-09-30 10:59 @499

Bueno, eso ya lo he utilizado y no funciona, pero gracias de todos modos. Intentaré darle una anchura específica a la celda. En cuanto a lo de editable he añadido una columna entre el nombre del contacto y el nombre del grupo y he introducido los check_box ahí para intentar lo que has dicho tu de hacer que la columna de la derecha no sea editable.
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

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

Notapor Txemaracas » 2011-10-03 06:16 @303

Hola. Tengo un problemilla que no consigo ver el fallo. Lo que quiero es que cuando alguna casilla este marcada el botón eliminar se ponga Enable y cuando no esté ninguna marcada se ponga Disable. Lo que hago es llamar la subrutina comprobarMarcados() para que me diga si hay alguna casilla marcada. Me devolvería el estado que sería 0 o 1 y desde el Grid_Click pondríamos según cual sea el estado el botón disable o enable. El problema es que no lo hace bien , hay veces que marco casillas y no lo pone a enable o las marco y al quitarlas sigue el botón Enable.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub comprobarMarcados {
  2.    
  3.     my $max_row = $GridC->GetRows();
  4.     print "El numero de lineas que hay aohra es: ",$max_row,"\n";
  5.     my $row = 1;
  6.     my $col = 0;
  7.     my $estado=0;
  8.     while ($row<$max_row and $estado==0){
  9.        
  10.         if ($col == 0){
  11.            
  12.             $estado = $GridC->GetCellCheck($row, $col);
  13.             $row++;
  14.             $col = 2;
  15.            
  16.         }elsif($col == 2){
  17.            
  18.             while ($GridC->GetCellText($row, $col) ne "*" and $estado==0){
  19.                
  20.                 $estado = $GridC->GetCellCheck($row, $col);
  21.                 $row++;
  22.                
  23.             }
  24.             $col = 0;
  25.            
  26.         }
  27.     }
  28.    
  29.     return $estado;
  30.        
  31. }
  32.  
  33.  
  34. sub GridC_Click {
  35.    
  36.    
  37.      my ($row, $col) = @_;
  38.  
  39.     my $estado = $GridC->GetCellCheck($row, $col);
  40.    
  41.     my $text = &comprobarMarcados();
  42.    
  43.  
  44.     if ($text==1){
  45.        
  46.         $ventanaC->Button8->Enable();
  47.        
  48.     }elsif ($text==0){
  49.        
  50.         $ventanaC->Button8->Disable();
  51.        
  52.     }
  53.        
  54.     if ($col == 0) {    
  55.         $col = 2;      
  56.         $row++;
  57.  
  58.         my $max_row = $GridC->GetRows();                  
  59.        
  60.         while ($row < $max_row and $GridC->GetCellText($row, $col) ne "*"){
  61.                
  62.             $GridC->SetCellCheck( $row, $col, $estado );  
  63.  
  64.             $row++;                                                
  65.         }
  66.      }  
  67. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Adjuntos
pant3.JPG
pant3.JPG (33.42 KiB) Visto 647 veces
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-10-03 10:50 @493

Si $max_row contiene el número de filas, y $row comienza en 1 (como indica la línea 5), entonces en la línea 8 estás impidiendo que $row nunca valga $max_row (la última línea del Grid).

Debes cambiar el '<' por un '<='.

Lo mismo para la línea 60.
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: Crear interfaz gráfica con Win32::GUI

Notapor Txemaracas » 2011-10-03 16:22 @724

No, eso no me ha funcionado. De hecho no me hace falta, creo que llegue hasta la última línea puesto que la última no tiene check_box. He cambiado un poco el código y la verdad, se activa cuando pulso tanto el grupo como el contacto pero solo se desactiva, por ejemplo, cuando solo está un contacto activado y lo desactivo entonces si se deshabilita el botón. El caso es que cuando está activado el check_box del grupo entero y lo desactivo el botón no se deshabilita.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub comprobarMarcados {
  2.    
  3.     my $max_row = $GridC->GetRows();
  4.     my $row = 1;
  5.     my $col = 0;
  6.     my $estado=0;
  7.     while ($row<$max_row and $estado==0){
  8.        
  9.         if ($col == 0){
  10.            
  11.             $estado = $GridC->GetCellCheck($row, $col);
  12.             $row++;
  13.             $col = 2;
  14.            
  15.             if ($estado == 0){
  16.                
  17.                 while ($GridC->GetCellText($row, $col) ne "*" and $estado==0){
  18.                
  19.                     $estado = $GridC->GetCellCheck($row, $col);
  20.                     $row++;
  21.                
  22.                 }
  23.                 $row++;  
  24.             }
  25.         }
  26.        
  27.         $col = 0;
  28.     }
  29.    
  30.     return $estado;
  31.  
  32. }
Coloreado en 0.001 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 Txemaracas » 2011-10-04 16:40 @736

Hola. Me gustaría saber cómo puedo mostrar una cadena de caracteres como una frase con 10 palabras de esta manera. Creo que con la %s muestro una palabra pero quiero mostrar una cadena ¿cómo puedo hacerlo?

$celda .= sprintf("Frase : %s \r\n\r\n", $text);
Txemaracas
Perlero nuevo
Perlero nuevo
 
Mensajes: 136
Registrado: 2011-04-04 10:06 @462

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron