Fórum Herança #366809

08/12/2008

0

Vou explicar melhor o problema,tenho um formulario pai e a partir dele criei um form padrao para consulta e um form padrao para cadastro. Quando estou no form consulta funcionarios por exemplo e preciso editar, faço dessa forma:

procedure TfrmConsFuncionarios.btnEditarClick(Sender: TObject);
begin
inherited;//aki nao ta herdando nada ainda nao

inserir := false;//variaveis criadas no form pai
IDCadastro := tabConsulta.fieldByName(´ID´).AsInteger;

// apenas altero as variaveis e crio o form
if not Assigned(frmCadFuncionarios) then
frmCadFuncionarios := TfrmCadFuncionarios.Create(self);

frmCadFuncionarios.ShowModal;
FreeAndNil(frmCadFuncionarios);
end;

e para add um novo funcionario apenas defino inserir=true e crio o form.As variaveis estao no form pai e sao usadas pelo form padrao consulta e cadastro. Quando crio o form cadastro ele excuta esse codigo:

//a tabela foi passada como parametro no formcreate
procedure TfrmMestreCadastro.AbreFormCad;
begin
if inserir Then//variavel usada nos forms conulta e cadastro
begin
tabCadastro.Cancel;//tabCadastro criada no form padrao cadastro
tabCadastro.Append;
tabCadastro.FieldByName(´ID´).AsInteger := GenProximoID(Generator);
end
Else
begin
tabCadastro.Close;
tabCadastro.FetchParams;
tabCadastro.Params.ParamByName(´pID´).AsInteger := IDCadastro;
tabCadastro.Open;
end;
end;

O problema esta nas variaveis INSERIR e IDCadastro,definidas no form pai. Elas deveriam ser alteradas no form consulta,mas,nao é possivel. Ta ai se alguem puder me ajudar!


Ednilson Campos

Ednilson Campos

Responder

Posts

09/12/2008

Rodc

é erro na compilação ou ao rodar?
A variável é pública na classe pai?


Responder

Gostei + 0

09/12/2008

Ednilson Campos

A variavel é publica e o erro é de execuçao, eu nao consigo alterar as variaveis,quando passo um parametro,um código por exemplo, o valor da variavel Integer nao muda fica sempre zero e a boolean sempre false. Cara ja fiz de tudo aki e nao da certo.


Responder

Gostei + 0

09/12/2008

Ednilson Campos

Ah sim...é na classe pai q foi declarada. Tentei declara-la no form padrao consulta e usar uma procedure dele msm, e tbm nao deu certo. Tambem tentei no form padrao cadastro e nao deu certo.


Responder

Gostei + 0

10/12/2008

Rodc

Será que a variável não está redeclarada na classe filha? Se você der um Ctrl+Click sobre a variável o cursor vai para a declaração correta?


Responder

Gostei + 0

10/12/2008

Ednilson Campos

Cara a variavel altera o valor sim, um problema era q eu estava limpando os campos no momento errado,porem,o parametro q a variavel recebe no form consulta padrao nao é passado para o metodo q ta no form cadastro padrao. A parte de nao alterar ta corrigido, agora é só a questao do parametro entre os forms padrao.


Responder

Gostei + 0

10/12/2008

Ednilson Campos

Declarei apenas no formulario pai. Quando altero a variavel num formulario ela nao esta alterada no outro.


Responder

Gostei + 0

10/12/2008

Rodc

Qual formulário chama a função AbreFormCad() da classe pai? É nesta função que o valor de ´Insert´ não está correto?


Responder

Gostei + 0

10/12/2008

Ednilson Campos

Quando to no formulario de consulta funcionarios por exemplo e clico em novo ou editar, altero as variaveis q estao no form pai,crio o form cadastro de funcionarios e nele tem o metodo abreformcad, nao to passando parametro pra ele, apenas utilizo as variaveis do fom pai q foram alteradas no form consulta. Nao consegui usar esse comando {frmMestreCadastro.AbreFormCad(inserir,pIDCadastro);} no form padrao consulta nem no consulta funcionarios, da esse erro {Access violation at address 00615EAB in module}.


Responder

Gostei + 0

10/12/2008

Rodc

Você tem que lembrar que dois formulários descenderem do mesmo pai não quer dizer que os dois compartilham das mesmas variáveis. As duas filhas apenas tem a mesma estrutura, porém na memória cada uma tem a sua variável ´Insert´ em local diferente da memória.
Se você tem Form1 e Form2 descendedo de TForm; ao colocar ´Form1.Visible := false´ não fará com que a variável ´Visible´ do Form2 também esteja como false apenas porque as duas descendem da mesma classe, correto?

Você não consegue chamar frmMestreCadastro.AbreFormCad() porque este formulário não está criado. É a mesma coisa de você tentar acessar uma função de um formulário qualquer (Form1, Form2, ...) que não foi criado ainda.


Responder

Gostei + 0

10/12/2008

Ednilson Campos

Certo ai por isso coloquei um TTimer e quando o form é criado ele executa o metodo usando as variaveis do form pai q foram alteradas no form consulta. Nao da erro mas as variaveis do form pai alterados no form consulta-fiz o teste e altera msm- nao vao para o form cadastro.


Responder

Gostei + 0

10/12/2008

Ednilson Campos

Parece q as variaveis sao restauradas quando abro o um formulario de cadastro, num sei pq.


Responder

Gostei + 0

12/12/2008

Ednilson Campos

Ah...não consigo msm,se alguem tiver outra forma ou sugestão de como fazer consulta e cadastro com Herança,eu agradeço!!


Responder

Gostei + 0

13/12/2008

Discorpio

Boa noite a todos.

Em primeiro lugar quando voce instancia um Form na memória, ao tentar instanciar o mesmo Form com a mesma variável novamente, ele dá o erro de Access Violation......

Isto ocorre porque o mesmo Form já se encontra em memória, voce deve sempre limpá-lo da memória com o método Free ou com a função FreeAndNil(Variável), ai sim voce pode instanciá-lo novamente em uma nova chamada.

Quanto a variáveis Inserir: Boolean, o nosso amigo Rodc está correto, apesar dela estar declarada no Form Ancestral (Pai), ao instanciar os Forms derivados (filhos), cada form filho terá a sua variável Insert com valores diferentes, com já foi dito pelo nosso amigo.

Para resolver esta questão, voce deverá implementar um método Inserir no Form Ancestral (Pai) e neste método atribuir o valor de Insert como True. Ao ser invocado o método Inserir nos Forms filhos, a variável Insert já é configurado automaticamente como True, isto é se você implementar também o método inserir nos forms filhos com a cláusula Inherited.


Responder

Gostei + 0

13/12/2008

Ednilson Campos

Boa tarde. Muito obrigado pelas dicas,mas,ainda não consegui fazer funcionar. Nao entendi muito bem como corrigir,criei o metodo inserir como vc disse:

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 q vc disse sobre liberar da memoria{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 tbm 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 tbm nao 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;

Agora tudo q utilizo ta ai espero q facilite pra vcs me ajudarem!


Responder

Gostei + 0

13/12/2008

Discorpio

Boa noite Kenshin.

Deixa eu te fazer uma pergunta:

Esse form Consulta está herdando do Form Pai :?:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar