Ir para conteúdo
Fórum Script Brasil
  • 0

Herança


Ednilson

Pergunta

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

  • 0
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?

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

Link para o comentário
Compartilhar em outros sites

  • 0
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?

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

Ta ai tudo q utilizo e já mostrando os erros:

//Metodo para inserir definido no formPai

procedure TfrmPai.NovoRegistro(ClasseForm: TFormClass;pID: Integer);

var

form : TForm;

begin

Try

application.CreateForm(ClasseForm,form);

inserir := true;//defini como true

tabCadastro.Cancel;//parametro q vem do formCadastro{aki ta dando o erro {Acces Violation}

tabCadastro.Append;

tabCadastro.FieldByName('ID').AsInteger := GenProximoID(Generator);

form.ShowModal;

Finally

FreeAndNil(form);

End;

end;

No formulario de consulta chamo dessa forma:

procedure TfrmConsFuncionarios.btnNovoClick(Sender: TObject);

begin

inherited;

NovoRegistro(TfrmCadFuncionarios);//passo a Classe do formCadastro como parametro

end;

Evento quando o formCadastro é criado:

procedure TfrmCadFuncionarios.FormCreate(Sender: TObject);

begin

inherited;

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);

var

ID : Integer;

begin

tabCadastro.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);

begin

inherited;

Editar(tabConsulta.fieldByName('ID').AsInteger);//parametro para ediçao também não consegui resolve essa parte

end;

As variaveis q utilizo:

public{todas no form Pai}

tabCadastro,tabConsulta : Tclientdataset;

sqlConsulta : TSQLQuery;

Generator : String;

inserir : Boolean;

pIDCadastro : Integer;

Editado por Ednilson
Link para o comentário
Compartilhar em outros sites

  • 0

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 por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0
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 por Ednilson
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...