none
Manupulando forms childs instanciados RRS feed

  • Pergunta

  • Pessoal,

     

    Quando chamo um form child somente com o código Nome_Forme.Show(), o sistema só permitirá abir 1 janela deste form...

    Gostaria que meu sistema deixa-se abrir várias janelas do mesmo form...

     

    Tentei da seguinte forma:

     

    Dim Form As New Nome_Form

    Form.Show()

     

    Desta forma até resolve este problema. Realmente à cada vez que eu clicar no botão que chama o form, abrirá uma nova janela deste form.

    Mas há um problema: Quando neste form, eu chamo um form de pesquisa por exemplo, do form de pesquisa não consigo alterar campos deste form, isto só é possível quando não é chamado como New...

     

    Alguém sabe como posso fazer para contornar esta situação?

     

    Abraços

    terça-feira, 20 de novembro de 2007 04:57

Respostas

  • Daniel,

     

    Conseguí...

    =)

     

    Pensei: "Ao invés de do FormPesquisa eu pegar valor para pesquisa, e rodar a Sub do FormCadastro... fiz ao contrário.... Tentei do próprio FormCadastro chamar o FormPesquisa e já pegar o valor.... e deu certo..."

     

    Assim:

     

     

    '*****FormPesquisa

     

    Public mRegistroPesquisa As String

    Private ConfirmCarregar As Boolean = False

     

    '// Se clicar em OK, carregará e fechará o form...

    ConfirmCarregar = True

    Me.Close

     

    '// Se clicar em Cancelar, não carregará e fechará o form...

    ConfirmCarregar = False

    Me.Close

     

    '// Evento Closing do Form

    If ConfirmCarregar = True Then

         mRegistroPesquisa = [Código que pega o valor da linha célula selecionada no datagrid]

    Else

         mRegistroPesquisa = ""

    End If

    '// Se clicar em Fechar do Form, entrará nesta rotina, sem ConfirmCarregar receber True, portanto não Carregará também...

     

     

     

    '*****FormCadastro

     

    Private mRegistroCadastro As String   '// Esta variavel no caso eu ja tinha no form....

     

    '// Sub que carrega os dados...

    Private Sub Carregar()

    My.Forms.FormPesquisa.ShowDialog()

    mRegistroCadastro = My.Forms.FormPesquisa.mRegistro

    If Not mRegistroCadastro = "" Then

         '// Faz a pesquisa...

         Me.TableAdapter.FillByRegistro(Me.DS.TABELA, mRegistroCadastro)

    End IF

    End Sub

     

    '// (Botão que chamava o FormPesquisa, agora além de chamar, ele já pega o registro selecionado no FormPesquisa, e já faz a pesquisa)

    '// Evento Click do Botão Pesquisar 

    Carregar()

     

     

     

    Agora uma perguntinha boba, que estou apanhando...

    Usando valor string, deu certinho... vejo se ele é nulo e atribuo o valor nulo atravez do código mRegistroCadastro = ""

    Mas agora, se for um Integer, como faço pra deixalo nulo e para ver se estar nulo ?

     

    Abraços

    quarta-feira, 21 de novembro de 2007 10:47

