• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zephirus

Fechar form antes de abrir outra

25 mensagens neste tópico

Olá a todos,

Na minha aplicação, quando a inicío, além de aparecer a janela principal, aparece de imediato uma outra que serve para o login de users. Quando o user insere os dados pela primeira vez, é pedido que mude a sua password. Para isso, uma outra janela surge no ecrão. Eu quero que ao aparecer essa nova janela, a de login seja fechada mas não estou a conseguir. O meu código é algo do género:

Sub Btn_OkClick(sender As Object, e As EventArgs)
   Select Case CheckIfPasswordIsDefault(txt_username.Text.Replace("'", "").Trim())
      Case = 1
         oldpassword = txt_password.Text.Replace("'", "").Trim()
         Me.Close()
         ChangePassword.ShowDialog()
      Case = 0
         ' Faz login do user
End Select

Apesar de eu utilizar o "Me.Close()", a janela de login não fecha. Penso que tem a ver com o uso do Select Case mas não estou a ver alternativa. Alguém pode ajudar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Além do Select Case, posso usar outro tipo de abordagem para o que pretendo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá a todos,

Na minha aplicação, quando a inicío, além de aparecer a janela principal, aparece de imediato uma outra que serve para o login de users. Quando o user insere os dados pela primeira vez, é pedido que mude a sua password. Para isso, uma outra janela surge no ecrão. Eu quero que ao aparecer essa nova janela, a de login seja fechada mas não estou a conseguir. O meu código é algo do género:

Sub Btn_OkClick(sender As Object, e As EventArgs)
   Select Case CheckIfPasswordIsDefault(txt_username.Text.Replace("'", "").Trim())
      Case = 1
         oldpassword = txt_password.Text.Replace("'", "").Trim()
         Me.Close()
         ChangePassword.ShowDialog()
      Case = 0
         ' Faz login do user
End Select

Apesar de eu utilizar o "Me.Close()", a janela de login não fecha. Penso que tem a ver com o uso do Select Case mas não estou a ver alternativa. Alguém pode ajudar?

Podes utilizar a função if

Sub Btn_OkClick(sender As Object, e As EventArgs)
   If CheckIfPasswordIsDefault(txt_username.Text.Replace("'", "").Trim())=1 then
      oldpassword = txt_password.Text.Replace("'", "").Trim()
         Me.Close()
         ChangePassword.ShowDialog()
      else
         ' Faz login do user
End if
end sub

Para fechares essa janela invés de utilizares o me.close utilizar unload nome da form

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas isso também não me fecha a janela antes de exibir a nova. Não estou mesmo a perceber.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quem é que esta a chamar a Sub Btn_OkClick ?

Por acaso o programa executará a linha changepassword.showdialog() alguma vez?

E será que a linha Me.Close() é executada?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a tentar fechar a form q está dentro do Application.Run(new Form()) ?

Essa form se for fechada a execução do programa termina.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quem é que esta a chamar a Sub Btn_OkClick ?

Por acaso o programa executará a linha changepassword.showdialog() alguma vez?

E será que a linha Me.Close() é executada?

Eu tenho a MainForm visível e o Btn_OKClick é executado quando carrego num botão de outra form. Quando faço isso, ele mostra a form 'changepassword', ou sejam essa linha é de facto executada. A do close é que não.

Estás a tentar fechar a form q está dentro do Application.Run(new Form()) ?

Essa form se for fechada a execução do programa termina.

A form que estou a fechar não é essa, é outra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta Me.hide ou ao form que pretendes ocultar .hide

Pois... também não dá. Estou a deseperar porque isto é um pequeno detalhe mas que precisava mesmo de implementar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E porque não mostras uma janela de login, e só depois a principal ? Se for necessário mostrares a de alteração de password, fazer-o antes de mostrar a principal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E porque não mostras uma janela de login, e só depois a principal ? Se for necessário mostrares a de alteração de password, fazer-o antes de mostrar a principal.

O problema manter-se-ia, creio. De qualquer forma, eu quero ter a main window em fundo, mostrar a de login e se for caso para mostrar a de mudar a password, a de login tem de fechar. Acrescento ainda que se eu cancelar a mudança da password, a de login tem de aparecer de novo. Todas as janelas menos a Main são mostradas como dialog.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, tu é que defines como queres que trabalhe :)

Quando fazes o Me.Close() tens o form principal por trás (aberto) ? Se sim, isto deve chegar:

