Fórum Access Violation ao quot;chamarquot; um formulário #212955

10/02/2004

0

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]


Ana Davis

Ana Davis

Responder

Posts

10/02/2004

Beppe

Eu criei um padrão de uso pra cada tipo de form. Como que você usa o esse seu?


Responder

Gostei + 0

10/02/2004

Ana Davis

Como assim ? Você pode exemplificar ? Ainda não manjo muito de delphi.
Obrigada


Responder

Gostei + 0

10/02/2004

Beppe

Um form modal pode ser assim:
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?


Responder

Gostei + 0

10/02/2004

Paulo_amorim

Olá

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
:!:


Responder

Gostei + 0

10/02/2004

Ana Davis

Ok gente, vou fazer algumas tentativas e dou um retorno.


Responder

Gostei + 0

10/02/2004

Delmar

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;


Responder

Gostei + 0

10/02/2004

Ana Davis

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


Responder

Gostei + 0

10/02/2004

Beppe

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.


Responder

Gostei + 0

10/02/2004

Aroldo Zanela

Colegas,

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]


Responder

Gostei + 0

11/02/2004

Vinicius2k

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...


Responder

Gostei + 0

11/02/2004

Delmar

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


Responder

Gostei + 0

11/02/2004

Delmar

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.


Responder

Gostei + 0

11/02/2004

Caninha51

Onde é que vc está dando o Free no form?


Responder

Gostei + 0

12/02/2004

Ana Davis

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:
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


Responder

Gostei + 0

12/02/2004

Caninha51

Geralmente quando acontece isso eh pq a propriedade visible do form esta false.


Responder

Gostei + 0

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

Aceitar