Um dos primeiros obstáculos que programadores de VB6 ou do eVB quando chegam ao universo .NET é a gestão de múltiplos forms, nomeadamente como passar valores entre forms e alternar entre forms.
Abaixo transcrevo 2 mensagens que enviei para o newsgroup microsoft.public.pt.pocketpc , logo que possa, tansformo num artigo:
> Saudações Pessoal
>
> Não estou conseguindo carregar mais de um formulário no CF com VB.NET.
> Alguém pode dar-me uma dica?
>
> Sabem onde poso conseguir informações sobre tratamento de formulário no
CF?
>
> Fiz várias pesquisas e em todas elas, os exemplos são de apenas um
> formulário.
>
A diferença entre a gestão de forms no eVB e no vb.net é que neste, sendo os forms 'meros' objectos definidos em classes, tens de instanciar os forms para poderes aceder-lhes.
O acto de instanciar consiste em carregar numa variável uma nova instância do form, sobre a qual poderás invocar métodos (.show, .hide, ...) e definir propriedades.
Por ex. para te referires ao form2 a partir do form1 utilizarias algo do tipo...
Dim meuForm2 as form2 = new form2()
meuForm2.label1.text = "Olá mundo!'
Repara que passas a referir-te ao form2 não pelo seu nome, mas pelo da variável que o instanciou.
Esta nova abordagem tem muitas vantagens, como por ex. a partir de um mesmo form teres várias instâncias independentes do mesmo em memória, mas também pode criar confusão, pois se, por ex. a partir do form2 chamasses um form3 e depois pretendesses que o controlo do programa voltasse ao form2 que tinha sido carregado em memória, não poderias voltar a criar uma instância do form2, pois ela seria independente daquela pela qual o utilizador tinha passado. Eu nestes casos sugiro que os forms sejam carregados em variáveis globais, e que aquando da sua utilização se verifique se já foram instanciados, ou não, e se for caso disso, instanciá-los.
Os seguintes links são muito úteis nesta questão:
Moving from Embedded Visual Basic to Visual Basic .NET
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnppc2k3/html/fromemb.asp
Migrating eVB Forms to Visual Basic .NET
http://msdn.microsoft.com/mobility/default.aspx?pull=/library/en-us/dnppcgen/html/migrating_evb_forms.asp
Creating a Multiple Form Application Framework for the Microsoft .NET
Compact Framework
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/netcfuiframework.asp
> Saudações Pessoal
>
> Estou enfrentando alguns problemas quando tenho que navegar entre vários
> formulários.
>
> São 13 formulários (frmTAB01 até frmTAB13) os quais tenho que avançar ou
> retrocedor entre eles.
>
> Ocorre que não estou conseguindo "reter" os dados já digitados. Se digito
> algo em frmTAB01 e em seguida chamo o frmTAB02, quando eu volto para o
>
> frmTAB01 perco tudo.
>
> Alguém tem sugestões de como posso trabalhar com esta qtde. de formulários
> de forma que as informações já inseridas, sejam preservadas?
>
> Obrigado
Uma das maiores diferenças entre o VB.net e o eVB, é a questão como os forms são geridos: enquanto no eVB um form é instanciado quando é carregado, e é referenciado pelo próprio nome, no VB.net os forms têm de ser explicitamente instanciados em variáveis que tenham uma abrangência (scope) de acordo com as necessidades.
O que significa isto aplicado a teu caso? Significa que os dados estão a ser retidos na variável que tinha sido instanciada... a razão pela qual não deves testar a conseguir ver os valores é que quando mudas de forma para um anterior, em vez de reutilizar uma variável global que contém a instância do form com os dados, deves estar a criar uma nova instância.
Uma sugestão pode ser por exemplo criares 13 variáveis, declarando cada uma delas com um form específico:
dim gfrmTab1 as frmTAB1
dim gfrmTab2 as frmTAB2
...
dim gfrmTab13 as frmTAB13
Depois em cada form, por ex. no frmTAB5...
- quando o utilizador quer retroceder, fazes
gfrmTAB4.Show
Me.Hide
- quando o utilizador quer avançar, é preciso ver se a variável já foi
iniciada ou não:
if isnothing(frmTab6) then
gfrmTab6 = new frmTab6
end if
gfrmTab6.Show
A mesma lógica deve ser aplicada aos restantes forms.