My Project - Application Tab e no Shutdown Mode seleccionas: "When last form closes".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, tu é que defines como queres que trabalhe :)

Quando fazes o Me.Close() tens o form principal por trás (aberto) ? Se sim, isto deve chegar:

My Project - Application Tab e no Shutdown Mode seleccionas: "When last form closes".

Hmm, não estou no visual studio. Se bem percebo isso é uma opção do visual studio e não da form, correcto?

EDIT: já vi que sim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, pensei que isto fosse fácil. Na volta vou tentar outra abordagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm, assim é mais dificil!

No ficheiro Application.Designer.vb tenta alterar o ShutDownStyle

Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterAllFormsClose

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm, assim é mais dificil!

No ficheiro Application.Designer.vb tenta alterar o ShutDownStyle

Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterAllFormsClose

Ok, já mudei mas o problema mantém-se.

Vou por aqui parte do código:

Sub Btn_OkClick(sender As Object, e As EventArgs)
   Select Case (String.IsNullOrEmpty(txt_username.Text.Replace("'", "").Trim()) Or String.IsNullOrEmpty(txt_password.Text.Replace("'", "").Trim()))
      Case True
         MsgBox("All fields are required.", MsgBoxStyle.Critical, "Incomplete fields")
      Case False
         btn_Ok.Enabled = False
         btn_Exit.Enabled = False
         CheckUserData("checkUserNameAndPassword", txt_username.Text.Replace("'", "").Trim(), GenerateHash(txt_password.Text))
         Select Case exists
            Case = True
            username = txt_username.Text.Replace("'", "").Trim()
            CheckIfPasswordIsDefault(txt_username.Text.Replace("'", "").Trim())
               Select Case defaultpassword
                  Case = 1
                     Me.Close()
                     oldpassword = txt_password.Text.Replace("'", "").Trim()
                     Me.Close()
                     ChangePassword.ShowDialog()
                  Case = 0
.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então não estou a entender ... qual é o form que fechas e qual é problema mesmo. Tenta lá explicar isso melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então não estou a entender ... qual é o form que fechas e qual é problema mesmo. Tenta lá explicar isso melhor.

A minha aplicação tem uma MainForm, uma form de Login e uma form ChangePassword.

Quando inicio, a MainForm é exibida e no load tenho: Login.ShowDialog()

Quando estou na janela de Login, ao colocar os dados de utilizador, este tem de mudar a password. Para tal, eu faço o ChangePassword.ShowDialog() mas antes quero que a de Login desapareça (pensando eu que o Me.Close()) fazia o serviço. E é isto. Se estiver confuso diz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta primeiro abrir o form ChangePassword  primeiro e depois fazes close ao form login.

Do género:

Case = 1
ChangePassword.ShowDialog()                     
Me.Close()
oldpassword = txt_password.Text.Replace("'", "").Trim()
Me.Close()
                     

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta primeiro abrir o form ChangePassword  primeiro e depois fazes close ao form login.

Do género:

Case = 1
ChangePassword.ShowDialog()                     
Me.Close()
oldpassword = txt_password.Text.Replace("'", "").Trim()
Me.Close()
                     

Nada :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dá um pequeno atraso para deixar o form fechar (e desaparecer visualmente)

Public Class Form2

    Private WithEvents tm As New Timer With {.Interval = 50}

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        tm.Start()
        Me.Close()
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        Dim frm As New Form3
        frm.ShowDialog()
    End Sub

End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então é porque o programa nunca chega ao case 1.

Depois deste código:

Case = True
            username = txt_username.Text.Replace("'", "").Trim()
            CheckIfPasswordIsDefault(txt_username.Text.Replace("'", "").Trim())

não terá que vir : Case = False ou Case Else?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dá um pequeno atraso para deixar o form fechar (e desaparecer visualmente)

Public Class Form2

    Private WithEvents tm As New Timer With {.Interval = 50}

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        tm.Start()
        Me.Close()
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        Dim frm As New Form3
        frm.ShowDialog()
    End Sub

End Class

Olá jpaulino. Com esse código já consegui! Mas estou com outro problema. É que agora que vejo a form "ChangePassword" e não vejo a form "Login", se carregar no cancel, quero que o processo seja invertido, ou seja, a form "ChangePassword" feche e abra a de Login. Usei o mesmo código mas no timer_tick diz-me que a form Login já está exibida, quando não está.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já está resolvido! Em vez de user 'Close()', usei 'Hide()' e a sugestão do jpaulino de user um timer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora