 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
raphael-godoi Novato

Registrado: Sábado, 24 de Novembro de 2007 Mensagens: 43
|
Enviada: Sáb Jan 19, 2008 8:43 pm Assunto: exception class EAcessViolation! |
|
|
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 |
|
 |
fitlbanger Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007 Mensagens: 232 Localização: Cuiabá-MT
|
Enviada: Sáb Jan 19, 2008 8:54 pm Assunto: |
|
|
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 |
|
 |
raphael-godoi Novato

Registrado: Sábado, 24 de Novembro de 2007 Mensagens: 43
|
Enviada: Sáb Jan 19, 2008 9:06 pm Assunto: não tem codigo |
|
|
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 |
|
 |
fitlbanger Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007 Mensagens: 232 Localização: Cuiabá-MT
|
Enviada: Dom Jan 20, 2008 2:23 am Assunto: |
|
|
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 |
|
 |
raphael-godoi Novato

Registrado: Sábado, 24 de Novembro de 2007 Mensagens: 43
|
Enviada: Dom Jan 20, 2008 11:13 am Assunto: opaa |
|
|
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 |
|
 |
fitlbanger Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007 Mensagens: 232 Localização: Cuiabá-MT
|
Enviada: Dom Jan 20, 2008 3:32 pm Assunto: |
|
|
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 |
|
 |
raphael-godoi Novato

Registrado: Sábado, 24 de Novembro de 2007 Mensagens: 43
|
Enviada: Seg Jan 21, 2008 11:19 pm Assunto: hehe |
|
|
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 |
|
 |
fitlbanger Aprendiz


Registrado: Quarta-Feira, 6 de Junho de 2007 Mensagens: 232 Localização: Cuiabá-MT
|
Enviada: Ter Jan 22, 2008 9:59 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sáb Jun 21, 2008 7:15 pm Assunto: |
|
|
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 |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Sáb Jun 21, 2008 7:43 pm Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sáb Jun 21, 2008 7:52 pm Assunto: |
|
|
| 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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sáb Jun 21, 2008 9:03 pm Assunto: |
|
|
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á.
 _________________ 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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|