SISTEMA FICA NA MEMORIA
Gostaria de saber se alguém já teve este problema: No meu sistema, tenho um form MDI (Principal) que chama outros filhos ou não. Para sair do sistema, tenho três opções:
1) Pelo menu, faço uma pergunta de deseja sair e UNLOAD ME
2) Pela TOOLBAR, faça a pergunta de deseja sair e UNLOAD ME
3) Através do "X" do MDI. No evento QUERY_UNLOAD, faço a pergunta e se não quiser sair jogo CANCEL=TRUE.
Na primeira opção fica tudo bem , ou seja, se eu verificar os processos ativos o sistema esta fora.
Na segunda opção o sistema sai, mas ao consultar os processos ativos, lá esta ele. Se tentar carregar o sistema novamente, mensagem PROG.EXE causou operação ilegal...bla,bla,bla. Tenho que dar ctrl+alt+del e finalizar a tarefa.
Na terceira opção, ocorre a mesma coisa no 98, mas WinME, ocorre PROG.EXE causou uma operação ilegal...
Vejam, este problema não acontecia antes. Como coloquei no meu projeto um OCX (SmartMenuXP), achei que poderia ser isto, mas a primeira opção funciona, então descartei esta possibilidade. Vejam abaixo o código do evento unload do MDI:
ON ERROR RESUME NEXT
FECHO A CONEXÃO COM O BANCO
FAÇO UM LOOPING PARA FECHAR FOMS CARREGADOS
QUE ESTÃO COMO HIDE
SET NOTHING P/ classes públicas
END
Desculpe ter sido extenso mas meus clientes estão me pressionando.
Obrigado
1) Pelo menu, faço uma pergunta de deseja sair e UNLOAD ME
2) Pela TOOLBAR, faça a pergunta de deseja sair e UNLOAD ME
3) Através do "X" do MDI. No evento QUERY_UNLOAD, faço a pergunta e se não quiser sair jogo CANCEL=TRUE.
Na primeira opção fica tudo bem , ou seja, se eu verificar os processos ativos o sistema esta fora.
Na segunda opção o sistema sai, mas ao consultar os processos ativos, lá esta ele. Se tentar carregar o sistema novamente, mensagem PROG.EXE causou operação ilegal...bla,bla,bla. Tenho que dar ctrl+alt+del e finalizar a tarefa.
Na terceira opção, ocorre a mesma coisa no 98, mas WinME, ocorre PROG.EXE causou uma operação ilegal...
Vejam, este problema não acontecia antes. Como coloquei no meu projeto um OCX (SmartMenuXP), achei que poderia ser isto, mas a primeira opção funciona, então descartei esta possibilidade. Vejam abaixo o código do evento unload do MDI:
ON ERROR RESUME NEXT
FECHO A CONEXÃO COM O BANCO
FAÇO UM LOOPING PARA FECHAR FOMS CARREGADOS
QUE ESTÃO COMO HIDE
SET NOTHING P/ classes públicas
END
Desculpe ter sido extenso mas meus clientes estão me pressionando.
Obrigado
nao use END
o end pode executar operacao ilegal em caso de subclassing
http://www.vbmania.com.br/vbmdetail.php?varID=765
o end pode executar operacao ilegal em caso de subclassing
http://www.vbmania.com.br/vbmdetail.php?varID=765
normalmente eu tenho uma funcao chamada EncerrarPrograma
um exemplo de como eu trabalho
'Saida de Programa
Public Sub EncerrarPrograma()
Dim Frm As Form
Dim Ramal As clsRamal
On Error Resume Next
'Unsubclass de icone
FinalizeTrayIcon
'classe publica
Set DDWin = Nothing
Do While Forms.Count 0
For Each Frm In Forms
Unload Frm
Next Frm
Loop
'limpa itens associados a ramais
For Each Ramal In collRamais
Ramal.RemoveItem
Next Ramal
'classes publicas ou colecoes
Set collRamais = Nothing
Set AdoDCI = Nothing
Set ADONumero = Nothing
End Sub
normalmente no unload do form tb tem sempre coisas como:
Winsock1.close (caso haja uma conexao tcpip)
Timer1.Enabled = false (caso haja algum timer)
fazendo isso nunca tenho problemas...
no caso de controles que consigo o fonte, verifico o font todo para ver se nao tem nada que possa comprometer (encontrei mtas falhas por exemplo em um controle chamado Vertical Menu que tem rodado bastante na net - fiz minhas adaptacoes de release de memoria e agora uso como os outros controles - se isto nao eh possivel, ou crio meu proprio controle baseado no que o controle que encontrei apresenta, ou procuro um novo - se o tempo for critico)
um exemplo de como eu trabalho
'Saida de Programa
Public Sub EncerrarPrograma()
Dim Frm As Form
Dim Ramal As clsRamal
On Error Resume Next
'Unsubclass de icone
FinalizeTrayIcon
'classe publica
Set DDWin = Nothing
Do While Forms.Count 0
For Each Frm In Forms
Unload Frm
Next Frm
Loop
'limpa itens associados a ramais
For Each Ramal In collRamais
Ramal.RemoveItem
Next Ramal
'classes publicas ou colecoes
Set collRamais = Nothing
Set AdoDCI = Nothing
Set ADONumero = Nothing
End Sub
normalmente no unload do form tb tem sempre coisas como:
Winsock1.close (caso haja uma conexao tcpip)
Timer1.Enabled = false (caso haja algum timer)
fazendo isso nunca tenho problemas...
no caso de controles que consigo o fonte, verifico o font todo para ver se nao tem nada que possa comprometer (encontrei mtas falhas por exemplo em um controle chamado Vertical Menu que tem rodado bastante na net - fiz minhas adaptacoes de release de memoria e agora uso como os outros controles - se isto nao eh possivel, ou crio meu proprio controle baseado no que o controle que encontrei apresenta, ou procuro um novo - se o tempo for critico)
eu uso normalmente assim...
coloco em um modulo como publica...
no query unload voce faz a pergunta se deve ou nao fechar - se for sim, eu chamo esta funcao
no seu caso
1) Pelo menu, faço uma pergunta de deseja sair e ENCERRARPROGRAMA
2) Pela TOOLBAR, faça a pergunta de deseja sair e ENCERRARPROGRAMA
3) Através do "X" do MDI. No evento QUERY_UNLOAD, faço a pergunta e se não quiser sair jogo CANCEL=TRUE se for sair ENCERRARPROGRAMA.
coloco em um modulo como publica...
no query unload voce faz a pergunta se deve ou nao fechar - se for sim, eu chamo esta funcao
no seu caso
1) Pelo menu, faço uma pergunta de deseja sair e ENCERRARPROGRAMA
2) Pela TOOLBAR, faça a pergunta de deseja sair e ENCERRARPROGRAMA
3) Através do "X" do MDI. No evento QUERY_UNLOAD, faço a pergunta e se não quiser sair jogo CANCEL=TRUE se for sair ENCERRARPROGRAMA.
Tópico encerrado , respostas não são mais permitidas