DETERMINAR SE UM FORM ESTA CARREGADO

HIDDEN 22/12/2009 12:58:47
#330277
Olá pessoal ! Criei a seguinte laço paras verificar se um Form está carregado:

     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.
MARCOSLING 22/12/2009 13:14:39
#330284
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
ROBIU 22/12/2009 15:08:40
#330301
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:
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
HIDDEN 23/12/2009 09:54:05
#330363
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.
ROBIU 23/12/2009 11:58:52
#330377
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

JWCELYO 23/12/2009 12:25:20
#330378
de uma olhada nesse exemplo amigo HIDDEN
HIDDEN 23/12/2009 17:11:11
#330400
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:

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.
RFTD 23/12/2009 19:07:30
#330404
Resposta escolhida
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

ROBIU 24/12/2009 07:44:39
#330423
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.
HIDDEN 24/12/2009 11:51:51
#330440
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