Fórum Erro Violação de Acesso #350740
18/12/2007
0
Tenho no meu sistema um form para entrada de movimentação.
Nele há uma procedure que persiste os dados de um CDS - que está no DM - num banco FB, também ela chama outra procedure que mostra o andamento do processo através de uma progressbar.
Esta procedure roda normalmente se chamada na própria unit, mas quando a chamo de outra unit (formx.procedure) ocorre erro de violação de acesso.
Pelo que percebí, ao tentar alterar a propriedade de um componente qualquer, o erro é gerado.
Eu preciso rodá-la chamando pelo DM, no evento AfterPost de um CDS que lá está para garantir este processamento realizado pela procedure após os dados deste CDS serem persistidos.
Como resolver?
P.S. desculpem se não fui claro no problema e obrigado por qualquer ajuda.
Luciano.badoe
Curtir tópico
+ 0Posts
18/12/2007
Massuda
No seu caso, o tal formx provavelmente já foi destruído quando você tenta usar de outra unit.
Gostei + 0
18/12/2007
Luciano.badoe
Na verdade o que ocorre é o seguinte:
O formX está em modal, nela há um DBGrid cujo CDS está no Data Module.
A procedure está na unit do formX.
Tento executá-la chamando pelo DataModule, no evento AfterPost do CDS, e ai gera o erro.
Se executá-la chamando da unit do formX (onde ela está) não dá erro.
Pelo que posso entender, quando a chamo de fora da unit em que ela está, mesmo com o form ativo, ela não consegue acessar os componentes contidos nele, poi o erro se dá quando tento atualizar um ProgressBar.
Obrigado.
Gostei + 0
18/12/2007
Massuda
Gostei + 0
18/12/2007
Luciano.badoe
A chamada apartir do form principal é essa:
Gostei + 0
18/12/2007
Massuda
AbreForm recebe o parametro aForm por valor, o que significa que aForm é uma cópia de frmDbFolha. Por isso, dentro de AbreForm, quando aForm recebe um valor, esse valor que não é passado para frmDBFolha (pois aForm é uma cópia).
Quando o evento do datamodule dispara, provavelmente ele usa frmDBFolha, que, pelo motivo exposto acima, não tem um valor válido, gerando o AV.
Acho que a solução mais simples é mudar AbreForm para usar passagem de parametros por referencia...
procedure AbreForm(aClasseForm: TComponentClass; var aForm: TForm); ...
Gostei + 0
19/12/2007
Luciano.badoe
Obrigado pela explicação, entendí perfeitamente o problema.
Vou fazer a correção que sugeriu e testar, mas quando vc diz
Você se refere ao metodo usado para abrir o form? Se for o caso, me informe (se possível) um método mais adequando. Estou começando a desenvolver de Delphi, e quero me abtuar às melhores práticas.
obrigado.
Gostei + 0
20/12/2007
Luciano.badoe
Como fica a chamada para CriaForm com a alteração de parâmetro por referência?
Estou tendo este erro: ´[i:9da6e00001]Types of actual and formal var parameters must be identical[/i:9da6e00001]´ quando tento compilar, deixando a chamada como estava.
Tentei alterar a chamada, criando uma variável do tipo TForm, e atribuindo em sua propriedade name o nome do form a ser criado, e passá-la para CriaForm, porém ocorre uma excessão de objeto já existente...
Help...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)