[dug-rs] Access Violation quando chamado o form

620 views
Skip to first unread message

Stallone

unread,
May 7, 2010, 8:30:47 AM5/7/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Salve!

Pessoal, to precisando de uma ajuda de vocês. Na aplicação que
desenvolvo, os forms eram criados automaticamente (como é de padrão)
mas como o projeto vem crescendo o exe ficou inviável. Então removi
todos os forms do autocreate e setei para avaliable. Agora quando
chamo o form pelo menu, ele me apresenta um "access violation
******** .bpl". Se clicar no botão ok, ele fecha a mensagem e executa
o form, mas o erro sempre aparece quando tento navegar nas abas que
estão nesse form.

Usando Delphi 2007 e MySQL 5.1


[]'s


--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR

Newton Michel de Oliveira

unread,
May 7, 2010, 8:50:05 AM5/7/10
to dug...@googlegroups.com
Stallone,
   provavelmente seja alguma coisa que não esta sendo criada, via debug você não consegue identificar o problema?

Newton Michel de Oliveira www.nmooliveira.com.br
Mobile 55 51 92358577

Consultor de TI
Embarcadero Delphi 2009 Programming

Public Profile
http://www.linkedin.com/in/newtongaucho

Group Admin
http://www.dug-rs.org

Rodrigo Sebben

unread,
May 7, 2010, 9:02:52 AM5/7/10
to dug...@googlegroups.com
Como voce está fazendo a chamada do form???? antes de dar o show vc faz o Application.CreateForm ? Ao fechar esse form voce está dando release nele ou faz de outra forma?

Rodrigo

Em 7 de maio de 2010 09:30, Stallone <nasciment...@gmail.com> escreveu:

Stallone

unread,
May 7, 2010, 9:18:11 AM5/7/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Opa... então Newton, tentei pelo debug mas também não consegui
identificar. Na execução, passa pelo breakpoint normalmente... mas
quando vai dar o show no form lança o erro.

Rodrigo, no evento coloquei:

begin
Application.CreatForm(TFAtividades, FAtividades);
FAtividades.ShowModal;
FAtividades.Free;
end;


e no evento on close do form:

Action := caFree;
Fatividades := nil;

Wecsley Fey

unread,
May 7, 2010, 10:10:24 AM5/7/10
to DUG-RS
 Rodrigo,

 Teu sistema é modularizado ? Estás chamando um formulário proveniente de uma bpl a partir do executável ? Isto ? 

 Att,
 Wecsley Fey
 Analista de Sistemas
 Aquasoft Tecnologia da Informação
 (51) 3022-3188 - Porto Alegre/RS - Brasil
 Parceira Embarcadero no RS
 http://www.wecsleyfey.com
 http://www.aquasoft.com.br





> Date: Fri, 7 May 2010 05:30:47 -0700
> Subject: [dug-rs] Access Violation quando chamado o form
> From: nasciment...@gmail.com
> To: dug...@googlegroups.com


EM 2009 ACONTECERAM 250.362 FRAUDES NA INTERNET. CLIQUE PARA LER DICAS DE SEGURANÇA.

Gustavo Segalla

unread,
May 7, 2010, 9:14:37 AM5/7/10
to dug...@googlegroups.com
Eu sempre trabalhei assim e nunca tive problemas

resp := Tresp.create ( application );
try
  resp.ShowModal
finally
  resp.Release;
  resp:= nil;
end;





Em 7 de maio de 2010 09:30, Stallone <nasciment...@gmail.com> escreveu:

Gustavo Segalla

unread,
May 7, 2010, 9:25:39 AM5/7/10
to dug...@googlegroups.com
Stallone,

Acredito que vc tem que fazer com um bloco dando o "Free" somente no final... Deve ser essa a exceção gerada.

begin
Application.CreatForm(TFAtividades, FAtividades);
try
   FAtividades.ShowModal;
finnaly
  FAtividades.Free;
end;

end;

Stallone

unread,
May 7, 2010, 10:32:32 AM5/7/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Wecsley,

sim o sistema é modularizado... chamo o form pelo executável. Cada
módulo do sistema tem um executável, e este form pertence a aplicação
que está sendo executada, ou seja estão na mesma bpl.


