Access Violation ao quot;chamarquot; um formulário
Pessoal,
Tenho um formulário no meu projeto que dá uma mensagem de Access Violation no momento em que faço uma chamada a ele. Seja chamando-o através da toolbar, seja através do menu, tanto para pressionar o botão de ok, tanto pro de cancelar...enfim. Andei pesquisando aqui no forum e encontrei uma mensagem q dizia que esse problema é por conta de se fazer uma chamada a um objeto que não está presente na mémoria.
Já tentei ver as chamadas a ele no form principal, sempre antes do showmodal eu peço um application.formcreate. Na unit de origem ele
não é criado, só no momento da chamada. E o free só uso na unit do próprio formulário ao se pressionar o cancelar ou fechar.
Bom, o que eu queria era uma dica ou mais explicações sobre a Access Violation pra ver se consigo resolver esse problema que já está se tornando urgente.
Grata
Ana Davis
[b:bc635263c2][color=red:bc635263c2]Título editado pelo Moderador (AZ) - Removido: ´... Dica ?!??!??!!?´[/color:bc635263c2][/b:bc635263c2]
Tenho um formulário no meu projeto que dá uma mensagem de Access Violation no momento em que faço uma chamada a ele. Seja chamando-o através da toolbar, seja através do menu, tanto para pressionar o botão de ok, tanto pro de cancelar...enfim. Andei pesquisando aqui no forum e encontrei uma mensagem q dizia que esse problema é por conta de se fazer uma chamada a um objeto que não está presente na mémoria.
Já tentei ver as chamadas a ele no form principal, sempre antes do showmodal eu peço um application.formcreate. Na unit de origem ele
não é criado, só no momento da chamada. E o free só uso na unit do próprio formulário ao se pressionar o cancelar ou fechar.
Bom, o que eu queria era uma dica ou mais explicações sobre a Access Violation pra ver se consigo resolver esse problema que já está se tornando urgente.
Grata
Ana Davis
[b:bc635263c2][color=red:bc635263c2]Título editado pelo Moderador (AZ) - Removido: ´... Dica ?!??!??!!?´[/color:bc635263c2][/b:bc635263c2]
Ana Davis
Curtidas 0
Respostas
Beppe
10/02/2004
Eu criei um padrão de uso pra cada tipo de form. Como que você usa o esse seu?
GOSTEI 0
Ana Davis
10/02/2004
Como assim ? Você pode exemplificar ? Ainda não manjo muito de delphi.
Obrigada
Obrigada
GOSTEI 0
Beppe
10/02/2004
Um form modal pode ser assim:
Geralmente deixo os comandos de criação e destruição apenas em class functions do próprio form. Em métodos normais de instância não faço isso.
Mas por exemplo, em forms não-modais, a lógica já é diferente, entende?
type TPasswordForm = class(TForm) ... public class function ShowOptions(var Senha: String): Boolean; ... end; ... class function TPasswordForm.ShowOptions(var Senha: String): Boolean; begin with TPasswordForm.Create(nil) do try Edit1.Text := Senha; if ShowModal = mrOk then begin Senha := Edit1.Text; Result := True; end else Result := False; finally Free; end; end; ...
Geralmente deixo os comandos de criação e destruição apenas em class functions do próprio form. Em métodos normais de instância não faço isso.
Mas por exemplo, em forms não-modais, a lógica já é diferente, entende?
GOSTEI 0
Paulo_amorim
10/02/2004
Olá
Não sei se ajuda...porem 2 testes que, apesar de improvavel, poderiam funcionar:
1. no codigo de chamada, faça um teste:
Isso te mostra se realmente esse form esta ounao criado...
2. ao inves de Application.CreateForm, tente:
Form1 := TForm1.Create(Self);
Form1.ShowModal;
Esses 2 testes nao devem ter TANTA importancia, mas assim cerca-se o problema por todos os lados, e essa seria uma preocupaçao a menos
:!:
Não sei se ajuda...porem 2 testes que, apesar de improvavel, poderiam funcionar:
1. no codigo de chamada, faça um teste:
if Form1 = nil then
begin
ShowMessage(´Nao esta criado´);
Exit; {sair, pois iria dar Access Violation de qualquer forma }
end;
Isso te mostra se realmente esse form esta ounao criado...
2. ao inves de Application.CreateForm, tente:
Form1 := TForm1.Create(Self);
Form1.ShowModal;
Esses 2 testes nao devem ter TANTA importancia, mas assim cerca-se o problema por todos os lados, e essa seria uma preocupaçao a menos
:!:
GOSTEI 0
Ana Davis
10/02/2004
Ok gente, vou fazer algumas tentativas e dou um retorno.
GOSTEI 0
Delmar
10/02/2004
Uso a sintaxe abaixo e nunca tive problemas. Sendo que quase todos os formulários dos aplicativos que produzimos são criados sob demanda (antes de entrar na tela).
try
Application.CreateForm(Tnendereco, nendereco);
nendereco.showmodal;
finally
nendereco.Release;
nendereco:=nil;
end;
try
Application.CreateForm(Tnendereco, nendereco);
nendereco.showmodal;
finally
nendereco.Release;
nendereco:=nil;
end;
GOSTEI 0
Ana Davis
10/02/2004
Gente,
tentei fazer algumas mudanças, mas não adiantou...quer dizer, mudou alguma coisa. Explico: Segui a dica do nosso amigo Paulo mudando a linha application.createform para form1 := Tform1.create(self), nada aconteceu,continuou tudo na mesma. Tentei tirar o showmodal para show, e o Access Violation parou, mas para substituí-la veio uma EExternal Error. Pelo menos sei que alguma coisa tem a haver com o showmodal, ou não, aí não sei dizer...
Tentei tb a dica do Delman...primeiro recebo a msg de EExternal Error e depois se pressionar o run novamente o access violation aparece.
Gostaria da ajuda de vcs.
Abs,
Ana Davis
tentei fazer algumas mudanças, mas não adiantou...quer dizer, mudou alguma coisa. Explico: Segui a dica do nosso amigo Paulo mudando a linha application.createform para form1 := Tform1.create(self), nada aconteceu,continuou tudo na mesma. Tentei tirar o showmodal para show, e o Access Violation parou, mas para substituí-la veio uma EExternal Error. Pelo menos sei que alguma coisa tem a haver com o showmodal, ou não, aí não sei dizer...
Tentei tb a dica do Delman...primeiro recebo a msg de EExternal Error e depois se pressionar o run novamente o access violation aparece.
Gostaria da ajuda de vcs.
Abs,
Ana Davis
GOSTEI 0
Beppe
10/02/2004
Tenta assim então: coloca esse seu form em auto-create forms, e apenas chama Show ou ShowModal quando precisar. O aplicativo mesmo libera o form.
GOSTEI 0
Aroldo Zanela
10/02/2004
Colegas,
Application.CreateForm e o método Create do form não diferem muito entre si, exceto que TApplication.CreateForm() verifica se a propriedade TApplication.MainForm é Nil e se for, atribui o formulário recém criado a application.MainForm. Mas realmente o mais comum é o uso do método Create() do formulário. No entanto, eu particulamente sou viciado no CreateForm da classe TApplication.
A seguir o código apropriado para exibir formulários do tipo Modal:
[i:7d9e06fd04]Mais detalhes - Guia do Desenvolvedor ( Teixeira - Pacheco )[/i:7d9e06fd04]
2. ao inves de Application.CreateForm, tente:
Form1 := TForm1.Create(Self);
Form1.ShowModal;
Application.CreateForm e o método Create do form não diferem muito entre si, exceto que TApplication.CreateForm() verifica se a propriedade TApplication.MainForm é Nil e se for, atribui o formulário recém criado a application.MainForm. Mas realmente o mais comum é o uso do método Create() do formulário. No entanto, eu particulamente sou viciado no CreateForm da classe TApplication.
A seguir o código apropriado para exibir formulários do tipo Modal:
Begin ModalForm := TModalForm.Create(Application); try If ModalForm.ShowModal = mrOk then ... finally ModalForm.Free; ModalForm := Nil; // Assegura que o método Assigned() funcione corretamente. end; // try..finally end; // begin..end
[i:7d9e06fd04]Mais detalhes - Guia do Desenvolvedor ( Teixeira - Pacheco )[/i:7d9e06fd04]
GOSTEI 0
Vinicius2k
10/02/2004
Ana,
vc já pensou q pode não ser necessáriamente uma violação de acesso atrelada ao Showmodal? por acaso vc não está tentando fazer nada mesmo com o form antes de criar? de repente mudando um caption de label ou algo parecido...
eh só uma idéia...
vc já pensou q pode não ser necessáriamente uma violação de acesso atrelada ao Showmodal? por acaso vc não está tentando fazer nada mesmo com o form antes de criar? de repente mudando um caption de label ou algo parecido...
eh só uma idéia...
GOSTEI 0
Delmar
10/02/2004
Dê uma olhada na propriedade visible do form. Já aconteceu para mim que, por acidente de operação do teclado e mouse, acabei setando sem querer para true, e aí, realmente era gerada uma violação de acesso.
Então, se estiver em true, configure para false e experimente.
Inclusive até postei uma mensagem uma vez sobre este problema requerendo ajuda, mas consegui resolver antes de obter resposta.
Depois postei a solução e alguns colegas responderam que isto não tinha nada a ver. Mas para mim resolveu.
Um abraço
Então, se estiver em true, configure para false e experimente.
Inclusive até postei uma mensagem uma vez sobre este problema requerendo ajuda, mas consegui resolver antes de obter resposta.
Depois postei a solução e alguns colegas responderam que isto não tinha nada a ver. Mas para mim resolveu.
Um abraço
GOSTEI 0
Delmar
10/02/2004
Dê uma olhada na propriedade visible do form. Já aconteceu para mim que, por acidente de operação do teclado e mouse, acabei setando sem querer para true, e aí, realmente era gerada uma violação de acesso.
Então, se estiver em true, configure para false e experimente.
Inclusive até postei uma mensagem uma vez sobre este problema requerendo ajuda, mas consegui resolver antes de obter resposta.
Depois postei a solução e alguns colegas responderam que isto não tinha nada a ver. Mas para mim resolveu.
Um abraço
Bem, pesquisei no forum sobre o comentado acima, e vi que isto iria gerar a msg de erro ´cannot make a visible modal´. Então ainda não deve ser a solução para o seu caso.
GOSTEI 0
Caninha51
10/02/2004
Onde é que vc está dando o Free no form?
GOSTEI 0
Ana Davis
10/02/2004
Amigos,
tentei por diversas maneiras acertar o problema da access violation. Fiz o procedimento que o Paulo envio, que o Aroldo enviou, tentei jogar o form para ser criado somente no auto-create, mas nada funcionou...
Em algumas vezes sumia o access violation e aparecia um External Error. Pois bem, acabei apelando em refazer o form. Copiei os componentes e fiz tudo de novo. Nâo resolveu....acho que está tudo atrelado ao FormMain. Deixei o código como estava no inicio:
Agora o que veio a aparecer é um ´Não é possivel exibir o form em showmodal´
Retirei o showmodal e deixei só o show. Parou os erros. Mas sei que não é apropriado, pois o usuário pode acidentalmente clicar na tela de trás e lá se vai o form da frente.
Acabei desistindo um pouco dessa questão e partindo para outras pendencias....mas ainda estou com esperanças de solucioná-lo.
Quem tiver sugestões serão todas bem-vindas.
Abs,
Ana
tentei por diversas maneiras acertar o problema da access violation. Fiz o procedimento que o Paulo envio, que o Aroldo enviou, tentei jogar o form para ser criado somente no auto-create, mas nada funcionou...
Em algumas vezes sumia o access violation e aparecia um External Error. Pois bem, acabei apelando em refazer o form. Copiei os componentes e fiz tudo de novo. Nâo resolveu....acho que está tudo atrelado ao FormMain. Deixei o código como estava no inicio:
Application.CreateForm(TForm1, Form1); Form1.showmodal;
Agora o que veio a aparecer é um ´Não é possivel exibir o form em showmodal´
Retirei o showmodal e deixei só o show. Parou os erros. Mas sei que não é apropriado, pois o usuário pode acidentalmente clicar na tela de trás e lá se vai o form da frente.
Acabei desistindo um pouco dessa questão e partindo para outras pendencias....mas ainda estou com esperanças de solucioná-lo.
Quem tiver sugestões serão todas bem-vindas.
Abs,
Ana
GOSTEI 0
Caninha51
10/02/2004
Geralmente quando acontece isso eh pq a propriedade visible do form esta false.
GOSTEI 0
Beppe
10/02/2004
Existe uma solução melhor, e o certo era usar ShowModal mesmo, mas isso pode resolver:
Coloque esse código no OnDeactivate desse form problemático:
Entao pode usar o Show, e funciona até legalzinho... :)
Coloque esse código no OnDeactivate desse form problemático:
if Visible then BringToFront;
Entao pode usar o Show, e funciona até legalzinho... :)
GOSTEI 0
Ana Davis
10/02/2004
Bom gente,
Olhando direitinho as propriedades do form vi que a Visible estava false, passei para true e a mensagem não apareceu mais.
Quanto ao showmodal, não acertava de jeito nenhum, então usei a dica do Beepe. Chamei o form com show e entrei com a linha BringToFront. Está funcionando bem e, acredito que o assunto estava esclarecido.
Obrigada a todos.
Olhando direitinho as propriedades do form vi que a Visible estava false, passei para true e a mensagem não apareceu mais.
Quanto ao showmodal, não acertava de jeito nenhum, então usei a dica do Beepe. Chamei o form com show e entrei com a linha BringToFront. Está funcionando bem e, acredito que o assunto estava esclarecido.
Obrigada a todos.
GOSTEI 0
Beppe
10/02/2004
Pode colocar um somzinho tb:
OBS: A rotina é Beep, eu sou Beppe :D
if Visible then begin Windows.Beep; BringToFront; end;
OBS: A rotina é Beep, eu sou Beppe :D
GOSTEI 0