Obter conteudo do Edit do Form herdado
:?:
Olá a todos.
Uso Delphi 7 + Firebird 1.5 + Dbexpress.
Criei um Form de Cadastro Padrão que será usado para todos os cadastros do sistema.
Quando mando gravar (no Form herdado do padrão) ele chama inherited e entra no Form padrão (como abaixo).
procedure TFrCadRegioes.BtnGravarClick(Sender: TObject);
begin
inherited;
BtnIncluir.SetFocus;
end;
No Form padrão preciso obter o conteúdo de cada Edit do form de onde veio a chamada (Sender) ( no caso acima FrCadRegioes herdado do padrão) para poder gravar na tabela correspondente ao cadastro.
Abaixo o codigo do botão gravar do FormPadrao.
procedure TFrCadastroPadrao.BtnGravarClick(Sender: TObject);
begin
inherited;
With V_CliDtSt do // Cds da tabela
begin
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilReadCommitted;
V_SqlCnctn.StartTransaction(Transacao);
try
If M_TipoOperacao = 1 then // inclusão
begin
dmdados.CliDtStSequencias.Refresh;
V_Chave := ObterNovoCodigo_(V_NmCampo, dmdados.CliDtStSequencias.FieldByName(V_NmCampo).Value , V_TamCampo);
Append;
FieldByName(V_NmCampo).AsString := V_Chave;
GravarRegistro(Sender, Screen.ActiveForm ); // -> aqui chamo a rotina para gravar os Edit´s do Form herdado
Post;
if ApplyUpdates(-1) = 0 then
V_SqlCnctn.Commit(Transacao);
end;
If M_TipoOperacao = 2 then // alteracao
begin
If Trim( V_Chave ) = ´´ then exit;
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlTabela;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
i_aux := V_CliDtSt.RecordCount;
Edit;
GravarRegistro(Sender, Screen.ActiveForm ); // -> aqui chamo a rotina para gravar os Edit´s do Form herdado
Post;
if ApplyUpdates(-1) = 0 then
V_SqlCnctn.Commit(Transacao);
end
except
Begin
V_SqlCnctn.Rollback(Transacao);
ShowMessage(´Ocorreram erros ao Atualizar o Registro!!!´ + #13 + ´Alteração Cancelada!!´);
end;
end;
end;
M_TipoOperacao := 0;
Stb.Panels.Items[1].Text := LerSequencial( DmDados.CliDtStSequencias.FieldByName(V_NmCampo).Value );
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
LimparCampos(Sender, Screen.ActiveForm );
DesativarCampos(Sender, Screen.ActiveForm );
ModoNavegacao;
end;
Não estou conseguindo ´pegar o Edit.Text´.
TCustomEdit(Sender).Text não me retorna o conteudo do Edit veja abaixo a rotina de gravação do FormPadrao (veja que estou passando também o nome do Form herdado mas mesmo assim não consigo).
Consigo obter a propriedade name mas não a text do componente.
Os nomes dos campos da tabela e seu correspondente Edit eu relaciono num componente ValueListEditor.
=================
Key - - - - Value
Cli_Cod - - -- EdtCodigo.Text
Cli_Nome- --- EdtNome.Text
Cli_Data- - -- EdtDtCadastro.Text
etc...
procedure TFrCadastroPadrao.GravarRegistro(Sender: TObject; Formulario: TForm);
var
Le_Form, Le_List : integer;
Nro_Componentes, Nro_Lista : integer;
NomeForm, NomeLista : string;
e_campo : TEdit;
t_campo : TCustomEdit;
v_campo : string;
ListTabela, ListForm : string;
nomecampo : string;
begin
NomeForm := ´ ´ + Screen.ActiveForm.Name;
NomeForm := Formulario.Name;
Nro_Componentes := Formulario.ComponentCount - 1;
Nro_Lista := List.RowCount - 1;
NomeLista := List.Name;
// --- loop de leitura dos componentes do Form
PbCadastro.Max := Nro_Componentes;
for Le_Form := 0 to Nro_Componentes do
begin
PbCadastro.Position := Le_Form;
m_aux := Formulario.Components[Le_Form].Name; // nome do Edit
if Formulario.Components[Le_Form] is TCustomEdit then
begin
nomecampo := UpperCase(Formulario.Components[Le_Form].Name);
NomeCampo := NomeCampo + ´.TEXT´;
e_campo := formulario.
for Le_List := 0 to Nro_Lista do // --- percorrer o list para pegar o nome do campo na tabela
begin
ListTabela := UpperCase(List.Cells[ 0 , Le_List ]);
ListForm := UpperCase(List.Cells[ 1 , Le_List ]);
if NomeCampo = ListForm then
begin
if V_CliDtSt.FieldByName(List.Cells[ 0 , Le_List ]).DataType = ftstring then
V_CliDtSt.FieldByName(List.Cells[ 0 , Le_List ]).AsString := TCustomEdit(Sender).Text;
end;
end;
end;
end;
end;
Olá a todos.
Uso Delphi 7 + Firebird 1.5 + Dbexpress.
Criei um Form de Cadastro Padrão que será usado para todos os cadastros do sistema.
Quando mando gravar (no Form herdado do padrão) ele chama inherited e entra no Form padrão (como abaixo).
procedure TFrCadRegioes.BtnGravarClick(Sender: TObject);
begin
inherited;
BtnIncluir.SetFocus;
end;
No Form padrão preciso obter o conteúdo de cada Edit do form de onde veio a chamada (Sender) ( no caso acima FrCadRegioes herdado do padrão) para poder gravar na tabela correspondente ao cadastro.
Abaixo o codigo do botão gravar do FormPadrao.
procedure TFrCadastroPadrao.BtnGravarClick(Sender: TObject);
begin
inherited;
With V_CliDtSt do // Cds da tabela
begin
Transacao.TransactionID:= 1;
Transacao.IsolationLevel:= xilReadCommitted;
V_SqlCnctn.StartTransaction(Transacao);
try
If M_TipoOperacao = 1 then // inclusão
begin
dmdados.CliDtStSequencias.Refresh;
V_Chave := ObterNovoCodigo_(V_NmCampo, dmdados.CliDtStSequencias.FieldByName(V_NmCampo).Value , V_TamCampo);
Append;
FieldByName(V_NmCampo).AsString := V_Chave;
GravarRegistro(Sender, Screen.ActiveForm ); // -> aqui chamo a rotina para gravar os Edit´s do Form herdado
Post;
if ApplyUpdates(-1) = 0 then
V_SqlCnctn.Commit(Transacao);
end;
If M_TipoOperacao = 2 then // alteracao
begin
If Trim( V_Chave ) = ´´ then exit;
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlTabela;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
i_aux := V_CliDtSt.RecordCount;
Edit;
GravarRegistro(Sender, Screen.ActiveForm ); // -> aqui chamo a rotina para gravar os Edit´s do Form herdado
Post;
if ApplyUpdates(-1) = 0 then
V_SqlCnctn.Commit(Transacao);
end
except
Begin
V_SqlCnctn.Rollback(Transacao);
ShowMessage(´Ocorreram erros ao Atualizar o Registro!!!´ + #13 + ´Alteração Cancelada!!´);
end;
end;
end;
M_TipoOperacao := 0;
Stb.Panels.Items[1].Text := LerSequencial( DmDados.CliDtStSequencias.FieldByName(V_NmCampo).Value );
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
LimparCampos(Sender, Screen.ActiveForm );
DesativarCampos(Sender, Screen.ActiveForm );
ModoNavegacao;
end;
Não estou conseguindo ´pegar o Edit.Text´.
TCustomEdit(Sender).Text não me retorna o conteudo do Edit veja abaixo a rotina de gravação do FormPadrao (veja que estou passando também o nome do Form herdado mas mesmo assim não consigo).
Consigo obter a propriedade name mas não a text do componente.
Os nomes dos campos da tabela e seu correspondente Edit eu relaciono num componente ValueListEditor.
=================
Key - - - - Value
Cli_Cod - - -- EdtCodigo.Text
Cli_Nome- --- EdtNome.Text
Cli_Data- - -- EdtDtCadastro.Text
etc...
procedure TFrCadastroPadrao.GravarRegistro(Sender: TObject; Formulario: TForm);
var
Le_Form, Le_List : integer;
Nro_Componentes, Nro_Lista : integer;
NomeForm, NomeLista : string;
e_campo : TEdit;
t_campo : TCustomEdit;
v_campo : string;
ListTabela, ListForm : string;
nomecampo : string;
begin
NomeForm := ´ ´ + Screen.ActiveForm.Name;
NomeForm := Formulario.Name;
Nro_Componentes := Formulario.ComponentCount - 1;
Nro_Lista := List.RowCount - 1;
NomeLista := List.Name;
// --- loop de leitura dos componentes do Form
PbCadastro.Max := Nro_Componentes;
for Le_Form := 0 to Nro_Componentes do
begin
PbCadastro.Position := Le_Form;
m_aux := Formulario.Components[Le_Form].Name; // nome do Edit
if Formulario.Components[Le_Form] is TCustomEdit then
begin
nomecampo := UpperCase(Formulario.Components[Le_Form].Name);
NomeCampo := NomeCampo + ´.TEXT´;
e_campo := formulario.
for Le_List := 0 to Nro_Lista do // --- percorrer o list para pegar o nome do campo na tabela
begin
ListTabela := UpperCase(List.Cells[ 0 , Le_List ]);
ListForm := UpperCase(List.Cells[ 1 , Le_List ]);
if NomeCampo = ListForm then
begin
if V_CliDtSt.FieldByName(List.Cells[ 0 , Le_List ]).DataType = ftstring then
V_CliDtSt.FieldByName(List.Cells[ 0 , Le_List ]).AsString := TCustomEdit(Sender).Text;
end;
end;
end;
end;
end;
Neto
Curtidas 0
Respostas
Marco Salles
27/02/2009
vamos com calma... é fácil mas as vezes se torna dificil e fica num vai e volta sem sair do lugar.. Muita calma nessas horas.
Antes de passar para adiante , uma idéia de Herança facilitar , bem como
simplificar
Pq Vc chama esses métodos :
Não seria mais interresante esses métodos serem Protegidos da ClassePai
e implementados nesta Classe..
Por exemplo:
Método definido como Protecedt Na Classe PAI
Na classe filha este Método definido como a visibilidade protected ou
Publica será Visivel... E não precisa passar nenhum parâmetro como
Vc esta Fazendo....
Pq que estou batendo nesta Tecla.. Pq acredito que deve entender este
conceito básico e depois uma estrátégia melhor para o Problema do
GravarRegistro...
Além disso o codigo para executar o Sql deve sim colocar em uma Unit
e usar parâmtros... Pq parâmtros neste Caso. Pq o Texto (commandText)
as Tabelas , Os campo irão mudar. Não são fixos
Ai sim vc fica com um codigo Limpo neste Formulários Herdados.
e facil leitura e fácil manutenção
Mas primeiro ataque o primeiro problema
Ba falei demais . Boa sorte
Antes de passar para adiante , uma idéia de Herança facilitar , bem como
simplificar
Pq Vc chama esses métodos :
LimparCampos(Sender, Screen.ActiveForm ); DesativarCampos(Sender, Screen.ActiveForm );
Não seria mais interresante esses métodos serem Protegidos da ClassePai
e implementados nesta Classe..
Por exemplo:
Método definido como Protecedt Na Classe PAI
procedure TFormBase.LimparCampo; var i:integer; begin for i:=0 To ComponentCount-1 do if components[i] is TCustomEdit then TCustomEdit(components[i]).Clear end;
Na classe filha este Método definido como a visibilidade protected ou
Publica será Visivel... E não precisa passar nenhum parâmetro como
Vc esta Fazendo....
GravarRegistro(Sender, Screen.ActiveForm );
LimparCampos(Sender, Screen.ActiveForm );
DesativarCampos(Sender, Screen.ActiveForm );
Pq que estou batendo nesta Tecla.. Pq acredito que deve entender este
conceito básico e depois uma estrátégia melhor para o Problema do
GravarRegistro...
Além disso o codigo para executar o Sql deve sim colocar em uma Unit
e usar parâmtros... Pq parâmtros neste Caso. Pq o Texto (commandText)
as Tabelas , Os campo irão mudar. Não são fixos
Ai sim vc fica com um codigo Limpo neste Formulários Herdados.
e facil leitura e fácil manutenção
Mas primeiro ataque o primeiro problema
Ba falei demais . Boa sorte
GOSTEI 0
Neto
27/02/2009
:lol:
Olá Marcos, obrigado por me ajudar.
Conheço pouco sobre herança, classes, etc..., mas estou interessado em aprender sobre tudo isso (então vamos a prática).
Sobre as procedures;
LimparCampos(Sender, Screen.ActiveForm );
DesativarCampos(Sender, Screen.ActiveForm );
São procedures que estão no FormPadrao e como chamo a rotina do FormPadrao criei estes dois parametros para identificar de onde veio a chamada. (Será que Sender e Screen.ActiveForm são a mesma coisa?)
Veja abaixo as procedures:
type
TFrCadastroPadrao = class(TForm)
...
..
.
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnIncluirClick(Sender: TObject);
procedure BtnAlterarClick(Sender: TObject);
procedure BtnExcluirClick(Sender: TObject);
procedure BtnCancelarClick(Sender: TObject);
procedure btnPesquisarClick(Sender: TObject);
procedure BtnGravarClick(Sender: TObject);
procedure BtnSairClick(Sender: TObject);
procedure DBEdit1Enter(Sender: TObject);
procedure DBEdit1Exit(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FMensagemDoSistema : String;
//---
procedure SetMensagemDoSistema(const Value: String);
procedure LimparCampos(Sender: TObject; Formulario: TForm);
procedure AtivarCampos(Sender: TObject; Formulario: TForm);
procedure DesativarCampos(Sender: TObject; Formulario: TForm);
procedure FormOperacaoAtiva;
procedure GravarRegistro(Sender: TObject; Formulario: TForm);
public
{ Public declarations }
property MensagemDoSystema :String read FMensagemDoSistema write SetMensagemDoSistema;
{ Procedimentos }
procedure ModoNavegacao; virtual;
procedure ModoEdicao; virtual;
end;
var
FrCadastroPadrao: TFrCadastroPadrao;
implementation
...
..
.
procedure TFrCadastroPadrao.LimparCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Clear;
end;
end;
procedure TFrCadastroPadrao.AtivarCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Enabled := true;
end;
end;
procedure TFrCadastroPadrao.DesativarCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Enabled := false;
end;
end;
Como faço para declarar estes métodos como Protegidos da ClassePai?
E na classe filha definir como a visibilidade protected ou Publica para ser Visivel??
Agora sobre a instrução SQL.
Minhas instruções ficam numa Unit que só tem instruções SQL veja.
unit UnSql;
interface
function SqlClientesMestre : string;
function SqlRegioesMestre : string;
implementation
uses UnMenuPrincipal;
function SqlClientesMestre : string;
begin
Result := ´SELECT * FROM CLIENTES WHERE CLI_COD = :CODIGO ORDER BY CLI_COD ´
end;
function SqlRegioesMestre : string;
begin
Result := ´SELECT * FROM REGIOES WHERE REG_COD = :CODIGO ORDER BY REG_COD ´
end;
end.
E são chamadas no OnClick do FormPrincipal veja:
procedure TFrPrincipal.CadRegioesClick(Sender: TObject);
begin
try
V_NmCampo := ´Reg_Cod´;
V_TamCampo := 4;
DtmSys.CdsBase.Close;
DtmSys.SqlBase.Close;
FrPrincipal.EdtChave.Text := dmdados.CliDtStSequencias.fieldbyname(´Reg_Cod´).AsString; //-> sempre mostro o último registro
V_Chave := FrPrincipal.EdtChave.Text;
// --- Abrir Mestre
V_CliDtSt := DtmSys.CdsBase;
V_DtStPrv := DtmSys.PrvBase;
V_SqlDtSt := DtmSys.SqlBase;
V_DtSource := DtmSys.DsBase;
V_SqlMestre := SqlRegioesMestre; // aqui chamo a SQL
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
FrCadRegioes := TFrCadRegioes.Create( nil );
FrCadRegioes.ShowModal;
finally
FrCadRegioes := Nil;
end;
end;
Ok, estes são meus códigos. Estou feliz em poder melhorar-los com a ajuda sua e da comunidade ClubeDelphi.
Aguardo ancioso pelas próximas orientações.
Abraços
Neto
Olá Marcos, obrigado por me ajudar.
Conheço pouco sobre herança, classes, etc..., mas estou interessado em aprender sobre tudo isso (então vamos a prática).
Sobre as procedures;
LimparCampos(Sender, Screen.ActiveForm );
DesativarCampos(Sender, Screen.ActiveForm );
São procedures que estão no FormPadrao e como chamo a rotina do FormPadrao criei estes dois parametros para identificar de onde veio a chamada. (Será que Sender e Screen.ActiveForm são a mesma coisa?)
Veja abaixo as procedures:
type
TFrCadastroPadrao = class(TForm)
...
..
.
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnIncluirClick(Sender: TObject);
procedure BtnAlterarClick(Sender: TObject);
procedure BtnExcluirClick(Sender: TObject);
procedure BtnCancelarClick(Sender: TObject);
procedure btnPesquisarClick(Sender: TObject);
procedure BtnGravarClick(Sender: TObject);
procedure BtnSairClick(Sender: TObject);
procedure DBEdit1Enter(Sender: TObject);
procedure DBEdit1Exit(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FMensagemDoSistema : String;
//---
procedure SetMensagemDoSistema(const Value: String);
procedure LimparCampos(Sender: TObject; Formulario: TForm);
procedure AtivarCampos(Sender: TObject; Formulario: TForm);
procedure DesativarCampos(Sender: TObject; Formulario: TForm);
procedure FormOperacaoAtiva;
procedure GravarRegistro(Sender: TObject; Formulario: TForm);
public
{ Public declarations }
property MensagemDoSystema :String read FMensagemDoSistema write SetMensagemDoSistema;
{ Procedimentos }
procedure ModoNavegacao; virtual;
procedure ModoEdicao; virtual;
end;
var
FrCadastroPadrao: TFrCadastroPadrao;
implementation
...
..
.
procedure TFrCadastroPadrao.LimparCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Clear;
end;
end;
procedure TFrCadastroPadrao.AtivarCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Enabled := true;
end;
end;
procedure TFrCadastroPadrao.DesativarCampos(Sender: TObject; Formulario: TForm);
var
i, f : integer;
s : string;
t : TForm;
begin
f := TForm(Sender).ComponentCount - 1;
s := ´ ´ + Screen.ActiveForm.Name;
f := Formulario.ComponentCount - 1;
t := Formulario;
PbCadastro.Max := f;
for i := 0 to f do
begin
PbCadastro.Position := i;
if Formulario.Components[i] is TCustomEdit then
(Formulario.Components[i] as TCustomEdit).Enabled := false;
end;
end;
Como faço para declarar estes métodos como Protegidos da ClassePai?
E na classe filha definir como a visibilidade protected ou Publica para ser Visivel??
Agora sobre a instrução SQL.
Minhas instruções ficam numa Unit que só tem instruções SQL veja.
unit UnSql;
interface
function SqlClientesMestre : string;
function SqlRegioesMestre : string;
implementation
uses UnMenuPrincipal;
function SqlClientesMestre : string;
begin
Result := ´SELECT * FROM CLIENTES WHERE CLI_COD = :CODIGO ORDER BY CLI_COD ´
end;
function SqlRegioesMestre : string;
begin
Result := ´SELECT * FROM REGIOES WHERE REG_COD = :CODIGO ORDER BY REG_COD ´
end;
end.
E são chamadas no OnClick do FormPrincipal veja:
procedure TFrPrincipal.CadRegioesClick(Sender: TObject);
begin
try
V_NmCampo := ´Reg_Cod´;
V_TamCampo := 4;
DtmSys.CdsBase.Close;
DtmSys.SqlBase.Close;
FrPrincipal.EdtChave.Text := dmdados.CliDtStSequencias.fieldbyname(´Reg_Cod´).AsString; //-> sempre mostro o último registro
V_Chave := FrPrincipal.EdtChave.Text;
// --- Abrir Mestre
V_CliDtSt := DtmSys.CdsBase;
V_DtStPrv := DtmSys.PrvBase;
V_SqlDtSt := DtmSys.SqlBase;
V_DtSource := DtmSys.DsBase;
V_SqlMestre := SqlRegioesMestre; // aqui chamo a SQL
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
FrCadRegioes := TFrCadRegioes.Create( nil );
FrCadRegioes.ShowModal;
finally
FrCadRegioes := Nil;
end;
end;
Ok, estes são meus códigos. Estou feliz em poder melhorar-los com a ajuda sua e da comunidade ClubeDelphi.
Aguardo ancioso pelas próximas orientações.
Abraços
Neto
GOSTEI 0
Marco Salles
27/02/2009
Um problema de cada vez:
Vc coloca assim ;
.....
Nos forms Herdado basta Chamar
DesativarOUAtivarCampos(True); Ou
DesativarOUAtivarCampos(False)
Para Ativar ou Desabilitar Campos do Edit
[b:e8ebeb803d]procedure LimparCampos[/b:e8ebeb803d]
Nos forms Herdado basta Chamar
[b:e8ebeb803d]LimparCampos;[/b:e8ebeb803d]
O Método GravarRegistro , não posso implementa-lo pq não sei se os
DataSets são definidos no FormPai ou se são definidos somente nos
FormFilhos ... e tB parece que vc esta Percorrendo os TFields e
comparando com o Nome dos Edits para Atribuir ao FieldByName
Esta ´tecnica´ se for do jeito que eu comentei , não é aconselhavel
por vários motivos. , uma delas é a necessidade do Nome dos edits
ser o mesmo dos fields , entre outras coisas
Mas supondo que o DataSet esteja definido no FormPai e que os Nomes
Dos edit estejam de acordo com os Nomes dos Tfields Vc Pode
implemetar Mais Ou Menso desta Forma
Desta maneira ele irá percorrer a Lista dos Components do Form , para
cada edit encontrado ele ira percorrer a Lista dos Fileds do CDS
(ClientDataSet) .. e comparar o Nome desses Fields com o Nome dos
Edits.. Se oa condição for satisfeita passo o Nome para FieldBy e
Atribuo o Valor ao CDS
A ideia é esta , para funcionar depende dos seus AJUSTES
private
{ Private declarations }
FMensagemDoSistema : String;
//---
procedure SetMensagemDoSistema(const Value: String);
procedure LimparCampos(Sender: TObject; Formulario: TForm);
procedure AtivarCampos(Sender: TObject; Formulario: TForm);
procedure DesativarCampos(Sender: TObject; Formulario: TForm);
procedure FormOperacaoAtiva;
Vc coloca assim ;
private
{ Private declarations }
FMensagemDoSistema : String;
procedure SetMensagemDoSistema(const Value: String);
procedure FormOperacaoAtiva;
protected // Definir o Método Aqui
procedure LimparCampos;
procedure DesativarOUAtivarCampos(chave:Boolean);
procedure GravarRegistro;.....
[b]Para Implementa-los e muito mais simples :[/b] procedure TFrCadastroPadrao.DesativarOUAtivarCampos(chave:Boolean) var i:integer; begin for i:=0 to ComponentCount do if components[i] is TCustomEdit then (components[i]) as TCustomEdit).enabled:=chave; end;
Nos forms Herdado basta Chamar
DesativarOUAtivarCampos(True); Ou
DesativarOUAtivarCampos(False)
Para Ativar ou Desabilitar Campos do Edit
[b:e8ebeb803d]procedure LimparCampos[/b:e8ebeb803d]
procedure TFrCadastroPadrao.LimparCampos; var i:integer; begin for i:=0 to ComponentCount do if components[i] is TCustomEdit then (components[i]) as TCustomEdit).clear; end;
Nos forms Herdado basta Chamar
[b:e8ebeb803d]LimparCampos;[/b:e8ebeb803d]
O Método GravarRegistro , não posso implementa-lo pq não sei se os
DataSets são definidos no FormPai ou se são definidos somente nos
FormFilhos ... e tB parece que vc esta Percorrendo os TFields e
comparando com o Nome dos Edits para Atribuir ao FieldByName
Esta ´tecnica´ se for do jeito que eu comentei , não é aconselhavel
por vários motivos. , uma delas é a necessidade do Nome dos edits
ser o mesmo dos fields , entre outras coisas
Mas supondo que o DataSet esteja definido no FormPai e que os Nomes
Dos edit estejam de acordo com os Nomes dos Tfields Vc Pode
implemetar Mais Ou Menso desta Forma
var i,j:integer; NomeDoCampo:string; begin for i:=0 to ComponentCount-1 do if components[i] is TCustomEdit then begin NomeDoCampo:= TCustomEdit(components[i]).Name; for j:=0 to cds.Fields.Count -1 do if Uppercase(NomeDoCampo) = Uppercase(cds.Fields.Fields[j].FieldName) then begin cds.FieldByName(NomeDoCampo).AsString:=TCustomEdit(components[i]).Text; Break; end; end; end;
Desta maneira ele irá percorrer a Lista dos Components do Form , para
cada edit encontrado ele ira percorrer a Lista dos Fileds do CDS
(ClientDataSet) .. e comparar o Nome desses Fields com o Nome dos
Edits.. Se oa condição for satisfeita passo o Nome para FieldBy e
Atribuo o Valor ao CDS
A ideia é esta , para funcionar depende dos seus AJUSTES
GOSTEI 0
Acneto
27/02/2009
:idea:
Olá Marcos,
fiz como recomendado mas agora quando chama a rotina
LimparCampos; ela é executada mas não entra na instrução Clear.(TCustomEdit(components[i]).Clear) -->> essa linha não é executada;
Tenho que fazer alguma declaração nos forms herdados??
Abraços
Neto
Olá Marcos,
fiz como recomendado mas agora quando chama a rotina
LimparCampos; ela é executada mas não entra na instrução Clear.(TCustomEdit(components[i]).Clear) -->> essa linha não é executada;
Não seria mais interresante esses métodos serem Protegidos da ClassePai e implementados nesta Classe.. Por exemplo: Método definido como Protecedt Na Classe PAI Código: procedure TFormBase.LimparCampo; var i:integer; begin for i:=0 To ComponentCount-1 do if components[i] is TCustomEdit then TCustomEdit(components[i]).Clear end; Na classe filha este Método definido como a visibilidade protected ou Publica será Visivel... E não precisa passar nenhum parâmetro como Vc esta Fazendo.... ]
veja como ficou o inicio do codigo padrao
type
TFrCadastroPadrao = class(TForm)
procedure DBEdit1Enter(Sender: TObject);
procedure DBEdit1Exit(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
protected // Definir o Método Aqui
procedure LimparCampos;
procedure AtivarDesativarCampos(chave:Boolean);
procedure GravarRegistro;
function RetornarComponent(Nome:String):TCustomEdit;
public
{ Public declarations }
{ Procedimentos }
procedure ModoNavegacao; virtual;
procedure ModoEdicao; virtual;
end;
var
FrCadastroPadrao: TFrCadastroPadrao;
implementation
Tenho que fazer alguma declaração nos forms herdados??
Abraços
Neto
GOSTEI 0
Marco Salles
27/02/2009
Ola Neto . No inicio do meu primeiro poste eu disse :
Lembra ???
Pois bem , era para dar certo ....
como vc esta Instanciando esses Forms Filhos < como vc esta o Criando ?
como vc esta os chamando
Como esses Form Filhos e pai estão declarados na seccção
Project > Options
Avalaible Forms ou
AutoCreateForms ??
é fácil mas as vezes se torna dificil e fica num vai e volta sem sair do lugar
Lembra ???
Pois bem , era para dar certo ....
como vc esta Instanciando esses Forms Filhos < como vc esta o Criando ?
como vc esta os chamando
Como esses Form Filhos e pai estão declarados na seccção
Project > Options
Avalaible Forms ou
AutoCreateForms ??
GOSTEI 0
Acneto
27/02/2009
Ok,
Vou mostrar como estou chamando o form no onclick do menu.
1o. Criação e chamada do Form herdado
2o. Project Options
- Auto-Create Forms
- DmDados - Data Module
- FrPrincipal - Menu
- Available Forms
- Todos os outros forms do sistema
Vou mostrar como estou chamando o form no onclick do menu.
1o. Criação e chamada do Form herdado
procedure TFrPrincipal.CadRegioesClick(Sender: TObject); begin try V_NmCampo := ´Reg_Cod´; V_TamCampo := 4; DtmSys.CdsBase.Close; DtmSys.SqlBase.Close; FrPrincipal.EdtChave.Text := dmdados.CliDtStSequencias.fieldbyname(´Reg_Cod´).AsString; V_Chave := FrPrincipal.EdtChave.Text; V_SqlTabela := ´SELECT * FROM REGIOES WHERE REG_COD = :CODIGO´; // --- Abrir Mestre V_CliDtSt := DtmSys.CdsBase; V_DtStPrv := DtmSys.PrvBase; V_SqlDtSt := DtmSys.SqlBase; V_DtSource := DtmSys.DsBase; V_SqlMestre := SqlRegioesMestre; V_SqlDtSt.Close; V_Clidtst.Close; V_SqlDtSt.CommandText := V_SqlMestre; V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave; V_CliDtSt.Open; FrCadRegioes := TFrCadRegioes.Create( nil ); >> aqui crio o Form herdado FrCadRegioes.ShowModal; >> mostro o form finally FrCadRegioes := Nil; end; end;
2o. Project Options
- Auto-Create Forms
- DmDados - Data Module
- FrPrincipal - Menu
- Available Forms
- Todos os outros forms do sistema
GOSTEI 0
Marco Salles
27/02/2009
A criação esta corretissima
com exceção da Proteção.. Pq aonde esta Localizado o Try , o Form Nen
pode ter sido criado e vc esta chamando Finally
O cert é assim :
Vc esta fazendo assim :
Mais correto ainda é usar dois Blocos Try Try Except Finally
Como vc disse no inicio do Form , pressupoê-se que FrCadRegioes é um formulario que Herdou de um Outro Formulario PAI Cadstro
Então se o Método LimparCampos Esta definido na Classe Pai não tem
sentido nenhum o que vc esta dizendo :
Vamos fazer diferente...
Vamos definir este método em uma Unit .. Que sera nossa Unit De
Funçoes de todo o projeto. Adicione esta Unit ao Projeto
[b:7aaaa4d720]Adicione essa Unit no Formulario PAI ... MAS NA USES DA SECÇÃO INTERFACE
e defina um Campo[/b:7aaaa4d720]
finalmente nos form Herdados vc chama assim:
Testa ai..
com exceção da Proteção.. Pq aonde esta Localizado o Try , o Form Nen
pode ter sido criado e vc esta chamando Finally
O cert é assim :
Criar Try Mostar etc.. Finally
Vc esta fazendo assim :
Try etc.. Cria Mostrar Finally
Mais correto ainda é usar dois Blocos Try Try Except Finally
Try Try codigo Sql except Trar os erros ou ignora-los end; Criar o Form Mostar Finally Destruir end;
procedure TFrPrincipal.CadRegioesClick(Sender: TObject);
begin
try
try
V_NmCampo := ´Reg_Cod´;
V_TamCampo := 4;
DtmSys.CdsBase.Close;
DtmSys.SqlBase.Close;
FrPrincipal.EdtChave.Text := dmdados.CliDtStSequencias.fieldbyname(´Reg_Cod´).AsString;
V_Chave := FrPrincipal.EdtChave.Text;
V_SqlTabela := ´SELECT * FROM REGIOES WHERE REG_COD = :CODIGO´;
// --- Abrir Mestre
V_CliDtSt := DtmSys.CdsBase;
V_DtStPrv := DtmSys.PrvBase;
V_SqlDtSt := DtmSys.SqlBase;
V_DtSource := DtmSys.DsBase;
V_SqlMestre := SqlRegioesMestre;
V_SqlDtSt.Close;
V_Clidtst.Close;
V_SqlDtSt.CommandText := V_SqlMestre;
V_SqlDtSt.ParamByName(´Codigo´).AsString := V_Chave;
V_CliDtSt.Open;
except
//qualquer erro que houver relativo ao Sql sera Tratado ou ignorado
//Aqui
end;
FrCadRegioes := TFrCadRegioes.Create( nil ); >> aqui crio o Form herdado
FrCadRegioes.ShowModal; >> mostro o form
finally
FrCadRegioes.release; //procedimento recomendável para Formulário
FrCadRegioes := Nil;
end;
end;
Como vc disse no inicio do Form , pressupoê-se que FrCadRegioes é um formulario que Herdou de um Outro Formulario PAI Cadstro
Então se o Método LimparCampos Esta definido na Classe Pai não tem
sentido nenhum o que vc esta dizendo :
fiz como recomendado mas agora quando chama a rotina LimparCampos; ela é executada mas não entra na instrução Clear.(TCustomEdit(components[i]).Clear) -->> essa linha não é executada;
Vamos fazer diferente...
Vamos definir este método em uma Unit .. Que sera nossa Unit De
Funçoes de todo o projeto. Adicione esta Unit ao Projeto
unit uFuncoes;
interface
uses
Forms, StdCtrls;
Type
TFuncoes = class
procedure LimparCampo(formulario:TForm);
end;
implementation
procedure LimparCampo(formulario:TForm);
var
i:integer;
begin
with formulario do
begin
for i:=0 To ComponentCount-1 do
if components[i] is TCustomEdit then
TCustomEdit(components[i]).Clear
end;
end;
end.
[b:7aaaa4d720]Adicione essa Unit no Formulario PAI ... MAS NA USES DA SECÇÃO INTERFACE
e defina um Campo[/b:7aaaa4d720]
type
TFPai = class(TForm)
...............
protected
fFuncoes:TFuncoes; //defina este campo
end;
finalmente nos form Herdados vc chama assim:
fFuncoes.LimparCampo(self);
Testa ai..
GOSTEI 0
Acneto
27/02/2009
Ok, Marcos,
obrigado pela paciencia
Sobre a Unit de funções (eu compreendi)
Minha idéia é que estas rotinas / funções
LimparCampo
AtivarDesativarCampos
GravarRegistros
sejam chamadas apenas pelo form Pai
nunca pelos forms herdados.
A idéia é que os forms herdasdos fiquem quase que sem código.
Tudo será feito pelo form pai
será que é póssível???
No inicio da criação do formpadrao
eu estava criando estas rotinas passando como parametro o nome do formulario, mas não estava criando a estrutura de classes
vamos lá estou pronto para apreender o certo.
Abraços
Neto
obrigado pela paciencia
Sobre a Unit de funções (eu compreendi)
Minha idéia é que estas rotinas / funções
LimparCampo
AtivarDesativarCampos
GravarRegistros
sejam chamadas apenas pelo form Pai
nunca pelos forms herdados.
A idéia é que os forms herdasdos fiquem quase que sem código.
Tudo será feito pelo form pai
será que é póssível???
No inicio da criação do formpadrao
eu estava criando estas rotinas passando como parametro o nome do formulario, mas não estava criando a estrutura de classes
Type TFuncoes = class
type TFPai = class(TForm) ............... protected fFuncoes:TFuncoes; //defina este campo end;
vamos lá estou pronto para apreender o certo.
Abraços
Neto
GOSTEI 0
Marco Salles
27/02/2009
O certo é isso
Uma Unit Funcoes que contem suas funçoes especificas comums não so
aos seus Formulários , mas a TODOS OS SEUS PROJETOS FUTUROS
Para cada Novo projeto a Unit Funcoes esta lá, prontinha para ser usada
Basta estar na Library Pach do DELPHI
Nesta Unit vc pode ter funcoes Inibir , limpar Campos , Validar CPF,
validar CNPJ , formatar saidas de Strings... e Pronto vc poderá usa-la
não so nos form do projeto atual , mas em TODOS OS FORMS DE QQ
PROJETO
o segundo passo é usas a Herança...
A partir da definição
type
TFPai = class(TForm)
...............
protected
fFuncoes:TFuncoes; //defina este campo
end;
Todas os formulários Filhos irão poder acessar os métodos contidos na Unit FUNCOES... Note que se tivermos CEM forms Filhos , em nenhum
deles precisaremos definir a UNIT FUNCOES .. pois ela ja esta
encapsulada pelo campo da Propriedade PROTECTED do FORM PAI
quase tudo né.. O Mínimo de código possivel
Então No Botão por exemplo do form PAI se vc escrever assim:
mesmo que vc não tenha nenhum EDIT nesse form PAI , e quando um
Form Filho estiver instanciado e Voce clikak neste Botão HERDADO do
Form PAI
vc irá executar < COM CERTEZA > tudo que foi definido no Evento Onclick
fo formPAI .. neste caso o
Usando Encapsulamento , Herança estaremos de acordo com a POO
OK...
Uma Unit Funcoes que contem suas funçoes especificas comums não so
aos seus Formulários , mas a TODOS OS SEUS PROJETOS FUTUROS
Para cada Novo projeto a Unit Funcoes esta lá, prontinha para ser usada
Basta estar na Library Pach do DELPHI
Nesta Unit vc pode ter funcoes Inibir , limpar Campos , Validar CPF,
validar CNPJ , formatar saidas de Strings... e Pronto vc poderá usa-la
não so nos form do projeto atual , mas em TODOS OS FORMS DE QQ
PROJETO
o segundo passo é usas a Herança...
A partir da definição
type
TFPai = class(TForm)
...............
protected
fFuncoes:TFuncoes; //defina este campo
end;
Todas os formulários Filhos irão poder acessar os métodos contidos na Unit FUNCOES... Note que se tivermos CEM forms Filhos , em nenhum
deles precisaremos definir a UNIT FUNCOES .. pois ela ja esta
encapsulada pelo campo da Propriedade PROTECTED do FORM PAI
A idéia é que os forms herdasdos fiquem quase que sem código.
Tudo será feito pelo form pai
será que é póssível???
quase tudo né.. O Mínimo de código possivel
Então No Botão por exemplo do form PAI se vc escrever assim:
procedure TFormPAI.Button1Click(Sender: TObject); begin //Outros METODOS DO FORM pai fFuncoes.LimparCampo(self); end;
mesmo que vc não tenha nenhum EDIT nesse form PAI , e quando um
Form Filho estiver instanciado e Voce clikak neste Botão HERDADO do
Form PAI
procedure TFormFILHO.Button1Click(Sender: TObject); begin //Meus método particulares inherited; // chama o método onclick Da Classe pai end;
vc irá executar < COM CERTEZA > tudo que foi definido no Evento Onclick
fo formPAI .. neste caso o
//Outros METODOS DO FORM pai fFuncoes.LimparCampo(self);
Usando Encapsulamento , Herança estaremos de acordo com a POO
OK...
GOSTEI 0
Acneto
27/02/2009
:D
Ótimo Marcos Salles, estou vibrando.
Consegui implementar as rotinas de LimparCampo e AtivarDesativarCampos conforme suas orietações e está rodando.
Vou apresentar abaixo o código para sua apreciação, na sequencia gostaria de retomar sobre a rotina de GravarRegistro (ok.?)
Agora a Unit Funcoes:
Até aqui está rodando, poderiamos falar sobre gravarregistro e mostrarregistro???
Muito obrigado
Abraços
Neto
Ótimo Marcos Salles, estou vibrando.
Consegui implementar as rotinas de LimparCampo e AtivarDesativarCampos conforme suas orietações e está rodando.
Vou apresentar abaixo o código para sua apreciação, na sequencia gostaria de retomar sobre a rotina de GravarRegistro (ok.?)
unit UnCadastroPadrao;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, StdCtrls, Buttons, ActnList,
DBCtrls, Grids, ValEdit, DBXpress, DB, QStdCtrls, UnFuncoes; ==> veja aqui a declaração
type
TFrCadastroPadrao = class(TForm)
Stb: TStatusBar;
Bevel1: TBevel;
BtnIncluir: TBitBtn;
BtnAlterar: TBitBtn;
BtnExcluir: TBitBtn;
BtnCancelar: TBitBtn;
BtnPesquisar: TBitBtn;
BtnGravar: TBitBtn;
BtnSair: TBitBtn;
ActionListCadastro: TActionList;
AcIncluir: TAction;
AcAlterar: TAction;
AcExcluir: TAction;
AcCancelar: TAction;
AcPesquisar: TAction;
AcGravar: TAction;
AcSair: TAction;
PbCadastro: TProgressBar;
List: TValueListEditor;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnIncluirClick(Sender: TObject);
procedure BtnAlterarClick(Sender: TObject);
procedure BtnExcluirClick(Sender: TObject);
procedure BtnCancelarClick(Sender: TObject);
procedure btnPesquisarClick(Sender: TObject);
procedure BtnGravarClick(Sender: TObject);
procedure BtnSairClick(Sender: TObject);
procedure DBEdit1Enter(Sender: TObject);
procedure DBEdit1Exit(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FMensagemDoSistema : String;
procedure FormOperacaoAtiva;
procedure SetMensagemDoSistema(const Value: String);
//---
protected // Definir o Método Aqui
procedure LimparCampos;
procedure AtivarDesativarCampos(chave:Boolean);
procedure GravarRegistro;
protected
fFuncoes : TFuncoes; //defina este campo == > aqui a declaração
function RetornarComponent(Nome:String):TCustomEdit;
public
{ Public declarations }
property MensagemDoSystema :String read FMensagemDoSistema write SetMensagemDoSistema;
{ Procedimentos }
procedure ModoNavegacao; virtual;
procedure ModoEdicao; virtual;
end;
var
FrCadastroPadrao: TFrCadastroPadrao;
implementation
uses UnSql, UnMenuPrincipal, UnProcSystem, UnDM;
Agora a Unit Funcoes:
unit UnFuncoes; interface uses Forms, StdCtrls, ComCtrls; Type TFuncoes = class procedure LimparCampo(formulario:TForm); procedure AtivarDesativarCampos(formulario:TForm; chave:Boolean); end; implementation procedure TFuncoes.LimparCampo(Formulario:TForm); var i:integer; begin with formulario do begin for i:=0 To ComponentCount-1 do begin if components[i] is TCustomEdit then TCustomEdit(components[i]).Clear end; end; end; procedure TFuncoes.AtivarDesativarCampos(Formulario:TForm; chave:Boolean); var i:integer; begin with formulario do begin for i:=0 to ComponentCount - 1 do if components[i] is TCustomEdit then TCustomEdit(components[i]).Enabled :=chave; end; end; end.
Até aqui está rodando, poderiamos falar sobre gravarregistro e mostrarregistro???
Muito obrigado
Abraços
Neto
GOSTEI 0
Marco Salles
27/02/2009
Tudo bem
So não entendi pq vc repetiu os métodos:
Acho que deve ter sido erro de Digitação ..
Bem para implementar sua rotina de gravar Registro , seria necessário
entender qual a verdadeira função do ValueListEditor1 Nesta Arquitetura
Nos form Filhos ele fica Visível ????
Acho que o mesmo efeito pode ser Obtido com Lista de Objetos
Uma maneira elegante de fazer isto é usando a Classe TstringList;
Vou de dar um exemplo
No form Pai defina em Proteced uma Variavel
Defina um mpetodo No action List que sera no FUTURO o Gravar
Agora vamos aos Form Filhos
No Evento OnClose
Agora no evento Gravar <Aqui so a titulo de exemplo>
Veja que vc consegue Passar O nome dos Edits bem como O Text dos
Edits para o Form PAI... Exatamente como Vc quer Fazer , so que usando
o [b:48ec8b9896][u:48ec8b9896]ValueListEditor[/u:48ec8b9896][/b:48ec8b9896] , so que de uma maneira muito mais
POO
Portanto uses assim
Tente entender o exemplo , pq acho que é exatamente isso que Vc precisa
So não entendi pq vc repetiu os métodos:
//---
protected // Definir o Método Aqui
procedure LimparCampos;
procedure AtivarDesativarCampos(chave:Boolean);
procedure GravarRegistro;
protected
fFuncoes : TFuncoes; //defina este campo == > aqui a declaração
Acho que deve ter sido erro de Digitação ..
Bem para implementar sua rotina de gravar Registro , seria necessário
entender qual a verdadeira função do ValueListEditor1 Nesta Arquitetura
Nos form Filhos ele fica Visível ????
Acho que o mesmo efeito pode ser Obtido com Lista de Objetos
Uma maneira elegante de fazer isto é usando a Classe TstringList;
Vou de dar um exemplo
No form Pai defina em Proteced uma Variavel
protected
FLista:TStringList;
Defina um mpetodo No action List que sera no FUTURO o Gravar
var i:integer; begin for i:=0 to Flista.Count - 1 do showmessage(Flista.Strings[i] + 1013+ (Flista.Objects[i] as TCustomEdit).Name);
Agora vamos aos Form Filhos
No evento OnShow Flista:=TstringList.Create;
No Evento OnClose
FLista.free;
Agora no evento Gravar <Aqui so a titulo de exemplo>
Flista.Clear; with FormFIlho do for i:=0 to ComponentCount-1 do if components[i] is TCustomEdit Then begin Flista.AddObject(TCustomEdit(components[i]).Text, TCustomEdit(components[i])); end; inherited;
Veja que vc consegue Passar O nome dos Edits bem como O Text dos
Edits para o Form PAI... Exatamente como Vc quer Fazer , so que usando
o [b:48ec8b9896][u:48ec8b9896]ValueListEditor[/u:48ec8b9896][/b:48ec8b9896] , so que de uma maneira muito mais
POO
so para finalizar.. Vi em seus posts anteriores que Vc usou o Nil
Muito Importante : O NIL não destroe o Objeto da memória apenas
perdemos a Referencia desse Objeto ... Assim
Form:=Nil ; perde-se o ponteiro mas o Objeto ainda esta na memória
e não teremos mais com Destrui-lo
Portanto uses assim
Finally Form.Release; Form:=Nil
Tente entender o exemplo , pq acho que é exatamente isso que Vc precisa
GOSTEI 0
Acneto
27/02/2009
:P
Olá Marcos, obrigado e vamos novamente. Sobre ter repetido o metodo:
Não entendi onde eu repeti os metodos??
Sobre o ValueList ele é visivel no form filho (visible:=false) resolvi usa-lo porque ele permite ter uma celula para informar o nome na tabela e outra o correspondente nome do edit no form e cada form filho tem seus proprios campos, logico que existe um ValueListEditor no FormPadrao(Pai) veja:
=================
Key ----- - - - Value
Cli_Cod - - -- EdtCodigo.Text
Cli_Nome- --- EdtNome.Text
Cli_Data--- -- EdtDtCadastro.Text
etc...
O ValueListEditor é uma string com celulas casadas Key X Value por isso tento usar.
Você acha que conseguirei fazer o que quero fazendo uso deste componente?
Este código gostaria que estivesse no FormPadrao(Pai), mas enchergando o ValuListEditor Correspondente ao formulario ativo.
Sobre destruir o form, vol fazer conforme sua orientação.
Obrigado (paciencioso amigo)
Neto
Olá Marcos, obrigado e vamos novamente. Sobre ter repetido o metodo:
So não entendi pq vc repetiu os métodos: protected // Definir o Método Aqui procedure LimparCampos; procedure AtivarDesativarCampos(chave:Boolean); procedure GravarRegistro; protected fFuncoes : TFuncoes; //defina este campo == > aqui a declaração
Não entendi onde eu repeti os metodos??
Sobre o ValueList ele é visivel no form filho (visible:=false) resolvi usa-lo porque ele permite ter uma celula para informar o nome na tabela e outra o correspondente nome do edit no form e cada form filho tem seus proprios campos, logico que existe um ValueListEditor no FormPadrao(Pai) veja:
=================
Key ----- - - - Value
Cli_Cod - - -- EdtCodigo.Text
Cli_Nome- --- EdtNome.Text
Cli_Data--- -- EdtDtCadastro.Text
etc...
O ValueListEditor é uma string com celulas casadas Key X Value por isso tento usar.
Você acha que conseguirei fazer o que quero fazendo uso deste componente?
Flista.Clear; with FormFIlho do for i:=0 to ComponentCount-1 do if components[i] is TCustomEdit Then begin Flista.AddObject(TCustomEdit(components[i]).Text, TCustomEdit(components[i])); end; inherited;
Este código gostaria que estivesse no FormPadrao(Pai), mas enchergando o ValuListEditor Correspondente ao formulario ativo.
Sobre destruir o form, vol fazer conforme sua orientação.
Obrigado (paciencioso amigo)
Neto
GOSTEI 0
Marco Salles
27/02/2009
Olá Marcos, obrigado e vamos novamente. Sobre ter repetido o metodo:
Código:
So não entendi pq vc repetiu os métodos:
[color=darkred:70258b8b84][b:70258b8b84]//Codigo Duplicado.... Isto ja esta Definido em UFUNCOES e encapusulado
//pelo acesso a TFuncoes pelo Campo fFuncoes:TFuncoes[/b:70258b8b84][/color:70258b8b84]
procedure GravarRegistro;
protected
fFuncoes : TFuncoes; //defina este campo == > aqui a declaração
Não entendi onde eu repeti os metodos??
protected // Definir o Método Aqui procedure LimparCampos; procedure AtivarDesativarCampos(chave:Boolean);
O ValueListEditor é uma string com celulas casadas Key X Value por isso tento usar.
[b:70258b8b84]Você acha que conseguirei fazer o que quero fazendo uso deste componente? [/b:70258b8b84]
Código:
Flista.Clear; with FormFIlho do for i:=0 to ComponentCount-1 do if components[i] is TCustomEdit Then begin Flista.AddObject(TCustomEdit(components[i]).Text, TCustomEdit(components[i])); end; inherited;
[color=darkred:70258b8b84][b:70258b8b84]com certeza...[/b:70258b8b84][/color:70258b8b84]
A resposta seria SIM... mas tenho uma dúvida de como vc define esse
valores para as colunas do ValueListEditor ... Qual o método que vc usa
para Alimentar o ValueListEditor em cada Formulário HERDADO
GOSTEI 0
Acneto
27/02/2009
:?:
Bobeei na repetição dos métodos.
Gostaria de enviar copia (imagem) do FormFilho, nele vc verá como é declarado os nomes dos campos/edit´s.
Tem como eu fazer isso aqui no forum ou te enviar por e-mail anexado.
Neto
Bobeei na repetição dos métodos.
Gostaria de enviar copia (imagem) do FormFilho, nele vc verá como é declarado os nomes dos campos/edit´s.
Tem como eu fazer isso aqui no forum ou te enviar por e-mail anexado.
Neto
GOSTEI 0