ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

exception class EAcessViolation!

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
raphael-godoi
Novato
Novato


Registrado: Sábado, 24 de Novembro de 2007
Mensagens: 43

MensagemEnviada: Sáb Jan 19, 2008 8:43 pm    Assunto: exception class EAcessViolation! Responder com Citação

Oba... blz?

Salve salve.. to gsotando muito desse forum.. hehe resolvi todos os problemas do meu 1º miniSistema...hehe

agora to começando de verdade... usando delphi fazendo conexão por interbase mesmo. ao firebird 2.0..

blz.. ai to fazendo meu form principal.. e o de login.. fiz de boua. ta funcionando normal.. acha o banco.. conecta verifica a senha e o usuario e abre o form principal..

so que ... se no formulario de login eu pedir pra fechar ele ou selecinar o botão de cancelar ele da esse erro "exception class EAcessViolation" no endereço tal tal tal..

ai vai o codigo da minha funçao... eu meio que fiz uma adaptação dela desse tutorial aqui http://www.devmedia.com.br/articles/viewcomp.asp?comp=470

O codigo da funçaõ

Código:
function TfrmLogin.loginvalido(const usuario, senha: string): Boolean;
begin
  dm.Dataset.Close;
  dm.Dataset.SelectSQL.Clear;
  dm.Dataset.SelectSQL.add('select * from USUARIOS');
  dm.Dataset.SelectSQL.add('where USUARIO = '+ QuotedStr(edtusuario.Text));
  dm.Dataset.Open;
  if (dm.Dataset.FieldByName('USUARIO').AsString = edtusuario.Text) and
     (dm.Dataset.FieldByName('SENHA').AsString = edtsenha.Text) then
        Result := true
  else
  Result := false;
  exit;
end;


evendo no OnClick do botão entrar

