Problemas ao fechar aplicação

Delphi

04/12/2009

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
Maria Domingues

Maria Domingues

Curtidas 0

Melhor post

Silvio Figueiró

Silvio Figueiró

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.
GOSTEI 1

Mais Respostas

Robson Catunda

Robson Catunda

04/12/2009

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.  
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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
GOSTEI 0
Wilton Procopio

Wilton Procopio

04/12/2009


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


GOSTEI 0
Thiago Silva

Thiago Silva

04/12/2009

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.
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

04/12/2009

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.
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

04/12/2009

Mudando seu código de OnActivate para OnShow dá o mesmo problema?
GOSTEI 0
Wilson Junior

Wilson Junior

04/12/2009

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.
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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.
GOSTEI 0
Wilson Junior

Wilson Junior

04/12/2009

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.
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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
GOSTEI 0
Wilson Junior

Wilson Junior

04/12/2009

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"?
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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
GOSTEI 0
Wilson Junior

Wilson Junior

04/12/2009

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...
GOSTEI 0
Maria Domingues

Maria Domingues

04/12/2009

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  
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/12/2009

tente:

procedure TmenuPrin.Cad_CliForUpdate(Sender: TObject);
begin
  if QueryLogin.Active and (QueryLogin.FieldByName('cadclifor') <> nil) then
    Cad_CliFor.Enabled := (QueryLogin.FieldByName('cadclifor').AsString = 'S');
end;

se passar:
- a tabela pode estar fechada
- a tabela não possui o campo cadclifor
- o dataset está com os campos persistidos e não contém o campo cadclifor na lista.

GOSTEI 0
Marcus Cordeiro

Marcus Cordeiro

04/12/2009

E ai blz? ...   bom, pelo que estou vendo, teu código está fazendo alguma referencia a um campo que, ou não existe fisicamente no banco ou o nome de referencia na Query está escrito errado ou a Query, por um motivo ou outro, está recebendo um valor de parâmetro NULL. De qualquer forma, tenta o seguinte:   no teu formulário principal, tu procura o evento OnCloseQuery e coloca o seguinte:     if application.messagebox('Confirma o fechamento do sistema?','Confirmação!',mb_yesno+mb_iconquestion) = idyes then     begin         dm.Banco.CloseDataSets;         dm.Banco.Connected := false;         application.terminate;     end else canclose := false;   no eu formulário de LOGIN que controla o acesso ao sistema, no botão CANCELAR tu só coloca o seguinte:   form_principal.close;   dai ele dispara o Evento OnCloseQuery fazendo com o que todos os DataSets fechem antes do aplicativo encerrar.     dessa forma, nunca tive problemas, mas de qualquer forma, olha no teu projeto se mesmo clicando em OK pra entrar ou CANCELAR, se está forçando a Query a dar um OPEN sem parâmetro, ou se realmente o campo referenciado na query existe.
GOSTEI 0
POSTAR