Pr0f3t4 0 Denunciar post Postado Janeiro 10, 2010 Tenho um questão a levantar sobre o modo operacional com os pacotes. Sempre tive o hábito de explorar a riqueza dos recursos do DataSource, utilizo a procedure DataChange e StateChange para analisar caso, a caso os registros e claro, o estado da tabela (browse, edit, insert ...) porém, ao implementar a técnica de modularização no projeto da empresa, acabei por descobrir ou, talvez não entender o modo funcional dos pacotes após sua abertura. É onde preciso de muita ajuda da comunidade. Um pequeno exemplo e talvez me entendam, quando verifico se um determinado botão deve aparecer ou não de acordo com uma condição de uma campo, caso o valor seja 0 ou 1, como facilidade, vou disparar o seguinte código no evento DataChange do DataSource: begin with(FormPrincipal)do begin btnAtivar.Visible:=(cdsTabela1RegistroAtivo.Value=1); btnDesativar.Visible:=(cdsTabela1RegistroAtivo.Value=0); end; end; Dessa forma, fica simples e o próprio processador do Delphi no executável se encarrega de resolver se o botão fica ou não ativo. Como esse procedimento se encontra dentro do DataModule que está pra ser criado em tempo de execução (dm_1:=Tdm_1.Create(Self)) ao instanciar o DataModule abro as tabelas que por sua vez dispara seus procedimentos (até aqui tudo bem) porém, um erro de violação acontece: Access Violation at address xxxxxxx in module formulario.bpl. Read of address 00000328. A questão que venho buscando resposta a semana toda é: Por que em modo de execução normal os procedimentos do DataSource não sofreram alteração, o que aconteceu após converter todo o projeto em pacote (.bpl) e passar a gerar essa violação ? Pessoal, preciso mesmo dessa ajuda de vocês, vocês possuem a força. Que a Força do Código Esteja Com Você ! Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Janeiro 11, 2010 Em qual linha de codigo acontece o erro. Quando da erro o Delphi geralmente lhe posiciona na linha do erro. Se possível, poste o trecho de código aonde isto ocorre. Caso o Delphi posicione a linha do erro la no arquivo "Project1.dpr", execute a aplicação passo a passo até surgir o erro. :) Compartilhar este post Link para o post Compartilhar em outros sites
Pr0f3t4 0 Denunciar post Postado Janeiro 12, 2010 begin with(FormPrincipal)do begin btnAtivar.Visible:=(cdsTabela1RegistroAtivo.Value=1); // é aqui que o erro acontece, exatamente no momento da leitura do botão que se encotra no form e da verificação da condição dos dados da tabela, e por diante. btnDesativar.Visible:=(cdsTabela1RegistroAtivo.Value=0); end; end; Compartilhar este post Link para o post Compartilhar em outros sites
Pr0f3t4 0 Denunciar post Postado Janeiro 12, 2010 Parte do problema que venho mencionando está nesta rotina: PackageModule:=LoadPackage(Trim(aArquivos[nItemSelecionado])); if(PackageModule<>0)then begin AClass:=GetClass(Trim(aForms[nItemSelecionado])); if(AClass<>nil)then with(TComponentClass(AClass).Create(Application) as TCustomForm)do begin é onde o pacote é aberto. Vamos lá, o form é criado como TCustomForm (?) e lá dentro do DataSource no evento on DataChange, estou chamando o form pelo seu nome FormComercial que é ainda por cima um fsMDIChild é ae o problema que tem me atormentado, pois o DataModule não está reconhecendo o FormComercial, ele não entende que este form possui ente por ter sido criado como TCustomForm .... Alguém saberia me ajudar ? Compartilhar este post Link para o post Compartilhar em outros sites
Raficcha 1 Denunciar post Postado Janeiro 13, 2010 Estou com dificulldade para enteder o problema. Pode explicar melhor esta parte do TCustomForm? Quando você cria um Form apartir de Um TCustomForm, ele não tem nada. Um TCustomForm não é um TForm, existem diferenças. O TForm estende a classe TCustomForm e tem propriedades que o TCustomForm não tem. Compartilhar este post Link para o post Compartilhar em outros sites