Fórum Fechando Form de um componente.. #229597

03/05/2004

0

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


Cabelo

Cabelo

Responder

Posts

03/05/2004

Tinorj

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:


Responder

Gostei + 0

03/05/2004

Cabelo

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


Responder

Gostei + 0

03/05/2004

Fórum Vini

Olá Cabelo,
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


Responder

Gostei + 0

03/05/2004

Cabelo

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


Responder

Gostei + 0

03/05/2004

Fórum Vini

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:
l_form := TForm.Create(nil);

Faça assim:
l_form := TForm.Create(Application); 



Responder

Gostei + 0

03/05/2004

Cabelo

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


Responder

Gostei + 0

03/05/2004

Fórum Vini

OK, então tente mudar 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;
......



Responder

Gostei + 0

04/05/2004

Cabelo

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


Responder

Gostei + 0

04/05/2004

Fórum Vini

Fico feliz por ter dado certo, se precisar de qualquer coisa, meu e-mail é vinifreis@yahoo.com.br


T+,
Vinicius;


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar