CAPÍTULO 3
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini



3.4 Diálogos
Diálogos Personalizados


Além dos diálogos já mencionados, o programador pode criar outros personalizados. Quando um formulário mostra-se de formo Modal, quer dizer, com os métodos ShowModal() ou ShowDialog(), pode retornar um valor inteiro, que serve como indicação da aplicação escolhida Pelo usuário. Vejamos um pequeno exemplo.

Críaremos um programa, com o formulário principal chamado FMain e outro formulário FDialogo. Criaremos também três  pequenos ícones     no     formato    png    e     os     copiamos     para    a    pasta
Figura 19
Figura 19. Formulário FMain e FDialogo
/usr/share/pixmaps do sistema, e os renomeamos a.png, b.png e c.png de forma que os tenhamos disponível na pasta do programa. O formulário principal Fmain terá um PictureBox chamado pImage, e um botão denominado btnSelect com o texto Icone. O formulário Fdialogo disporá de três controles PictureBox, cada um dos contêiner um dos ícones png que criamos no projeto, e os chamamos  pic1, pic2 e pic3.

Com o código do formulário Fdialogo o que conseguiremos é que cada vez que o usuário pressionar um dos controles PictureBox, o formulário que aparece de forma modal, devolve um valor inteiro que identifica o ícone pressionado.

PUBLIC SUB Pic1_MouseDown()

ME.Close (1)

END

PUBLIC SUB Pic2_MouseDown()

ME.Close (2)

END

PUBLIC SUB Pic3_MouseDown()

ME.Close (3)

END
Enquanto o formulário FMain, ao pressionar o botão o conduziremos a mostrar o formulário Fdialogo de forma modal e, em função do valor retornado carregará uma imagem ou outra no PictureBox chamado pImage: Figura 20
Figura 20. Imagens que vamos carregar no PictureBox.

PUBLIC SUB BtnSelect_Click()

SELECT CASE Fdialogo.ShowDialog ( )

CASE 1

pImage.Picture = Picture [ "a.png" ]

CASE 2

pImage.Picture = Picture [ "b.png" ]

CASE 3

pImage.Picture = Picture [ "c.png" ]

END SELECT

END


Ao executa-lo poderemos comprovar o resultado. Se o usuário fechar o formulário modal pressionando o ícone do gestor de janelas, é retornado o valor por padrão, ou seja, zero, o que equivale a cancelar a seleção. Pode apresentar outro problema mais complexo: a necessidade de devolver outro tipo de valores, tais como cadeias e referências a objetos. Neste caso a solução do número inteiro não é válida. Então tratamos de manter uma cadeia em uma variável do formulário, esta se liberará quando fechar o formulário, o qual não nos serve. Por exemplo, modificando o código anterior, da seguinte maneira, para que o formulário Fdialogo mantenha uma cadeia com o valor escolhido.


PUBLIC  Valor AS String

PUBLIC SUB Pic1_MouseDown()

Valor = "a.png"

ME.Close

END

PUBLIC SUB Pic2_MouseDown()

Valor = "b.png"

ME.Close

END

PUBLIC SUB Pic3_MouseDown()

Valor = "c.png"

ME.Close

END


E modificando o formulário principal para que tomo o valor da cadeia:

PUBLIC SUB BtnSelect_Click()

Fdialogo.ShowDialog()

IF Fdialogo.Valor  <>  ""  THEN

pImage.Picture = Picture [ FDialogo.valor ]

END IF

END

Não conseguiremos que funcione, já que a sequência é a seguinte:   

1. A chamada a Fdialogo.ShowDialog() cria uma instância da classe FDialogo.

2. Depois do usuário pressionar, está instância se destruirá e com ela o valor armazenado na variável pública Valor.

3. Ao chamar a FDilogo.valor, se cria uma instancia de FDialogo, que tem a variável Valor com seu valor por padrão (cadeia vazia).

Podemos resolver este problema por dois caminhos:

1. O primeiro consiste em declarar a variável Valor como estática. Assim a variável não depende de cada instância, se não da classe, de forma que não se cria nem se destrói em cada chamada a FDialogo.ShowModal().
2. O segundo consiste em aproveitar a propriedade Persistent  dos formulários. Mudando seu valor para TRUE, um formulário não se destrói quando o usuário o encerra pressionando o ícone de fechar do gestor de janelas, nem se chamar o método Close(), simplesmente oculta-se. Se estava de forma modal, o programa abandona este modo e continua sua execução normal.
Figura 21
Figura 21. Propriedade persistente com o valor TRUE.

Sendo assim, definiremos a propriedade Persistente do formulário FDialogo a  TRUE, e modificaremos o código do formulário FMain para que destrua o formulário de forma explícita depois de ter lido o valor que interessava.

PUBLIC SUB BtnSelect_Click()

Fdialogo.ShowDialog()

IF Fdialogo.Valor  <>  ""  THEN

pImage.Picture = Picture [ FDialogo.valor ]

END IF

FDialogo.delete()

END






Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)