Problemas ao fechar aplicação - Fórum DevMedia
Problemas ao fechar aplicação
Senhores, Estou desenvolvendo uma aplicação que tem no evento onActivate do formPrincipal a chamada para a tela de login " Application.CreateForm(TLogin,Login);
Login.Destroy;" Se eu digito o usuario e senha tudo funciona perfeitamente inclusive as validações e nível de acesso, mas se clico no botão cancelar (que deveria fechar as telas) que tem o código "formPrincipal.close;" ele dá um erro que não está encontrando um campo "-------------------------
SCI - Sistema Comercial Integrado
QueryLogin: Field 'cadclifor' not found.
" E trava a aplicação completamente e só consigo fechar a aplicação finalizando o processo. Estou usando Delphi 2009 com Interbase, utilizando o método de acesso IBX. obs: QueryLogin = IBQuery Poderiam por gentileza me ajudar? Grato Antenor
Olá Antenor, A uns dois anos atrás quando fiz esse programa tive o mesmo problema, a aplicação travava e dava a mesma mensagem. Eu estava usando o turbo delphi 2006 no windows vista, se não me engano a solução foi setar o modo de compatibilidade com o XP, para isso clique com o botao direito do mouse sobre o icone do delphi vá em propriedades e na aba compatibilidade ponha uma check mark em compatibidade e selecione windows XP.
No codigo do botão Cancelar mande apenas fechar o banco de dados e encerrar a aplicação: begin ibdatabase.close Application.Terminate; end; Caso não resolva, terá de postar os códigos dos enventos onclose dos forms principal, do login e do ibdatase.
Robson, agradeço gentilmente pelo breve retorno, mas infelizmente não funcionou e no evento onClose dos formulários não tem código. O que você sugere? Já tentei aparentemente de tudo, fiz vários testes mas até agora nada. Muito obrigado
Wilton Procopio
ja me deparei com essa situaçao e resolvi dessa maneira
tente usar esse comando no evento on close
olhe se no evento pode ser que esteja desassociado
oi antenor; vc tentou abrir a query que possui este campo individualmente pra ver se o erro não esta nela? caso ja tenha feito isso, experimente deleta-la e refaze-la, no delphi 2006 já tive este problema e fazendo isso resolveu; Eu uso pra fechar modal de acesso, o mesmo esquema que o robson comentou, mas uso somente o application.terminate, e funciona normalmente; Espero ter ajudado; Sucesso.
Primeiramente... O campo cadclifor existe em sua tabela de login? O que esse campo armazena? Ele é usado logo após o login ou em alguma verificação? vc já tentou: QueryLogin.close; SeuFormPrincipal.Close; Pq um código parecido com esse foi compilado no Delphi 2007 e funcionou perfeitamente. Boa sorte e bons códigos.
Caros Wilton, Silvio, Thiago, Perivaldo e todos que leram o post, agradeço gentilmente pela prontidão de todos vocês que responderam e procuraram me ajudar, mas ainda não deu certo mesmo seguindo a orientação dos senhores, é uma situação bastante estranha, porque em outras ocasiões eu já tinha usado alguns desses códigos para finalizar aplicação e funcionava perfeitamente, mas nesta aplicação não quer funcionar. Wilton, o que você quis dizer com desassociado? Silvio, eu estou trabalhando na plataforma XP professional e Delphi 2009, seguinda a sua orientação eu selecionei a opção Windows 2000 já que não aparece pra mim a opção XP, mas depois disso o Delphi nem abre. Quando você fez esta aplicação foi possível concluí-la? Thiago, não tem nenhuma query propriamente dita, a validação está sendo feita no evento onUpdate de cada action. Perivaldo, o campo cadclifor existe sim, é do tipo char(1), e armazena S ou N, se no cadastro do usuário ele tem S, o menu cadastro de clientes e fornecedores fica habilitado, caso contrário não, segue abaixo o código que estou usando no envento OnUpdate da action: Cad_CliFor.Enabled := (QueryLogin.FieldByName('cadclifor').AsString = 'S'); Já tentei fechar da maneira sugerida mas também dá a mesma mensagem de erro. E o que mais me intriga é que se nós estamos fechando a aplicação ele não deveria fazer mais nenhuma validação e nem procurar este campo ou por nem um outro, já que se eu comentar esta linha ele pula para o próximo código, por exemplo, QueryLogin: Field 'cadprof' not found. Se os senhores tiverem mais uma idéia do que eu posso tentar eu agradeço. Mais uma vez, muito obrigado pela atenção de todos. Tenham um bom dia e uma excelente semana. []´s Antenor
Mudando seu código de OnActivate para OnShow dá o mesmo problema?
Antes de utilizar o "QueryLogin"verifique se o mesmo está ativo.
if QueryLogin.Active then
Perivaldo, se eu mudar para o evento onShow também dá o mesmo problema. Wilson, sim, está aberto. Senhores, segue abaixo o código completo da minha tela de login,
procedure TLogin.btnOKClick(Sender: TObject);
strSqlLog := 'SELECT * FROM usuario, perfil WHERE usuario.nivel = perfil.id ';
strSqlLog := strSqlLog + 'AND fantasia =' + #39 + (ValorNome.Text) + #39;
strSqlLog := strSqlLog + 'AND senha = '+ #39 + (ValorSenha.Text) + #39; menuPrin.QueryLogin.Close;
menuPrin.QueryLogin.SQL.Clear;
menuPrin.QueryLogin.SQL.Add(strSqlLog);
menuPrin.QueryLogin.Open; if not menuPrin.QueryLogin.IsEmpty then
menuPrin.StatusBar1.Panels[2].Text :=
' '+'Usuário: '+ Login.ValorNome.Text+' - '+menuPrin.QueryLogin.FieldByName('dpto').AsString; end
mensagem := 'Nome ou senha do usuário inválidos.' + #13 + #13
+ 'Se você esqueceu sua senha, consulte ' + #13
+ 'o administrador do sistema.'; Application.MessageBox(pchar(mensagem), 'Login não autorizado',
ValorSenha.Text := '';
ValorSenha.SetFocus;
end; end; procedure TLogin.btnCancelarClick(Sender: TObject);
menuPrin.Close;
end; Se tiverem mais uma idéia, por favor, não hesitem em falar, mas já está se tornando uma situação frustrante para mim. Obrigado a todos pela ajuda.
Tente colocar no evento btnCancelarClick:
FreeAndNil( menuPrin );
e no evento OnClose do form de login:
TLogin := nil;
Wilson, ainda não foi desta vez, segui a sua orientação e deu o erro abaixo: ---------------------------
Access violation at address 004D051D in module 'SCI.exe'. Read of address 00000000.
--------------------------- e quando clico em ok aparece o mesmo erro de outrora:
--------------------------- Valeu pela ajuda
Você saberia me dizer em qual linha exatamente está ocorrendo o erro???
E em que local (form e procedimento e/ou componente) está sendo utilizado o "cadclifor"?
Wilson, O cadclifor está sendo usando no procedimento OnUpdate da action Cad_Clifor que está na actionList no menuPrin (tela principal) e é neste procedimento que dá o erro quando clicamos no botão cancelar da tela de login, segue abaixo a única referência ao campo cadclifor. procedure TmenuPrin.Cad_CliForUpdate(Sender: TObject);
Cad_CliFor.Enabled := (QueryLogin.FieldByName('cadclifor').AsString = 'S');
end; Grato
Neste seu SQL, abaixo, ele retorna o campo "cadclifor"???
strSqlLog := strSqlLog + 'AND senha = '+ #39 + (ValorSenha.Text) + #39;
Se a resposta for NÃO, é este o problema.
Caso não seja esta a resposta. Faça o seguinte:
procedure TLogin.btnCancelarClick(Sender: TObject);
procedure TmenuPrin.Cad_CliForUpdate(Sender: TObject);
Sim, entre quase 80 campos retorna sim. Wilson, fiz o que você sugeriu mas ainda não deu certo, estou quase desinstalando o meu Delphi... será que é algum problema específico do delphi? Valeu pela paciência e ajuda. []´s