DETERMINAR SE UM FORM ESTA CARREGADO
Olá pessoal ! Criei a seguinte laço paras verificar se um Form está carregado:
Funciona bem. Mas quando tento implementar a seguinte função, da erro:
Faço a seguinte chamada:
Onde cadastro_clientes é um Formulário do VB6.
O erro é o seguinte: User-define type not defined
Se eu fizer apenas o laço, fora da função, da certo:
O erro está no tipo da variável. Mas para qual tipo frm deve ser declarada? Isso me tirou o sono noite passada.
Dim frmFind As Form
For Each frmFind In Forms
If TypeOf frmFind Is frm Then
gbFc_FormLoad = True
Exit For
End If
Next
Funciona bem. Mas quando tento implementar a seguinte função, da erro:
Function gbFc_FormLoad(frm As Form) As Boolean
gbFc_FormLoad = False
Dim frmFind As Form
For Each frmFind In Forms
If TypeOf frmFind Is frm Then
gbFc_FormLoad = True
Exit For
End If
Next
End Function
Faço a seguinte chamada:
If gbFc_FormLoad (cadastro_clientes) Then MsgBox [Ô]Ok[Ô]
Onde cadastro_clientes é um Formulário do VB6.
O erro é o seguinte: User-define type not defined
Se eu fizer apenas o laço, fora da função, da certo:
Dim frmFind As Form
For Each frmFind In Forms
If TypeOf frmFind Is cadastro_clientes Then
gbFc_FormLoad = True
Exit For
End If
Next
O erro está no tipo da variável. Mas para qual tipo frm deve ser declarada? Isso me tirou o sono noite passada.
pq vc não passa o nome do form como string
e no seu laço vc compara com o name do form com o parâmetro
e no seu laço vc compara com o name do form com o parâmetro
Estou enviando o exemplo teste para ajustar esta função. Ela funciona mesmo que a função tenha sida chamada de outro form ou do módulo:
Segue o código corrigido:
Segue o código corrigido:
Function gbFc_FormLoad(Frm As Form) As Boolean
gbFc_FormLoad = False
Dim frmFind As Form
For Each frmFind In Forms
If TypeOf frmFind Is Form Then
If frmFind.Name = Frm.Name Then
gbFc_FormLoad = True
Exit For
Else
gbFc_FormLoad = False
End If
End If
Next
End Function
Eu já tinha chegado a essa solução. Mas não da certo. Não no meu caso. Quando a comparação é feita pelo nome ou qualquer outra propriedade do objeto, este é carregado. Por exemplo, se possuo um MDI Child, não carregado, e verifico, através da função, se ele está carregado, eu disparo o evento Load dele (carregando o form). E neste caso ele é aberto e exibido. Mesmo para formulários normais. Faça o teste, colocando no evento Load de um Form um MsgBox. Verão que ele é disparado quando a função é chamada com o nome dele.
Em resumo, a função verifica se o Form está ou não carregado. Se ele não estiver, ela o carregará. Então a abordagem não funciona. A questão continua sendo o tipo de objeto. Hoje a noite irei pesquisar com mais calma sobre o assunto.
Só um detalhe: o Else é desnecessário, uma vez que gbFc_FormLoad inicia-se com False.
Em resumo, a função verifica se o Form está ou não carregado. Se ele não estiver, ela o carregará. Então a abordagem não funciona. A questão continua sendo o tipo de objeto. Hoje a noite irei pesquisar com mais calma sobre o assunto.
Só um detalhe: o Else é desnecessário, uma vez que gbFc_FormLoad inicia-se com False.
Diante do exposto, teste essa nova função. Exemplo anexo
Public Function gbFc_FormLoad(Frm As Form) As Boolean
Dim v As Integer
gbFc_FormLoad = False
For v = 1 To Forms.Count - 1
If Forms(v).Name = Frm.Name Then gbFc_FormLoad = True
Next
End Function
de uma olhada nesse exemplo amigo HIDDEN
Prezado ROBIU, a abordagem é exatamente a mesma. A função, quando faz a comparação detecta que o Form NÃO está carregado. Mas ao fazer isso (comparando pelo Nome), ela o carrega. Não sei exatamente porque o VB se comporta assim. Talvez para foder com a gente.
JWCELYO, seu exemplo também detecta que o Form não está carregado, mas ao fazer isso instanciando uma propriedada ( If Form2.Visible Then ), você o carregará. Faça um teste: no evento Load do Form2, coloque o seguinte código:
Verá que ao clicar no botão, terá o MsgBox disparado.
Não adianta eu verificar se está carregado, e se não estiver, ele ser carregado.
JWCELYO, seu exemplo também detecta que o Form não está carregado, mas ao fazer isso instanciando uma propriedada ( If Form2.Visible Then ), você o carregará. Faça um teste: no evento Load do Form2, coloque o seguinte código:
Private Sub Form_Load()
MsgBox [Ô]teste[Ô]
End Sub
Verá que ao clicar no botão, terá o MsgBox disparado.
Não adianta eu verificar se está carregado, e se não estiver, ele ser carregado.
eu tentei o codigo da seguinte maneira e funcionou.
Function gbFc_FormLoad(frm As form) As Boolean
gbFc_FormLoad = False
Dim frmFind As form
For Each frmFind In Forms
If frmFind Is frm Then
gbFc_FormLoad = True
Exit For
End If
Next
End Function
Realmente, quando executo a primeira fez funciona mas depois fica errado. Tirei a comparação e adicionei uma msgbox sim/não para verificar o resultado. Tambem coloquei Msgboxs no load dos forms. Só aparece a mensagem do Load se o form não estiver aberto e o usuário confirmar a abertura. Antes estava abrindo o form antes da confirmação. Se ainda não for o que precisa, cria um projeto exemplo com o que está acontecendo e comenta o que você quer que aconteça.
RFTD, exatamente. Como não foi preciso fazer referência a nenhuma propriedade do Form a ser verificado, ele não foi inciado. Agora a função ficou correta !
Tópico encerrado , respostas não são mais permitidas