SISTEMA FICA NA MEMORIA

USUARIO.EXCLUIDOS 25/05/2004 09:51:07
#26518
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

USUARIO.EXCLUIDOS 25/05/2004 10:03:02
#26522
Resposta escolhida
nao use END
o end pode executar operacao ilegal em caso de subclassing
http://www.vbmania.com.br/vbmdetail.php?varID=765

USUARIO.EXCLUIDOS 25/05/2004 10:46:07
#26540
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)

USUARIO.EXCLUIDOS 25/05/2004 11:09:14
#26555
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.
Tópico encerrado , respostas não são mais permitidas