Fechando Form de um componente..
Caros colegas..
Criei um componente chamado SENHA, até aí tudo blz, o problema está na hora de ´matar´ o form principal que é criado no componente. O quê eu quero é o seguinte, no evento OnCreate do form principal do sistema, coloco a procedure P_Activa do componente senha, ele irá criar o forma de login, quando eu clicar em OK, irá fazer as consistencias e validações do acesso do usuario, se estiver tudo correto, deverá ser fechado o FORM de LOGIN e iniciar o form do sistema, o problema é que está dando erro quando do um CLOSE no form do componente, como faço para resolver este problema??
Agradeço a atenção
Cabelo
Criei um componente chamado SENHA, até aí tudo blz, o problema está na hora de ´matar´ o form principal que é criado no componente. O quê eu quero é o seguinte, no evento OnCreate do form principal do sistema, coloco a procedure P_Activa do componente senha, ele irá criar o forma de login, quando eu clicar em OK, irá fazer as consistencias e validações do acesso do usuario, se estiver tudo correto, deverá ser fechado o FORM de LOGIN e iniciar o form do sistema, o problema é que está dando erro quando do um CLOSE no form do componente, como faço para resolver este problema??
Agradeço a atenção
Cabelo
Cabelo
Curtidas 0
Respostas
Tinorj
03/05/2004
Precisamos saber qual o erro ocorrido. Também, pra ficar mais fácil detectar, publique o código, comentando apenas seus testes de validação para proteger seu algoritmo. Quem sabe assim podemos socorrê-lo. Ou não, quem sabe...
:lol:
:lol:
GOSTEI 0
Cabelo
03/05/2004
Caro Colega Celestino..
segue o código..
procedure TSenha.P_AppEnd(Sender: TObject);
begin
try
if s_frmLogin = nil then
begin
P_DestroyComponentsConnection;
P_DestroyConnection;
P_FreeComponentsLogin;
s_frmLogin.Close;
if s_sair then
begin
Application.Terminate;
end;
end;
Except on E:Exception do
begin
MessageDlg(´Erro Terminar o Executável! Contate o Supervisor.´+#1013+
Erro: ´+(E.Message), mterror, [mbOk], 0);
end;
end;
P_DestroyComponentsConnection;
Dou um free em todos os componentes de conexão e acesso ao banco de dados
P_DestroyConnection;
Desconecto e fecho o banco de dados
P_FreeComponentsLogin;
Dou um free em todos os componentes criados dinamicamente
s_frmLogin.Close;
Aqui é que dá o erro, quando fecho o form principal do componente senha..
o seguinte erro :
´Erro : Access violation at adress 00455ECF in module ´Project1.exe´. Read of address 00000000´
depois do OK
´Access violation at address 00000005´
depois disso inicia o sistema, isto é abre o form principal do sistema..
a variável s_sair armazena TRUE, se o botão Sair for clicado, sem efetuar o login, por isso finalizo a aplicação, se não for clicado o botão sair, armazena FALSE..
Agradeço muito sua atenção, se puder me ajudar eu agradeço..
Sem mais
Cabelo
segue o código..
procedure TSenha.P_AppEnd(Sender: TObject);
begin
try
if s_frmLogin = nil then
begin
P_DestroyComponentsConnection;
P_DestroyConnection;
P_FreeComponentsLogin;
s_frmLogin.Close;
if s_sair then
begin
Application.Terminate;
end;
end;
Except on E:Exception do
begin
MessageDlg(´Erro Terminar o Executável! Contate o Supervisor.´+#1013+
Erro: ´+(E.Message), mterror, [mbOk], 0);
end;
end;
P_DestroyComponentsConnection;
Dou um free em todos os componentes de conexão e acesso ao banco de dados
P_DestroyConnection;
Desconecto e fecho o banco de dados
P_FreeComponentsLogin;
Dou um free em todos os componentes criados dinamicamente
s_frmLogin.Close;
Aqui é que dá o erro, quando fecho o form principal do componente senha..
o seguinte erro :
´Erro : Access violation at adress 00455ECF in module ´Project1.exe´. Read of address 00000000´
depois do OK
´Access violation at address 00000005´
depois disso inicia o sistema, isto é abre o form principal do sistema..
a variável s_sair armazena TRUE, se o botão Sair for clicado, sem efetuar o login, por isso finalizo a aplicação, se não for clicado o botão sair, armazena FALSE..
Agradeço muito sua atenção, se puder me ajudar eu agradeço..
Sem mais
Cabelo
GOSTEI 0
Fórum Vini
03/05/2004
Olá Cabelo,
Vc já notou que manda fechar o formulário quando ele é [b:49f989bdf9]nil[/b:49f989bdf9]?
Acho que é esse o seu problema, há algum código executando antes desse que destroi o formulário..(ou o proprietário dele está sendo destruído)
Se possível, poste o código da criação do formulário aqui..
T+,
Vinicius
Vc já notou que manda fechar o formulário quando ele é [b:49f989bdf9]nil[/b:49f989bdf9]?
procedure TSenha.P_AppEnd(Sender: TObject);
begin
try
[b:49f989bdf9]if s_frmLogin = nil then[/b:49f989bdf9]
begin
P_DestroyComponentsConnection;
P_DestroyConnection;
P_FreeComponentsLogin;
[b:49f989bdf9]s_frmLogin.Close;[/b:49f989bdf9]
if s_sair then
begin
Application.Terminate;
end;
end;
Acho que é esse o seu problema, há algum código executando antes desse que destroi o formulário..(ou o proprietário dele está sendo destruído)
Se possível, poste o código da criação do formulário aqui..
T+,
Vinicius
GOSTEI 0
Cabelo
03/05/2004
Caro colega Vinicius
procedure TSenha.P_AppIni(Sender: TObject);
begin
if Application.MainForm <> nil then
begin
P_Connect(F_CreateConnection);
cria uma conexão, e conecta o banco de dados
P_Select(0);
Dou um select dos usuarios
P_CriaForms(s_frmLogin, 0);
Cria o form principal da senha
end;
end;
procedure TSenha.P_CriaForms(l_form : TForm; l_tipo : integer);
begin
case l_tipo of
0 :
begin
l_form := TForm.Create(nil);
with l_form do
begin
Name := ´frmLogin´;
Width := 288;
Height := 137;
Position := poScreenCenter;
BorderIcons := [];
BorderStyle := fbsSizeable;
FormStyle := fsNormal;
Parent := Application.MainForm;
WindowState := wsNormal;
KeyPreview := false;
Caption := ´Login´;
P_Constraints(l_form, l_form.Height, l_form.Width);
Onshow := P_FormShowLogin;
OnClose := P_FormCloseLogin;
P_CriaPanel(l_form, l_tipo);
P_CriaEdit(s_panellogin, l_tipo);
P_CriaLabels(s_panellogin, l_tipo);
P_CriaComboBox(s_panellogin, l_tipo);
P_CriaBotoes(s_panellogin, l_tipo);
end;
end;
agradeço a atenção
procedure TSenha.P_AppIni(Sender: TObject);
begin
if Application.MainForm <> nil then
begin
P_Connect(F_CreateConnection);
cria uma conexão, e conecta o banco de dados
P_Select(0);
Dou um select dos usuarios
P_CriaForms(s_frmLogin, 0);
Cria o form principal da senha
end;
end;
procedure TSenha.P_CriaForms(l_form : TForm; l_tipo : integer);
begin
case l_tipo of
0 :
begin
l_form := TForm.Create(nil);
with l_form do
begin
Name := ´frmLogin´;
Width := 288;
Height := 137;
Position := poScreenCenter;
BorderIcons := [];
BorderStyle := fbsSizeable;
FormStyle := fsNormal;
Parent := Application.MainForm;
WindowState := wsNormal;
KeyPreview := false;
Caption := ´Login´;
P_Constraints(l_form, l_form.Height, l_form.Width);
Onshow := P_FormShowLogin;
OnClose := P_FormCloseLogin;
P_CriaPanel(l_form, l_tipo);
P_CriaEdit(s_panellogin, l_tipo);
P_CriaLabels(s_panellogin, l_tipo);
P_CriaComboBox(s_panellogin, l_tipo);
P_CriaBotoes(s_panellogin, l_tipo);
end;
end;
agradeço a atenção
GOSTEI 0
Fórum Vini
03/05/2004
Algum dos seus botões está com o ModalResult <> mrNone?
Sugestão(off-topic):
Isso não vai afetar o seu problema, mas é bom atribuir um proprietário ao formulário, ao invés de criá-lo assim:
Faça assim:
Sugestão(off-topic):
Isso não vai afetar o seu problema, mas é bom atribuir um proprietário ao formulário, ao invés de criá-lo assim:
l_form := TForm.Create(nil);
Faça assim:
l_form := TForm.Create(Application);
GOSTEI 0
Cabelo
03/05/2004
Vinicius..
obrigado pela dica, mas a resposta da sua pergunta é não, todos eles estão atribuidos com modal resul = mrNone..
obrigado pela atenção..
Cabelo
obrigado pela dica, mas a resposta da sua pergunta é não, todos eles estão atribuidos com modal resul = mrNone..
obrigado pela atenção..
Cabelo
GOSTEI 0
Fórum Vini
03/05/2004
OK, então tente mudar isso:
Para isso:
procedure TSenha.P_AppEnd(Sender: TObject); begin try if s_frmLogin = nil then begin P_DestroyComponentsConnection; P_DestroyConnection; P_FreeComponentsLogin; s_frmLogin.Close; if s_sair then begin Application.Terminate; end; end; ......
Para isso:
procedure TSenha.P_AppEnd(Sender: TObject); begin try if Assigned(s_frmLogin) then begin P_DestroyComponentsConnection; P_DestroyConnection; P_FreeComponentsLogin; s_frmLogin.Close; if s_sair then begin Application.Terminate; end; end; ......
GOSTEI 0
Cabelo
03/05/2004
Caro Colega Vinivius..
Funcionou perfeitamente, era bem o que eu queria, sua ajuda foi grande, mesmo que seja um pequeno detalhe..
agradeço muito..
Um abraço
Cabelo..
Obs : Se precisar estou por aqui, meu mail é cabelo.uni@uol.com.br..
sem mais
Funcionou perfeitamente, era bem o que eu queria, sua ajuda foi grande, mesmo que seja um pequeno detalhe..
agradeço muito..
Um abraço
Cabelo..
Obs : Se precisar estou por aqui, meu mail é cabelo.uni@uol.com.br..
sem mais
GOSTEI 0
Fórum Vini
03/05/2004
Fico feliz por ter dado certo, se precisar de qualquer coisa, meu e-mail é vinifreis@yahoo.com.br
T+,
Vinicius;
T+,
Vinicius;
GOSTEI 0