Código:
procedure TfrmLogin.btnOkClick(Sender: TObject);
begin
  if (edtUsuario.Text = '') then
   begin
    Messagedlg('O campo "Usuário" deve ser preenchido!', mtInformation, [mbOk], 0);
    if edtUsuario.CanFocus then
       edtUsuario.setFocus;
    exit;
   end;

  if (edtSenha.Text = '') then
   begin
    Messagedlg('O campo "Senha" deve ser preenchido!', mtInformation, [mbOk], 0);
    if edtSenha.CanFocus then
       edtSenha.SetFocus;
    exit;
  end;

  if loginvalido(edtUsuario.Text, edtSenha.Text) then
   ModalResult := mrOk
  else
   begin
     inc(tentativas);
     if tentativas < 3 then
      begin
        MessageDlg(Format('Tentativa %d de 3', [tentativas]), mtError, [mbOk], 0);
        if edtSenha.CanFocus then
           edtSenha.SetFocus;
      end
      else
        begin
          MessageDlg(Format('%dª tentativa de acesso ao sistema.', [tentativas]) + #13 + 'A aplicação será fechada!', mtError,[mbOk], 0);
          ModalResult := mrCancel;
        end;
   end;

end;


Me passem uma dica ai.. hehe

brigadão
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fitlbanger
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007
Mensagens: 232
Localização: Cuiabá-MT

MensagemEnviada: Sáb Jan 19, 2008 8:54 pm    Assunto: Responder com Citação

Cara posta ai o codigo do evento onclick do botao cancelar, pois o erro esta neste evento do botao cancelar. Pois se o erro ocorre quando vc clica no cancelar o erro esta neste evento.

Manda ai o codigo para eu dar uma olhada.

T+
_________________
Acredite em você, pois podemos conquistar tudo desde que tenha interesse e dedicação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
raphael-godoi
Novato
Novato


Registrado: Sábado, 24 de Novembro de 2007
Mensagens: 43

MensagemEnviada: Sáb Jan 19, 2008 9:06 pm    Assunto: não tem codigo Responder com Citação

seguinte.. não tem codigo no botão cancelar.. no tutorial que eu descrevi ai o autor(Everson Borges Volaco) diz somente para colocar o modalResult do botão como mrCancel...

mais esse erro ai não é somente quando eu aperto no botão cancelar (esqueci de postar isso perdão!) se eu tentar fechar o form clicando no botão (X) fechar da a mesma coisa.. até com o botão direito na barra de tarefas do windows da na mesma.

via agora tbm.. que quando eu abro uma aba chamada ""classes" (depois de dar o erro..) ele aponta e marca a seguinte linha:

Código:
while FComponents <> nil do


brigado! hehe
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fitlbanger
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007
Mensagens: 232
Localização: Cuiabá-MT

MensagemEnviada: Dom Jan 20, 2008 2:23 am    Assunto: Responder com Citação

Access violation geralmente ocorre quando você usa um objeto antes de criá-lo ou depois de destruí-lo.

Como seu Form de Login esta sendo criado ?

No caso, provavelmente seu form não está na lista de form criados automaticamente quando o programa é iniciado.

Tente colocar este codigo no evento on close do form

Action := caFree;

Boa Sorte

T+
_________________
Acredite em você, pois podemos conquistar tudo desde que tenha interesse e dedicação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
raphael-godoi
Novato
Novato


Registrado: Sábado, 24 de Novembro de 2007
Mensagens: 43

MensagemEnviada: Dom Jan 20, 2008 11:13 am    Assunto: opaa Responder com Citação

eai.. fitlbanger... blz?

e exatamente isso.. so que não é no meu formulario de login não..
resolvi rever como os fomularios estão sendo criados.. e não sei se voce notou mais estou usando um DATAMODULE ai.. e ta ai o erro.. pq quando eu não crio ele... (apesar de qeu não entra no meu DB) mais jah não da erro de accessviolation...

ai vai como os formularios es~tao sendo criados..
Código:
program Syscab;

uses
  Forms,
  Controls,
  SysUtils,
  frmprincipal in 'frmprincipal.pas' {Principal},
  untFrmLogin in 'untFrmLogin.pas' {frmLogin},
  DataModule in 'DataModule.pas' {DM: TDataModule};

{$R *.res}

begin

   Application.Initialize;
   Application.CreateForm(TDM, DM);
   Application.CreateForm(TfrmLogin, frmLogin);

   if FrmLogin.ShowModal = mrOk then //Caso o retorno da tela seja Ok
      begin
        FreeAndNil(frmLogin); //Libera o form de Login da memória
        Application.CreateForm(TPrincipal, Principal); //Cria a janela main
        Application.Run; //Roda a aplicação
      end
    else //Caso o retorno da tela de Login seja mrCancel então
      Application.Terminate; //Encerra a aplicação

end.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fitlbanger
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007
Mensagens: 232
Localização: Cuiabá-MT

MensagemEnviada: Dom Jan 20, 2008 3:32 pm    Assunto: Responder com Citação

Cara pela logica acho que funciona assim, se ele não clicar no botão ok ele executa este comando:

else //Caso o retorno da tela de Login seja mrCancel então
Application.Terminate; //Encerra a aplicação

Tente apenas dar um close ou Action := caFree no lugar de Application.Terminate para testar.

Boa sorte.

T+
_________________
Acredite em você, pois podemos conquistar tudo desde que tenha interesse e dedicação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
raphael-godoi
Novato
Novato


Registrado: Sábado, 24 de Novembro de 2007
Mensagens: 43

MensagemEnviada: Seg Jan 21, 2008 11:19 pm    Assunto: hehe Responder com Citação

Pois é.. não tive sucesso...

acho que o jeito é ir pra outro tipo de fazer o login... alguem tem alguma dica??

vlwww abraço.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fitlbanger
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007
Mensagens: 232
Localização: Cuiabá-MT

MensagemEnviada: Ter Jan 22, 2008 9:59 am    Assunto: Responder com Citação

Cara baixa este exemplo, e um sisteminha que tem um login muito bom eu utilizo ele, da uma olhada no codigo e adpta ele para vc.

Faz o download dele neste link:

www.powerponto.com.br/projeto.rar

Boa sorte

T+
_________________
Acredite em você, pois podemos conquistar tudo desde que tenha interesse e dedicação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sáb Jun 21, 2008 7:15 pm    Assunto: Responder com Citação

Segui esta dica ai que foi postado, para mostrar quantidade de tentativas de senha, mais toda hora abre o formprincipal independente da senha estar correta ou não, ela passa pelo messagedlg e mostra o aviso, mais abre o form assim mesmo. Até se eu deixar os edits em branco esta passando.

Aqui debugando reparei que esta passando
{Application.Initialize;
Application.Title := 'Controle de Classificação do IPI';
Application.CreateForm(Tdm, dm);
Application.CreateForm(Tfrm_Login, frm_Login);
if frm_Login.ShowModal = mrOk then //Caso o retorno da tela seja Ok
begin
FreeAndNil(Frm_Login); //Libera o form de Login da memória
Application.CreateForm(TfrmPrincipal, frmPrincipal); //Cria a janela main
Application.Run; //Roda a aplicação
end
else //Caso o retorno da tela de Login seja mrCancel então
Application.Terminate; //Encerra a aplicação}


Ai tentei uma gambiarra aqui, mas não ficou legal
Código:
Application.Initialize;
  Application.Title := 'Controle de Classificação do IPI';
  {:Aqui chamo primeiro a conexão com o banco}
  Application.CreateForm(Tdm, dm);
  {:Depois vai criar o form frm_Login, que deve estar com a
  propriedade visible do form como False, pois esta sendo criando em
  tempo de projeto, logo após digitado login e senha, é destruido o form
  da memoria para poder entrar no sistema frm_Principal}
  with Tfrm_Login.Create(nil) do
   try
      ShowModal;
      if ModalResult = mrOk then
         Application.CreateForm(TfrmPrincipal, frmPrincipal)
      else if ModalResult = mrRetry then
              Application.CreateForm(Tfrm_Login, frm_Login)
      else if ModalResult = mrCancel then
              Application.Terminate;
   finally
      Free;
      Application.Run;
   end;


e no form de login assim
Código:
procedure Tfrm_Login.btnLogarClick(Sender: TObject);
begin
  if (edUsuario.Text = '') or (edSenha.Text = '') then
  begin
    Messagedlg('O campo "Usuário e Senha" devem ser preenchido!', mtInformation, [mbOk], 0);
    edUsuario.setFocus;
    ModalResult := mrRetry;
    Exit;
  end;
  if loginValido(edUsuario.Text, edSenha.Text) then //Verifica se o login é válido
      ModalResult := mrOk
  else //Caso o login não seja válido então
  begin
    Inc(Tentativas); //Incrementa em 1 o valor da variável tentativas
    if Tentativas < 3 then
    begin
      MessageDlg(Format('Tentativa %d de 3', [Tentativas]), mtError, [mbOk], 0);
      if edSenha.CanFocus then
         edSenha.SetFocus;
         ModalResult := mrRetry ;
         Exit;
      end
      else
      begin
        MessageDlg(Format('%dª tentativa de acesso ao sistema.',
             [Tentativas]) + #13 + 'A aplicação será fechada!', mtError,[mbOk], 0);
         ModalResult := mrCancel;
         Exit;
      end;
  end;
end;


a funçao é a mesma, esta asta funcionando
Código:
function Tfrm_Login.Loginvalido(const usuario, senha: string): Boolean;
begin
  with dm.ibUsuario do
  begin
    Close;
    SelectSQL.Clear;
    SelectSQL.Text := ' select * from USUARIOS    '+
                      ' where USUARIO = :PUSUARIO '+
                      '   and SENHA   = :PSENHA   ';
    ParamByName('PUSUARIO').AsString := edUsuario.Text;
    ParamByName('PSENHA').AsString   := edSenha.Text;
    Open;
    if (FieldByName('USUARIO').AsString = edUsuario.Text) and
       (FieldByName('SENHA').AsString   = edSenha.Text) then
      Result := True
    else
      Result := False;
      Exit;
  end;
end;


Então pessoal, como faço para chamar certo estas restrições no form login e não entrar enquanto não satisfaça a condição no form principal.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Sáb Jun 21, 2008 7:43 pm    Assunto: Responder com Citação

se vc destruir a primeira instacia criada com Application.CreateForm vc pode ter proplemas mesmo.


dê uma olhada no código do Application.CreateForm q vc entenderá.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sáb Jun 21, 2008 7:52 pm    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
se vc destruir a primeira instacia criada com Application.CreateForm vc pode ter proplemas mesmo.


dê uma olhada no código do Application.CreateForm q vc entenderá.


Olá gilsonnrodrigues. como assim eu destrui a primeira instância?


Fiz exatamente como esta no link, e não funciona
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=470

Ai estava tentando fazer funcionar

Então vendo linha a linha ele faz isso
Cai nesta função aqui
Código:
function TComponentList.GetItems(Index: Integer): TComponent;
begin
  Result := TComponent(inherited Items[Index]);
end;

De uma Unit chamada
Código:
{ *********************************************************************** }
{                                                                         }
{ Delphi Runtime Library                                                  }
{                                                                         }
{ Copyright (c) 1995-2001 Borland Software Corporation                    }
{                                                                         }
{ *********************************************************************** }

unit Contnrs;

e vai parar aqui
Código:
if ModalResult = mrOk then
         Application.CreateForm(TfrmPrincipal, frmPrincipal)
      else if ModalResult = mrRetry then
              Application.CreateForm(Tfrm_Login, frm_Login)
      else if ModalResult = mrCancel then
              Application.Terminate;
Para fazer a verificação.

Então amigo como faço para funcionar este negocio, sem precisar desta gambiarra toda?
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sáb Jun 21, 2008 9:03 pm    Assunto: Responder com Citação

Descobri o que tinha aqui

As propriedades ModalResult do Button estava com o Modal setado para mrOk (Por isso sempre ia para o Form Principal pois sempre ele caia aqui if ModalResult = mrOk then)

Código:
Application.Initialize;
  Application.Title := 'AraSystems - Controle de Classificação do IPI';
  {:Aqui chamo primeiro a conexão com o banco}
  Application.CreateForm(Tdm, dm);
  {:Depois vai criar o form frm_Login, que deve estar com a
  propriedade visible do form como False, pois esta sendo criando em
  tempo de projeto, logo após digitado login e senha, é destruido o form
  da memoria para poder entrar no sistema frm_Principal}
  with Tfrm_Login.Create(nil) do
   try
      ShowModal;
      if ModalResult = mrOk then
         Application.CreateForm(TfrmPrincipal, frmPrincipal)
      else
         Application.Terminate;
   finally
      Free;
      Application.Run;
   end;


Código:
procedure Tfrm_Login.BtLoginClick(Sender: TObject);
begin
  if (edUsuario.Text = '') then //Verifica se o campo "Usuário" foi preenchido
  begin
    Messagedlg('O campo "Usuário" deve ser preenchido!', mtInformation, [mbOk], 0);
    if edUsuario.CanFocus then
       edUsuario.SetFocus;
       Exit;
  end;
  if (edSenha.Text = '') then //Verifica se o campo "Senha" foi preenchido
  begin
    Messagedlg('O campo "Senha" deve ser preenchido!', mtInformation, [mbOk], 0);
    if edSenha.CanFocus then
       edSenha.SetFocus;
       Exit;
    end;
    if loginValido(edUsuario.Text, edSenha.Text) then //Verifica se o login é válido
       ModalResult := mrOk
    else //Caso o login não seja válido então
    begin
      inc(tentativas); //Incrementa em 1 o valor da variável tentativas
      if tentativas < 3 then
      begin
        MessageDlg(Format('Tentativa %d de 3', [tentativas]), mtError, [mbOk], 0);
        if edSenha.CanFocus then
           edSenha.SetFocus;
      end
      else
      begin
        MessageDlg(Format('%dª tentativa de acesso ao sistema.',
        [tentativas]) + #13 + 'A aplicação será fechada!', mtError,                [mbOk], 0);
        ModalResult := mrCancel;
      end;
  end;
end;


Coisa simples, mais que da uma dor de cabeça para achar o erro, isso dá.
Rolling Eyes Wink
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB