Obter conteudo do Edit do Form herdado

Delphi

27/02/2009

:?:
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

Neto

Curtidas 0

Respostas

Marco Salles

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 :

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

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


GOSTEI 0
Marco Salles

Marco Salles

27/02/2009

Um problema de cada vez:

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

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;

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

Marco Salles

27/02/2009

Ola Neto . No inicio do meu primeiro poste eu disse :

é 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

Acneto

27/02/2009

Ok,
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

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 :

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

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

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

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

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

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.?)
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

Marco Salles

27/02/2009

Tudo bem

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

Acneto

27/02/2009

:P
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

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]
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??


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

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


GOSTEI 0
POSTAR