Ednilson Postado Dezembro 12, 2008 Denunciar Share Postado Dezembro 12, 2008 Aop!!!! to com problema com herança em delphi,tenho duas variaveis no form paiuma boolean e outra Integer. Tenho um form padrão cadastro e um form padrãoconsulta,quando estou no form consulta passo um parametro pra variavel Integer doform pai e abro o form cadastro com esse parametro mas ele fica sempre zero.alguém sabe porque? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Dezembro 12, 2008 Denunciar Share Postado Dezembro 12, 2008 Aop!!!! to com problema com herança em delphi,tenho duas variaveis no form paiuma boolean e outra Integer. Tenho um form padrão cadastro e um form padrãoconsulta,quando estou no form consulta passo um parametro pra variavel Integer doform pai e abro o form cadastro com esse parametro mas ele fica sempre zero.alguém sabe porque?Ednilson, sem ver como você está fazendo isto, fica difícil, porque com certeza algo está errado. Voce vai precisar postar parte do código onde faz este procedimento bem como o header do form onde estão as declarações. (acho que deve ser o suficiente para uma avaliação do problema)Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ednilson Postado Dezembro 13, 2008 Autor Denunciar Share Postado Dezembro 13, 2008 (editado) Aop!!!! to com problema com herança em delphi,tenho duas variaveis no form paiuma boolean e outra Integer. Tenho um form padrão cadastro e um form padrãoconsulta,quando estou no form consulta passo um parametro pra variavel Integer doform pai e abro o form cadastro com esse parametro mas ele fica sempre zero.alguém sabe porque?Ednilson, sem ver como você está fazendo isto, fica difícil, porque com certeza algo está errado. Voce vai precisar postar parte do código onde faz este procedimento bem como o header do form onde estão as declarações. (acho que deve ser o suficiente para uma avaliação do problema)AbraçosTa ai tudo q utilizo e já mostrando os erros: //Metodo para inserir definido no formPai procedure TfrmPai.NovoRegistro(ClasseForm: TFormClass;pID: Integer);varform : TForm;beginTryapplication.CreateForm(ClasseForm,form);inserir := true;//defini como truetabCadastro.Cancel;//parametro q vem do formCadastro{aki ta dando o erro {Acces Violation}tabCadastro.Append;tabCadastro.FieldByName('ID').AsInteger := GenProximoID(Generator);form.ShowModal;FinallyFreeAndNil(form);End;end;No formulario de consulta chamo dessa forma:procedure TfrmConsFuncionarios.btnNovoClick(Sender: TObject);begininherited;NovoRegistro(TfrmCadFuncionarios);//passo a Classe do formCadastro como parametroend;Evento quando o formCadastro é criado:procedure TfrmCadFuncionarios.FormCreate(Sender: TObject);begininherited;dmCadFuncionarios := TdmCadFuncionarios.Create(Self);dmCadFuncionarios.cdsCadastro.Open;//passo os outros parametros{tabela e generator}tabCadastro := dmCadFuncionarios.cdsCadastro;Generator := 'GEN_FUNCIONARIOS_ID';end;E e pra Editar tenho este metodo no form Pai:procedure TfrmPai.Editar(pID: Integer);varID : Integer;begintabCadastro.Close;//aki também da o erro{Violaçao de Memoria}tabCadastro.FetchParams;tabCadastro.Params.ParamByName('pID').AsInteger := ID;tabCadastro.Open;end;o metodo é chamdo da seguinte forma:procedure TfrmConsFuncionarios.btnEditarClick(Sender: TObject);begininherited;Editar(tabConsulta.fieldByName('ID').AsInteger);//parametro para ediçao também não consegui resolve essa parteend;As variaveis q utilizo:public{todas no form Pai}tabCadastro,tabConsulta : Tclientdataset;sqlConsulta : TSQLQuery;Generator : String;inserir : Boolean;pIDCadastro : Integer; Editado Dezembro 13, 2008 por Ednilson Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 (editado) Ednilson, nos próximos posts, onde existir código, faça a gentileza de utilizar a tag CODE para que a identação do código seja mantida e sua leitura facilitada. É desanimador ler códigos longos sem identação - não consegue-se visualizar facilmente as estruturas lógicas.Segundo o que consta no seu tópico no forum DevMedia, sua estrutura de herança é:TfrmPai +--> TfrmMestreConsulta | +--> TfrmConsFuncionarios | +--> : | +--> : +--> TfrmMestreCadastro +--> TfrmCadFuncionarios | +--> : +--> :e você diz que as variáveis referentes aos datasets estão declaradas na sessão public da classe TfrmPai:public{todas no form Pai}tabCadastro,tabConsulta : Tclientdataset;sqlConsulta : TSQLQuery;Tanto no código que você postou no DevMedia, quanto no que postou aqui, percebo que você inicializa o tabCadastro, no evento OnCreate do form TfrmCadFuncionarios, a partir da atribuição do endereço do dataset que existe no datamodule dmCadFuncionarios, também criado neste evento. Isto deve estar funcionando bem para o caso de quando você utilizar o botão de inclusão (btnNovo) - ao menos em uma primeira execução - porque neste momento, você chama o método NovoRegistro da classe TfrmPai o qual criará o form frmCadFuncionarios, que na seqüência será mostrado (ShowModal) e, ao ser fechado o form, este será eliminado através da chamada FreeAndNil.Entretanto, quando você utiliza o botão btnEditar, o seu método Editar, simplesmente utiliza a variável tabCadastro - que estará apontando para onde??? (Sabe-se lá. Esse o motivo do erro logo na primeira linha em que você a referencia)Acho que duas observações seriam pertinentes:1) o dmCafFuncionarios, assim como o frmCadFuncionarios, deveria estar sendo liberado da memória - o que não consta do código (talvez, no OnDestroy ou OnClose do frmCadFuncionarios você esteja fazendo isto, mas não citou)2) ao usar a opção de edição, pela lógica, você deveria novamente criar o frmCadFuncionarios, o que criaria o dmCadFuncionarios e inicializaria as variáveis dos datasets, e então, antes de chamar o ShowModal, posicionaria o dataset no registro desejado.Abraços Editado Dezembro 14, 2008 por Micheus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Ednilson Postado Dezembro 17, 2008 Autor Denunciar Share Postado Dezembro 17, 2008 (editado) Ednilson, nos próximos posts, onde existir código, faça a gentileza de utilizar a tag CODE para que a identação do código seja mantida e sua leitura facilitada. É desanimador ler códigos longos sem identação - não consegue-se visualizar facilmente as estruturas lógicas.Segundo o que consta no seu tópico no forum DevMedia, sua estrutura de herança é:TfrmPai +--> TfrmMestreConsulta | +--> TfrmConsFuncionarios | +--> : | +--> : +--> TfrmMestreCadastro +--> TfrmCadFuncionarios | +--> : +--> : e você diz que as variáveis referentes aos datasets estão declaradas na sessão public da classe TfrmPai:public{todas no form Pai} tabCadastro,tabConsulta : Tclientdataset; sqlConsulta : TSQLQuery; Tanto no código que você postou no DevMedia, quanto no que postou aqui, percebo que você inicializa o tabCadastro, no evento OnCreate do form TfrmCadFuncionarios, a partir da atribuição do endereço do dataset que existe no datamodule dmCadFuncionarios, também criado neste evento. Isto deve estar funcionando bem para o caso de quando você utilizar o botão de inclusão (btnNovo) - ao menos em uma primeira execução - porque neste momento, você chama o método NovoRegistro da classe TfrmPai o qual criará o form frmCadFuncionarios, que na seqüência será mostrado (ShowModal) e, ao ser fechado o form, este será eliminado através da chamada FreeAndNil. Entretanto, quando você utiliza o botão btnEditar, o seu método Editar, simplesmente utiliza a variável tabCadastro - que estará apontando para onde??? (Sabe-se lá. Esse o motivo do erro logo na primeira linha em que você a referencia) Acho que duas observações seriam pertinentes: 1) o dmCafFuncionarios, assim como o frmCadFuncionarios, deveria estar sendo liberado da memória - o que não consta do código (talvez, no OnDestroy ou OnClose do frmCadFuncionarios você esteja fazendo isto, mas não citou) 2) ao usar a opção de edição, pela lógica, você deveria novamente criar o frmCadFuncionarios, o que criaria o dmCadFuncionarios e inicializaria as variáveis dos datasets, e então, antes de chamar o ShowModal, posicionaria o dataset no registro desejado. Abraços Certo a Estrutura de Herança é essa q você diz mesmo. Quanto a liberar da memoria,estou liberando o DataModule no Evento OnClose como fui aconselhado pelo Discorpio no DevMedia: procedure TfrmConsFuncionarios.FormClose(Sender: TObject; var Action: TCloseAction); begin inherited; dmConsFuncionarios.cdsFuncionarios.Close; FreeAndNil(dmConsFuncionarios); end; e agora os metodos Editar e Inserir estao assim: procedure TfrmPai.Editar(ClasseForm: TFormClass;pID: Integer); var form : TForm; begin Try application.CreateForm(ClasseForm,form); tabCadastro.Close;{o erro de violaçao de memoria continua} tabCadastro.FetchParams; tabCadastro.Params.ParamByName('pID').AsInteger := pID; tabCadastro.Open; form.ShowModal; Finally FreeAndNil(form); End; end; procedure TfrmPai.NovoRegistro(ClasseForm: TFormClass); var form : TForm; begin Try application.CreateForm(ClasseForm,form); tabCadastro.Cancel;{o erro de violaçao de memoria continua} tabCadastro.Append; tabCadastro.FieldByName('ID').AsInteger := GenProximoID(Generator); form.ShowModal; Finally FreeAndNil(form); End; end; Ao liberar um formulario com FreeAndNil(form) não é preciso liberar também no OnClose correto? Os parametros vem do Evento OnCreate como disse antes: procedure TfrmCadFuncionarios.FormCreate(Sender: TObject); begin inherited; dmCadFuncionarios := TdmCadFuncionarios.Create(Self); dmCadFuncionarios.cdsCadastro.Open; tabCadastro := dmFuncionarios.cdsFuncionarios; Generator := 'GEN_FUNCIONARIOS_ID'; end; Editado Dezembro 17, 2008 por Ednilson Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Ednilson
Aop!!!! to com problema com herança em delphi,tenho duas variaveis no form pai
uma boolean e outra Integer. Tenho um form padrão cadastro e um form padrão
consulta,quando estou no form consulta passo um parametro pra variavel Integer do
form pai e abro o form cadastro com esse parametro mas ele fica sempre zero.
alguém sabe porque?
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.