On 7 maio, 11:10, Wecsley Fey <wecsley...@hotmail.com> wrote:
>  Rodrigo,
>  Teu sistema é modularizado ? Estás chamando um formulário proveniente de uma bpl a partir do executável ? Isto ?
>
>  Att,
>  Wecsley Fey
>  Analista de Sistemas
>  Aquasoft Tecnologia da Informação
>  (51) 3022-3188 - Porto Alegre/RS - Brasil
>  Parceira Embarcadero no RS
>  http://www.wecsleyfey.com
>  http://www.aquasoft.com.br
>
>
>
>
>
> > Date: Fri, 7 May 2010 05:30:47 -0700
> > Subject: [dug-rs] Access Violation quando chamado o form
> > From: nascimentowebdes...@gmail.com
> > To: dug...@googlegroups.com
>
> > Salve!
>
> > Pessoal, to precisando de uma ajuda de vocês. Na aplicação que
> > desenvolvo, os forms eram criados automaticamente (como é de padrão)
> > mas como o projeto vem crescendo o exe ficou inviável. Então removi
> > todos os forms do autocreate e setei para avaliable. Agora quando
> > chamo o form pelo menu, ele me apresenta um "access violation
> > ******** .bpl". Se clicar no botão ok, ele fecha a mensagem e executa
> > o form, mas o erro sempre aparece quando tento navegar nas abas que
> > estão nesse form.
>
> > Usando Delphi 2007 e MySQL 5.1
>
> > []'s
>
> > --
> > Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> > Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> > Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade Delphi do Rio Grande do Sul
> > Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> > Para cancelar a sua inscrição neste grupo, envie um e-mail para
> > dug-rs-un...@googlegroups.com
> > Para ver mais opções, visite este grupo em
> >http://groups.google.com.br/group/dug-rs?hl=pt-BR
>
> _________________________________________________________________
> QUEM VOCÊ QUER SER HOJE NO MESSENGER? TRANSFORME SUA FOTO, É GRÁTIS.http://ilm.windowslive.com.br/?ocid=ILM:ILM:Hotmail:Tagline:1x1:Tagline
>
> --
> Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade Delphi do Rio Grande do Sul
> Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> Para cancelar a sua inscrição neste grupo, envie um e-mail para
> dug-rs-un...@googlegroups.com
> Para ver mais opções, visite este grupo emhttp://groups.google.com.br/group/dug-rs?hl=pt-BR- Ocultar texto das mensagens anteriores -
>
> - Mostrar texto das mensagens anteriores -

Wecsley Fey

unread,
May 7, 2010, 10:41:14 AM5/7/10
to DUG-RS
 Opa,

 Cada módulo do sistema possui uma bpl, isto ? Na chamada do formulário, a bpl que contém o formulário já está instanciada pela aplicação ? 


  Att,
 Wecsley Fey
 Analista de Sistemas
 Aquasoft Tecnologia da Informação
 (51) 3022-3188 - Porto Alegre/RS - Brasil
 Parceira Embarcadero no RS
 http://www.wecsleyfey.com
 http://www.aquasoft.com.br





> Date: Fri, 7 May 2010 07:32:32 -0700
> Subject: [dug-rs] Re: Access Violation quando chamado o form
> From: nasciment...@gmail.com
> To: dug...@googlegroups.com


USE O MESSENGER DENTRO DO HOTMAIL SEM PRECISAR INSTALAR NADA. CLIQUE PARA VER COMO.

Stallone

unread,
May 7, 2010, 1:22:09 PM5/7/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Wecsley

alterei e coloquei conforme a dica do Gustavo mas mesmo assim ainda
continua gerando a exceção.

Analisando aqui... cada sistema está em uma pasta, mas em nenhum deles
tem bpl.
Está checado "Build with runtime packages" e em design packages estão
todos checados também.


Att

Jair - MICROFLEX

unread,
May 7, 2010, 2:52:32 PM5/7/10
to dug...@googlegroups.com
Olá, Stallone!

