Problemas ao fechar aplicação

04/12/2009

9

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.ShowModal;
    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.
---------------------------
OK  
---------------------------
" 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
Responder

Post mais votado

04/12/2009

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.
Responder

Mais Posts

04/12/2009

Robson Catunda

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.  
Responder
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
Responder

ja me deparei com essa situaçao e resolvi dessa maneira


tente usar esse comando no evento on close


action:=cafree;


 olhe se no evento pode ser que esteja  desassociado


Responder

05/12/2009

Thiago Silva

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.
Responder
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.
Responder
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
Responder
Mudando seu código de OnActivate para OnShow dá o mesmo problema?
Responder

07/12/2009

Wilson Junior

Antes de utilizar o "QueryLogin"verifique se o mesmo está ativo.
Exemplo:
  if  QueryLogin.Active then
    //coloque aqui o seu código

Espero ter ajudado.
Responder
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);
var
  strSqlLog: string;
  mensagem: string;
begin
    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
    begin
      menuPrin.StatusBar1.Panels[2].Text :=
      ' '+'Usuário: '+ Login.ValorNome.Text+' - '+menuPrin.QueryLogin.FieldByName('dpto').AsString;     end
    else
    begin
      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',
          MB_OK+MB_ICONERROR);
      ValorSenha.Text := '';
      ValorSenha.SetFocus;
      ModalResult := mrNone;
    end; end; procedure TLogin.btnCancelarClick(Sender: TObject);
begin
  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.
Responder

07/12/2009

Wilson Junior

Tente colocar no evento btnCancelarClick:

menuPrin.Close;
FreeAndNil( menuPrin );
ModalResult := mrCancel;


e no evento OnClose do form de login:

Action := caFree;
TLogin := nil;


Espero ter ajudado.
Responder
Wilson, ainda não foi desta vez, segui a sua orientação e deu o erro abaixo: ---------------------------
SCI - Sistema Comercial Integrado
---------------------------
Access violation at address 004D051D in module 'SCI.exe'. Read of address 00000000.
---------------------------
OK  
--------------------------- e quando clico em ok aparece o mesmo erro de outrora:
---------------------------
SCI - Sistema Comercial Integrado
---------------------------
QueryLogin: Field 'cadclifor' not found.
---------------------------
OK  
--------------------------- Valeu pela ajuda
Responder

07/12/2009

Wilson Junior

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"?
Responder
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);
begin
    Cad_CliFor.Enabled := (QueryLogin.FieldByName('cadclifor').AsString = 'S');
end; Grato
Responder

07/12/2009

Wilson Junior

Neste seu SQL, abaixo, ele retorna o campo "cadclifor"???

  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;

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);
begin
  Application.Terminate;
end;

procedure TmenuPrin.Cad_CliForUpdate(Sender: TObject);
begin
  if not Application.Terminated then
    Cad_CliFor.Enabled := (QueryLogin.FieldByName('cadclifor').AsString = 'S');
end;

Vamos ver se da certo...
Responder
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  
Responder