Fórum Obter conteudo do Edit do Form herdado #368727
27/02/2009
0
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
Curtir tópico
+ 0Posts
28/02/2009
Marco Salles
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....
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
28/02/2009
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
28/02/2009
Marco Salles
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
02/03/2009
Acneto
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
02/03/2009
Marco Salles
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
02/03/2009
Acneto
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
02/03/2009
Marco Salles
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;
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
[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:
fFuncoes.LimparCampo(self);
Testa ai..
Gostei + 0
02/03/2009
Acneto
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
02/03/2009
Marco Salles
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:
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
02/03/2009
Acneto
Ó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
02/03/2009
Marco Salles
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
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
Portanto uses assim
Finally Form.Release; Form:=Nil
Tente entender o exemplo , pq acho que é exatamente isso que Vc precisa
Gostei + 0
03/03/2009
Acneto
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
03/03/2009
Marco Salles
protected // Definir o Método Aqui procedure LimparCampos; procedure AtivarDesativarCampos(chave:Boolean);
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
03/03/2009
Acneto
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
Clique aqui para fazer login e interagir na Comunidade :)