Fórum Access Violation ao quot;chamarquot; um formulário #212955
10/02/2004
0
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
Curtir tópico
+ 0Posts
10/02/2004
Beppe
Gostei + 0
10/02/2004
Ana Davis
Obrigada
Gostei + 0
10/02/2004
Beppe
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
10/02/2004
Paulo_amorim
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
10/02/2004
Ana Davis
Gostei + 0
10/02/2004
Delmar
try
Application.CreateForm(Tnendereco, nendereco);
nendereco.showmodal;
finally
nendereco.Release;
nendereco:=nil;
end;
Gostei + 0
10/02/2004
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
10/02/2004
Beppe
Gostei + 0
10/02/2004
Aroldo Zanela
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
11/02/2004
Vinicius2k
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
11/02/2004
Delmar
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
11/02/2004
Delmar
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
11/02/2004
Caninha51
Gostei + 0
12/02/2004
Ana Davis
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
12/02/2004
Caninha51
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)