Há algumas questões a serem observadas:
  • Se você utilizava AutoCreate, os Forms deveriam estar com a propriedade Visible = True. Para usar ShowModal, tem que alterar Visible para False.

  • O uso de "try...finally" é considerada uma "boa prática", mas não é isso que irá gerar ou evitar a geração de uma exceção. Sugiro sua utilização no caso do "ShowModal", que é um processo síncrono. Também sugiro a utilização do método "Release" em vez do "Free" para formulários, que é uma dica da própria Borland desde a versão 5 se não me engano:
    Application.CreatForm(TFAtividades, FAtividades);
    try
      FAtividades.ShowModal;
    finally
      FAtividades.Release;
    end;

  • Usando "ShowModal" não há necessidade de usar o evento "OnClose" para liberar a memória da variável que recebeu o formulário. Isso só faz sentido usando "Show", cujo procedimento padrão do método "Close" é ocultar o formulário ("Hide"), por isso utiliza-se "Action = caFree" quando se pretende destruir em vez de somente ocultar o formulário.

    O mais grave é a linha seguinte no seu exemplo: "FAtividades := nil". Vamos ver se consigo explicar claramente o que ocorre:
    - o usuário clica no "X" do formulário para fechá-lo; nesse momento é executado o método "Close" do formulário, que por sua vez, dispara o evento "OnClose" para saber o desenvolvedor poder interagir com o processo de fechamento do formulário; a variável "Action", passada por referência, é alterada no seu evento "OnClose" para "caFree"; LOGO APÓS É ATRIBUÍDO À VARIÁVEL "FAtividades" O VALOR "nil" (NESSE MOMENTO A VARIÁVEL JÁ NÃO ESTÁ MAIS APONTANDO PARA O FORMULÁRIO QUE ESTÁ CRIADO NA MEMÓRIA!); o processo retorna para o métido "Close" que tenta destruir o formulário e liberar a variável, MAS A VARIÁVEL JÁ NÃO ESTÁ MAIS APONTANDO PARA O FORMULÁRIO, o que deve gerar uma exceção de violação de acesso à memória, pois a variável já está apontando para um ponto "vazio" da memória e não mais para o endereço onde está o formulário.

  • O problema continua na sequência do processo, pois na volta do "ShowModal" chamado pelo botão de acesso ao formulário, você executa "FAtividades.Free". Veja que nesse momento "FAtividades" está apontando para "nil" e não mais para o formulário. Teremos aí outra exceção de acesso à memória.
Você poderia começar limpando o evento "OnClose" do formulário. Opcionalmente poderia optar por usar "Show" em vez de "ShowModal", o que permitiria que fosse aberto (criado) mais de um formulário ao mesmo tempo. Nesse caso teria que alterar a chamada para:
Application.CreatForm(TFAtividades, FAtividades);
FAtividades.Show;
e manter somente a linha "Action := caFree" no "OnClose" do formulário.


Um abraço,
Jair

Em 7 de maio de 2010 10:18, Stallone <nasciment...@gmail.com> escreveu:

Rodrigo Sebben

unread,
May 7, 2010, 3:02:15 PM5/7/10
to dug...@googlegroups.com
Show a explicação...sempre usei o Action = caFree sem entender o que acontecia.... Vlw Jair!

PS: não estou com problema, mas agradeço a explicação...hehehe!

Rodrigo Sebben

Stallone

unread,
May 10, 2010, 8:06:50 AM5/10/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Jair, brilhante cara... brilhante...

fiz as alterações como foram sugeridas aqui e está tudo rodando
normalmente.

Agradeço a todos pela ajuda ae!

Abraço



