Fórum Herança #366809
08/12/2008
0
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
Curtir tópico
+ 0Posts
09/12/2008
Rodc
A variável é pública na classe pai?
Gostei + 0
09/12/2008
Ednilson Campos
Gostei + 0
09/12/2008
Ednilson Campos
Gostei + 0
10/12/2008
Rodc
Gostei + 0
10/12/2008
Ednilson Campos
Gostei + 0
10/12/2008
Ednilson Campos
Gostei + 0
10/12/2008
Rodc
Gostei + 0
10/12/2008
Ednilson Campos
Gostei + 0
10/12/2008
Rodc
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.
Gostei + 0
10/12/2008
Ednilson Campos
Gostei + 0
10/12/2008
Ednilson Campos
Gostei + 0
12/12/2008
Ednilson Campos
Gostei + 0
13/12/2008
Discorpio
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.
Gostei + 0
13/12/2008
Ednilson Campos
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!
Gostei + 0
13/12/2008
Discorpio
Deixa eu te fazer uma pergunta:
Esse form Consulta está herdando do Form Pai :?:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)