Todas as Respostas

  • Olá Rafael,

     

    Usando o New() voce está criando uma instancia do form, ou seja um objeto.

    Nesse caso, vc somente terá acesso as propriedades que forem públicas desse objeto, então se vc quer mudar o texto de um Label por exemplo, voce precisa criar no seu formulário uma Public Property que acesse e modifique esse valor.

    Assim, a partir da instancia desse form, vc terá acesso a essa propriedade e a partir dela poderá modificar o valor da Label.

    terça-feira, 20 de novembro de 2007 10:54
  • Daniel,

     

    não intendí muito bem

     

    digamos que estou no FormCadastro eu clique no botão pesquisar que abre o FormPesquisa, onde seleciona o registro no datagridview, e clica em OK

    eu pego o ID do registro pelo código Pega_ID_Registro por exemplo

    aí o que preciso fazer é o seguinte

     

    '*** o membro mID_REG do FormCadastro recebe o valor pêgo pelo código Pega_ID_Registro

    My.Forms.frmCadastro.mID_REG = Pega_ID_Registro

     

    *** executar uma Public Sub do FormCadastro

    My.Forms.frmCadastro.PreencheDados(my.Forms.frmCadastro.mID_REG)

     

    '*** fecha o form pesquisa

    Me.Close()

    (tudo isso, sendo executado do FormPesquisa)

     

    Como ficaria?

    Eu teria que definir a propriedade da "Sub PreencheDados(ByVal mID_REG As Integer)" e do "membro mID_REG" como publica? Isto resolveria?

     

    Abraços

    terça-feira, 20 de novembro de 2007 13:38
  • Se vc definir essa sub como PUBLIC, a partir do formPesquisa vc terá acesso a ela.

    terça-feira, 20 de novembro de 2007 15:26
  • Sim sim, e tenho...

     

    você não intendeu qual é o problema...

     

    o problema não é "ter acesso"... acesso eu tenho, rodou, não acusou erro algum...

     

    o problema é que:

    - quando aberto o form como New(), ao atribuir o valor ao membro mID_REG e ao executar a sub, pelo FormPesquisa, não é atribuido o valor ao membro e não preenche os dados....

    - já quando chamado de maneira que não seja uma nova instancia (abre o proprio form), aí funciona normal...

     

    terça-feira, 20 de novembro de 2007 15:34
  • Agora entendi.

    Com o New() vc tem uma instancia desse form em memória, por exemplo: dim form as new frmPesquisa()

    Com isso, vc deve preencher todos os valores que vc quer no objeto "form" antes de dar um form.show()

     

    Voce deve usar o objeto(instancia) e nao o arquivo do form(frm...)
    terça-feira, 20 de novembro de 2007 16:07
  • Puuutz...

    rsrss

     

    é, é o que eu imaginava...

     

    só não sei como vou fazer isso.. rsrss

     

    faz idéia?

     

    terça-feira, 20 de novembro de 2007 16:32
  • rsrsrs...

    Pergunta: pq vc precisa deixar o usuario abrir várias instancias do form?

     

     

    terça-feira, 20 de novembro de 2007 16:43
  • Porquê se no evento que chama o form, eu não colocar como uma nova instancia, colocando apenas FormCadastro.Show()´... não será possível abrir várias janelas deste form, ou seja, se o form já estiver aberto, ao clicar novamente no botão do menu pra abrir outra janela deste form, ele não faz nada, não abre, porque já está aberto...

     

    E preciso que seja possível abrir várias janelas de cadastro de produto por exemplo, para fazer comparações...

     

    A forma que encontrei pra permitir abrir varias, é abrindo como New, mas aí entra neste problema aí....

     

    Entende?

     

    terça-feira, 20 de novembro de 2007 17:03
  • O que eu posso indicar, é vc tentar contornar esse problema de outra forma.

    Abrir o mesmo form N vezes não é uma boa prática, se vc precisa de uma comparação de produtos, tente implementar(construir) essa comparação dentro de um único form, assim vc abre somente ele e resolve o seu problema.

     

    Um recurso muito bom é usar as TabPages para dividir o seu form em várias sessões.

    terça-feira, 20 de novembro de 2007 17:22
  • Boa cara,

     

    É, seria uma boa ideia... deixar tudo na primeira tab, e uma segunta tab com identica

    aí ele opera na primeira, caso queira fazer alguma comparação, ele vai na segunda, e carrega o outro registro na segunda.

    Legal...

     

    Não é bem o que eu queria... mas dá pra contornar bem a situação...

    Hehe

     

    Daniel,

     

    Valew hein...

     

     

    Abraços

    terça-feira, 20 de novembro de 2007 17:40
  • Daniel,

     

    Conseguí...

    =)

     

    Pensei: "Ao invés de do FormPesquisa eu pegar valor para pesquisa, e rodar a Sub do FormCadastro... fiz ao contrário.... Tentei do próprio FormCadastro chamar o FormPesquisa e já pegar o valor.... e deu certo..."

     

    Assim:

     

     

    '*****FormPesquisa

     

    Public mRegistroPesquisa As String

    Private ConfirmCarregar As Boolean = False

     

    '// Se clicar em OK, carregará e fechará o form...

    ConfirmCarregar = True

    Me.Close

     

    '// Se clicar em Cancelar, não carregará e fechará o form...

    ConfirmCarregar = False

    Me.Close

     

    '// Evento Closing do Form

    If ConfirmCarregar = True Then

         mRegistroPesquisa = [Código que pega o valor da linha célula selecionada no datagrid]

    Else

         mRegistroPesquisa = ""

    End If

    '// Se clicar em Fechar do Form, entrará nesta rotina, sem ConfirmCarregar receber True, portanto não Carregará também...

     

     

     

    '*****FormCadastro

     

    Private mRegistroCadastro As String   '// Esta variavel no caso eu ja tinha no form....

     

    '// Sub que carrega os dados...

    Private Sub Carregar()

    My.Forms.FormPesquisa.ShowDialog()

    mRegistroCadastro = My.Forms.FormPesquisa.mRegistro

    If Not mRegistroCadastro = "" Then

         '// Faz a pesquisa...

         Me.TableAdapter.FillByRegistro(Me.DS.TABELA, mRegistroCadastro)

    End IF

    End Sub

     

    '// (Botão que chamava o FormPesquisa, agora além de chamar, ele já pega o registro selecionado no FormPesquisa, e já faz a pesquisa)

    '// Evento Click do Botão Pesquisar 

    Carregar()

     

     

     

    Agora uma perguntinha boba, que estou apanhando...

    Usando valor string, deu certinho... vejo se ele é nulo e atribuo o valor nulo atravez do código mRegistroCadastro = ""

    Mas agora, se for um Integer, como faço pra deixalo nulo e para ver se estar nulo ?

     

    Abraços

    quarta-feira, 21 de novembro de 2007 10:47
  • Conseguí

    fiz assim

     

    No FormCadastro, ao chamar o FormPesquisa clicando no botão Pesquisar, já pega o valor lá do FormPesquisa por aqui mesmo...

     

    Assim...

     

    '*****FormPesquisa

     

    Public mRegistroPesquisa As String

    Private ConfirmPesquisa As Boolean = False

     

    '// Botão OK_Click

    ConfirmPesquisa = True

    Me.Close

     

    '// Botão Cancelar_Click

    ConfirmPesquisa = False

    Me.Close

     

    '// Evento Closing do Form (Obs.: se fechar pelo [x] do form, não recebe True, portanto não pesquisará...

    If ConfirmPesquisa = True Then

         mRegistroPesquisa = [Comando que pega no datagrid o valor à ser pesquisado da linha selecionada]

    Else

         mRegistroPesquisa = ""

    End If

     

     

     

    *****FormCadastro

     

    Private Sub mRegistroCadastro As String

     

    '//Sub que carregará os dados...

    Private Sub Carregar()

    My.Forms.FormPesquisa.ShowDialog()

    mRegistroCadastro = My.Forms.FormPesquisa.mRegistroPesquisa

    If Not mRegistroCadastro = "" Then

         '// Pesquisa pelo cara, carregando os campos

         Me.TableAdapter.FillByRegistro(Me.DS.TABELA, mRegistroCadastro)

    End If

    End Sub

     

    '//Botão Pesquisar_Click

    Carregar()

     

    '// Agora o botão carregar além de chamar o form Pesquisa, ele já pega o valor selecionado no form Pesquisa...

     

     

    Agora só uma coisinha boba que estou apanhando...

    O valor sendo string, o que fizemos foi 

    Se clicar em OK, mRegistro = [valor à ser pesquisado]

    Senão, mRegistro = ""

    Se mRegistro = "" não pesquisará, senão pesquisará...

     

    Como atribuo e verifico o valor nulo em uma variável Integer? não estou conseguindo...

     

     

    Abraços

    quarta-feira, 21 de novembro de 2007 11:01
  • Conseguí

    fiz assim

     

    No FormCadastro, ao chamar o FormPesquisa clicando no botão Pesquisar, já pega o valor lá do FormPesquisa por aqui mesmo...

     

    Assim...

     

    '*****FormPesquisa

     

    Public mRegistroPesquisa As String

    Private ConfirmPesquisa As Boolean = False

     

    '// Botão OK_Click

    ConfirmPesquisa = True

    Me.Close

     

    '// Botão Cancelar_Click

    ConfirmPesquisa = False

    Me.Close

     

    '// Evento Closing do Form (Obs.: se fechar pelo [x] do form, não recebe True, portanto não pesquisará...

    If ConfirmPesquisa = True Then

         mRegistroPesquisa = [Comando que pega no datagrid o valor à ser pesquisado da linha selecionada]

    Else

         mRegistroPesquisa = ""

    End If

     

     

     

    *****FormCadastro

     

    Private Sub mRegistroCadastro As String

     

    '//Sub que carregará os dados...

    Private Sub Carregar()

    My.Forms.FormPesquisa.ShowDialog()

    mRegistroCadastro = My.Forms.FormPesquisa.mRegistroPesquisa

    If Not mRegistroCadastro = "" Then

         '// Pesquisa pelo cara, carregando os campos

         Me.TableAdapter.FillByRegistro(Me.DS.TABELA, mRegistroCadastro)

    End If

    End Sub

     

    '//Botão Pesquisar_Click

    Carregar()

     

    '// Agora o botão carregar além de chamar o form Pesquisa, ele já pega o valor selecionado no form Pesquisa...

     

     

    Agora só uma coisinha boba que estou apanhando...

    O valor sendo string, o que fizemos foi

    Se clicar em OK, mRegistro = [valor à ser pesquisado]

    Senão, mRegistro = ""

    Se mRegistro = "" não pesquisará, senão pesquisará...

     

    Como atribuo e verifico o valor nulo em uma variável Integer? não estou conseguindo...

     

     

    Abraços

    quarta-feira, 21 de novembro de 2007 11:03
  •  

    Conseguí

    fiz assim

     

    No FormCadastro, ao chamar o FormPesquisa clicando no botão Pesquisar, já pega o valor lá do FormPesquisa por aqui mesmo...

     

    Assim...

     

    '*****FormPesquisa

     

    Public mRegistroPesquisa As String

    Private ConfirmPesquisa As Boolean = False

     

    '// Botão OK_Click

    ConfirmPesquisa = True

    Me.Close

     

    '// Botão Cancelar_Click

    ConfirmPesquisa = False

    Me.Close

     

    '// Evento Closing do Form (Obs.: se fechar pelo [x] do form, não recebe True, portanto não pesquisará...

    If ConfirmPesquisa = True Then

         mRegistroPesquisa = [Comando que pega no datagrid o valor à ser pesquisado da linha selecionada]

    Else

         mRegistroPesquisa = ""

    End If

     

     

     

    *****FormCadastro

     

    Private Sub mRegistroCadastro As String

     

    '//Sub que carregará os dados...

    Private Sub Carregar()

    My.Forms.FormPesquisa.ShowDialog()

    mRegistroCadastro = My.Forms.FormPesquisa.mRegistroPesquisa

    If Not mRegistroCadastro = "" Then

         '// Pesquisa pelo cara, carregando os campos

         Me.TableAdapter.FillByRegistro(Me.DS.TABELA, mRegistroCadastro)

    End If

    End Sub

     

    '//Botão Pesquisar_Click

    Carregar()

     

    '// Agora o botão carregar além de chamar o form Pesquisa, ele já pega o valor selecionado no form Pesquisa...

     

     

    Agora só uma coisinha boba que estou apanhando...

    O valor sendo string, o que fizemos foi

    Se clicar em OK, mRegistro = [valor à ser pesquisado]

    Senão, mRegistro = ""

    Se mRegistro = "" não pesquisará, senão pesquisará...

     

    Como atribuo e verifico o valor nulo em uma variável Integer? não estou conseguindo...

     

     

    Abraços

    quarta-feira, 21 de novembro de 2007 11:05
  • OK, parabéns!

     

    Em relação a sua pergunta, tente trabalhar com o numero 0(zero) para tratar nulos.

    Pois, se vc declarar uma variavel Integer e não atribuir nenhum valor a ela, por default, ela iniciará com zero. Assim, vc pode assumir que quando for zero, é por que a var é nula.

     

    Acho que resolve.

    quarta-feira, 21 de novembro de 2007 11:23