On 7 maio, 16:02, Rodrigo Sebben <hyuga...@gmail.com> wrote:
> Show a explicação...sempre usei o Action = caFree sem entender o que
> acontecia.... Vlw Jair!
>
> PS: não estou com problema, mas agradeço a explicação...hehehe!
>
> Rodrigo Sebben
>
> Em 7 de maio de 2010 15:52, Jair - MICROFLEX <j...@microflex.com.br>escreveu:
>
>
>
>
>
> > Olá, Stallone!
>
> > Há algumas questões a serem observadas:
>
> >    - Se você utilizava AutoCreate, os Forms deveriam estar com a
> >    propriedade Visible = True. Para usar ShowModal, tem que alterar Visible
> >    para False.
>
> >    - O uso de "try...finally" é considerada uma "boa prática", mas não é
> >    isso que irá gerar ou evitar a geração de uma exceção. Sugiro sua utilização
> >    no caso do "ShowModal", que é um processo síncrono. Também sugiro a
> >    utilização do método "Release" em vez do "Free" para formulários, que é uma
> >    dica da própria Borland desde a versão 5 se não me engano:
> >    Application.CreatForm(TFAtividades, FAtividades);
> >    try
> >      FAtividades.ShowModal;
> >    finally
> >      FAtividades.Release;
> >    end;
>
> >    - Usando "ShowModal" não há necessidade de usar o evento "OnClose" para
> >    liberar a memória da variável que recebeu o formulário. Isso só faz sentido
> >    usando "Show", cujo procedimento padrão do método "Close" é ocultar o
> >    formulário ("Hide"), por isso utiliza-se "Action = caFree" quando se
> >    pretende destruir em vez de somente ocultar o formulário.
>
> >    O mais grave é a linha seguinte no seu exemplo: "FAtividades := nil".
> >    Vamos ver se consigo explicar claramente o que ocorre:
> >    - o usuário clica no "X" do formulário para fechá-lo; nesse momento é
> >    executado o método "Close" do formulário, que por sua vez, dispara o evento
> >    "OnClose" para saber o desenvolvedor poder interagir com o processo de
> >    fechamento do formulário; a variável "Action", passada por referência, é
> >    alterada no seu evento "OnClose" para "caFree"; LOGO APÓS É ATRIBUÍDO À
> >    VARIÁVEL "FAtividades" O VALOR "nil" (NESSE MOMENTO A VARIÁVEL JÁ NÃO ESTÁ
> >    MAIS APONTANDO PARA O FORMULÁRIO QUE ESTÁ CRIADO NA MEMÓRIA!); o processo
> >    retorna para o métido "Close" que tenta destruir o formulário e liberar a
> >    variável, MAS A VARIÁVEL JÁ NÃO ESTÁ MAIS APONTANDO PARA O FORMULÁRIO, o que
> >    deve gerar uma exceção de violação de acesso à memória, pois a variável já
> >    está apontando para um ponto "vazio" da memória e não mais para o endereço
> >    onde está o formulário.
>
> >    - O problema continua na sequência do processo, pois na volta do
> >    "ShowModal" chamado pelo botão de acesso ao formulário, você executa
> >    "FAtividades.Free". Veja que nesse momento "FAtividades" está apontando para
> >    "nil" e não mais para o formulário. Teremos aí outra exceção de acesso à
> >    memória.
>
> > Você poderia começar limpando o evento "OnClose" do formulário.
> > Opcionalmente poderia optar por usar "Show" em vez de "ShowModal", o que
> > permitiria que fosse aberto (criado) mais de um formulário ao mesmo tempo.
> > Nesse caso teria que alterar a chamada para:
> > Application.CreatForm(TFAtividades, FAtividades);
> > FAtividades.Show;
> > e manter somente a linha "Action := caFree" no "OnClose" do formulário.
>
> > Um abraço,
> > Jair
>
> > Em 7 de maio de 2010 10:18, Stallone <nascimentowebdes...@gmail.com>escreveu:
>
> > Opa... então Newton, tentei pelo debug mas também não consegui
> >> identificar. Na execução, passa pelo breakpoint normalmente... mas
> >> quando vai dar o show no form lança o erro.
>
> >> Rodrigo, no evento coloquei:
>
> >> begin
> >> Application.CreatForm(TFAtividades, FAtividades);
> >> FAtividades.ShowModal;
> >> FAtividades.Free;
> >> end;
>
> >> e no evento on close do form:
>
> >> Action := caFree;
> >> Fatividades := nil;
>
> >> --
> >> Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> >> Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> >> Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade
> >> Delphi do Rio Grande do Sul
> >> Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> >> Para cancelar a sua inscrição neste grupo, envie um e-mail para
> >> dug-rs-un...@googlegroups.com
> >> Para ver mais opções, visite este grupo em
> >>http://groups.google.com.br/group/dug-rs?hl=pt-BR
>
> >  --
> > Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> > Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> > Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade
> > Delphi do Rio Grande do Sul
> > Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> > Para cancelar a sua inscrição neste grupo, envie um e-mail para
> > dug-rs-un...@googlegroups.com
> > Para ver mais opções, visite este grupo em
> >http://groups.google.com.br/group/dug-rs?hl=pt-BR
>
> --
> Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade Delphi do Rio Grande do Sul
> Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> Para cancelar a sua inscrição neste grupo, envie um e-mail para
> dug-rs-un...@googlegroups.com
> Para ver mais opções, visite este grupo emhttp://groups.google.com.br/group/dug-rs?hl=pt-BR- Ocultar texto das mensagens anteriores -
>
> - Mostrar texto das mensagens anteriores -

Reply all
Reply to author
Forward
0 new messages