Autor
Mensagem
Preciso de ajuda amigos. Estou tentando passar valores de variaveis de um form para outro chamado em tempo de execução, mas não estou conseguindo. Cheguei a ver algumas situações no forum, mas mesmo assim nao funcionou. A idéia é a seguinte: imagine que estou no form de consulta de titulos e ao clicar em um determinado titulo, chamo outro form para realizar alteração, desta forma quero pegar os valores chaves armazena-los em variaveis e transporta-las para outro form, assim desta forma, ao ser iniciado o outro form na procedure create, pego as variaveis e faço um locate no banco para trazer o registro. Por favor me ajudem.
sim e não. veja, quando estou em consulta em determinado form como dito, criei outro form com a finalidade de incluir ou alterar. desta forma, passando as variaveis vou saber se estou incluindo ou alterando, que no caso de alteracao, trarei o registro na ativa para proceder com a mudanca no caso de ser desejada.
Fiz isto, por isso descobri que o valor não esta passando.
unit CtpagarDigitacaoTitulos;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, StdCtrls, Buttons, DBCtrls, Mask, ExtCtrls,
DBClient;
type
Tfrmctpagartitulos = class(TForm)
bbinclusao: TBitBtn;
bbalteracao: TBitBtn;
bbexclusao: TBitBtn;
bbimpressao: TBitBtn;
bbconfirmacao: TBitBtn;
bbcancela: TBitBtn;
bbsair: TBitBtn;
bbconsulta: TBitBtn;
gbfiltros: TGroupBox;
dsctpfornecedor: TDataSource;
dstitulo: TDataSource;
dsitem: TDataSource;
dsvencimento: TDataSource;
dsdesconto: TDataSource;
gbtitulos: TGroupBox;
dbtitulos: TDBGrid;
gbitens: TGroupBox;
dbitems: TDBGrid;
gbvencimentos: TGroupBox;
dbvencimentos: TDBGrid;
gbdescontos: TGroupBox;
dbdescontos: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure bbsairClick(Sender: TObject);
procedure dbtitulosCellClick(Column: TColumn);
procedure dbvencimentosCellClick(Column: TColumn);
procedure bbexclusaoClick(Sender: TObject);
procedure bbinclusaoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmctpagartitulos: Tfrmctpagartitulos;
var empaux : Integer;
var fornecaux : Integer;
var notaaux : Integer;
var serieaux : String;
var dataaux : TDate;
var tituloatual : String;
var transporte : String;
implementation
uses CtpagarDM, CtpagarDigitacaoTitulos2;
{$R *.dfm}
procedure Tfrmctpagartitulos.FormCreate(Sender: TObject);
begin
.
.
.
.
.
.
.
.
.
.
.
end;
Aqui neste ponto é a chamada do outro formulario. Eu preciso passar o valor de uma variavel para o outro form.
Exemplo:
numero_nota_fiscal := 00001;
serie_nota_fiscal : U;
procedure Tfrmctpagartitulos.bbinclusaoClick(Sender: TObject);
begin
with Tfrmctpagartitulos2.Create(Self) do
try
frmctpagartitulos2.ShowModal;
finally
FreeAndNil(frmctpagartitulos2);
end;
.
.
.
.
.
.
end;
end.
Aqui o Outro form.
unit CtpagarDigitacaoTitulos2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, StdCtrls, Buttons, Mask, Grids, DBGrids, ExtCtrls, DB,
DBClient;
type
Tfrmctpagartitulos2 = class(TForm)
pnprincipal: TPanel;
lbcodfornec: TLabel;
lbnumerotitulo: TLabel;
lbserietitulo: TLabel;
lbdataemissao: TLabel;
lbvalortitulo: TLabel;
lbdescontos: TLabel;
lbjuros: TLabel;
lbmulta: TLabel;
lbliquido: TLabel;
lbqtdeitens: TLabel;
lbqtdecobranca: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure trazregistrotitulo;
procedure trazregistroitem;
procedure trazregistrovencimento;
procedure trazregistrodesconto;
public
{ Public declarations }
end;
var
frmctpagartitulos2: Tfrmctpagartitulos2;
opcaon : Integer;
opcaoprocura : Integer;
opcaovalidar : Boolean;
contador : Integer;
contador3 : Integer;
contadoritem : Integer;
contadorvencimento : Integer;
contadordesconto : Integer;
valorauxiliar : Currency;
codigoempresa : Integer;
implementation
uses CtpagarDM, DateUtils;
{$R *.dfm}
procedure Tfrmctpagartitulos2.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
key := #0;
perform(WM_NEXTDLGCTL, 0, 0);
end;
end;
Neste ponto eu imagino que seja onde vou pegar os valores das variaveis
procedure Tfrmctpagartitulos2.FormCreate(Sender: TObject);
begin
dmCtpagar.cdsCtpFornecedor.Open;
dmCtpagar.cdsCtpGrupo.Open;
dmCtpagar.cdsCtpTitulo.Open;
dmCtpagar.cdsCtpItem.Open;
dmCtpagar.cdsCtpVencimento.Open;
dmCtpagar.cdsCtpDesconto.Open;
cdsctpprincipaltitulo.Open;
cdsctpprincipalitem.Open;
cdsctpprincipalvencimento.Open;
cdsctpprincipaldesconto.Open;
codigoempresa := 001;
opcaon := 1;
end;
procedure Tfrmctpagartitulos2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
dmCtpagar.cdsCtpFornecedor.Close;
dmCtpagar.cdsCtpGrupo.Close;
dmCtpagar.cdsCtpTitulo.Close;
dmCtpagar.cdsCtpItem.Close;
dmCtpagar.cdsCtpVencimento.Close;
dmCtpagar.cdsCtpDesconto.Close;
cdsctpprincipaltitulo.Close;
cdsctpprincipalitem.Close;
cdsctpprincipalvencimento.Close;
cdsctpprincipaldesconto.Close;
end;
procedure Tfrmctpagartitulos2.dbeprincipalcodigoExit(Sender: TObject);
begin
.
.
.
.
.
end;
.
.
.
.
end.
unit CtpagarDigitacaoTitulos;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, StdCtrls, Buttons, DBCtrls, Mask, ExtCtrls,
DBClient;
type
Tfrmctpagartitulos = class(TForm)
bbinclusao: TBitBtn;
bbalteracao: TBitBtn;
bbexclusao: TBitBtn;
bbimpressao: TBitBtn;
bbconfirmacao: TBitBtn;
bbcancela: TBitBtn;
bbsair: TBitBtn;
bbconsulta: TBitBtn;
gbfiltros: TGroupBox;
dsctpfornecedor: TDataSource;
dstitulo: TDataSource;
dsitem: TDataSource;
dsvencimento: TDataSource;
dsdesconto: TDataSource;
gbtitulos: TGroupBox;
dbtitulos: TDBGrid;
gbitens: TGroupBox;
dbitems: TDBGrid;
gbvencimentos: TGroupBox;
dbvencimentos: TDBGrid;
gbdescontos: TGroupBox;
dbdescontos: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure bbsairClick(Sender: TObject);
procedure dbtitulosCellClick(Column: TColumn);
procedure dbvencimentosCellClick(Column: TColumn);
procedure bbexclusaoClick(Sender: TObject);
procedure bbinclusaoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmctpagartitulos: Tfrmctpagartitulos;
var empaux : Integer;
var fornecaux : Integer;
var notaaux : Integer;
var serieaux : String;
var dataaux : TDate;
var tituloatual : String;
var transporte : String;
implementation
uses CtpagarDM, CtpagarDigitacaoTitulos2;
{$R *.dfm}
procedure Tfrmctpagartitulos.FormCreate(Sender: TObject);
begin
.
.
.
.
.
.
.
.
.
.
.
end;
Aqui neste ponto é a chamada do outro formulario. Eu preciso passar o valor de uma variavel para o outro form.
Exemplo:
numero_nota_fiscal := 00001;
serie_nota_fiscal : U;
procedure Tfrmctpagartitulos.bbinclusaoClick(Sender: TObject);
begin
with Tfrmctpagartitulos2.Create(Self) do
try
frmctpagartitulos2.ShowModal;
finally
FreeAndNil(frmctpagartitulos2);
end;
.
.
.
.
.
.
end;
end.
Aqui o Outro form.
unit CtpagarDigitacaoTitulos2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, StdCtrls, Buttons, Mask, Grids, DBGrids, ExtCtrls, DB,
DBClient;
type
Tfrmctpagartitulos2 = class(TForm)
pnprincipal: TPanel;
lbcodfornec: TLabel;
lbnumerotitulo: TLabel;
lbserietitulo: TLabel;
lbdataemissao: TLabel;
lbvalortitulo: TLabel;
lbdescontos: TLabel;
lbjuros: TLabel;
lbmulta: TLabel;
lbliquido: TLabel;
lbqtdeitens: TLabel;
lbqtdecobranca: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure trazregistrotitulo;
procedure trazregistroitem;
procedure trazregistrovencimento;
procedure trazregistrodesconto;
public
{ Public declarations }
end;
var
frmctpagartitulos2: Tfrmctpagartitulos2;
opcaon : Integer;
opcaoprocura : Integer;
opcaovalidar : Boolean;
contador : Integer;
contador3 : Integer;
contadoritem : Integer;
contadorvencimento : Integer;
contadordesconto : Integer;
valorauxiliar : Currency;
codigoempresa : Integer;
implementation
uses CtpagarDM, DateUtils;
{$R *.dfm}
procedure Tfrmctpagartitulos2.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
key := #0;
perform(WM_NEXTDLGCTL, 0, 0);
end;
end;
Neste ponto eu imagino que seja onde vou pegar os valores das variaveis
procedure Tfrmctpagartitulos2.FormCreate(Sender: TObject);
begin
dmCtpagar.cdsCtpFornecedor.Open;
dmCtpagar.cdsCtpGrupo.Open;
dmCtpagar.cdsCtpTitulo.Open;
dmCtpagar.cdsCtpItem.Open;
dmCtpagar.cdsCtpVencimento.Open;
dmCtpagar.cdsCtpDesconto.Open;
cdsctpprincipaltitulo.Open;
cdsctpprincipalitem.Open;
cdsctpprincipalvencimento.Open;
cdsctpprincipaldesconto.Open;
codigoempresa := 001;
opcaon := 1;
end;
procedure Tfrmctpagartitulos2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
dmCtpagar.cdsCtpFornecedor.Close;
dmCtpagar.cdsCtpGrupo.Close;
dmCtpagar.cdsCtpTitulo.Close;
dmCtpagar.cdsCtpItem.Close;
dmCtpagar.cdsCtpVencimento.Close;
dmCtpagar.cdsCtpDesconto.Close;
cdsctpprincipaltitulo.Close;
cdsctpprincipalitem.Close;
cdsctpprincipalvencimento.Close;
cdsctpprincipaldesconto.Close;
end;
procedure Tfrmctpagartitulos2.dbeprincipalcodigoExit(Sender: TObject);
begin
.
.
.
.
.
end;
.
.
.
.
end.
A primeiro form está assim?
#Código
#Código
procedure Tfrmctpagartitulos.bbinclusaoClick(Sender: TObject);
begin
with Tfrmctpagartitulos2.Create(Self) do
try
numero_nota_fiscal := 00001;
serie_nota_fiscal : U;
frmctpagartitulos2.ShowModal;
finally
FreeAndNil(frmctpagartitulos2);
end;
Repare neste teste usando 2 forms, o form1 vai passar um valor para variável do form2:
#Código
Note que testo 2 vezes, uma no evento OnShow do form2 e outra no evento OnClick do botão. Funcionou normalmente....
#Código
// Unit do form1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FMTBcd;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
try
Form2 := TForm2.Create(self);
//Passo o valo 001 para variável que está no form2
campo := 001;
Form2.ShowModal;
finally
FreeAndNil(form2);
end;
end;
end.
//Unit do form2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
end;
var
Form2: TForm2;
campo: Integer; // Declaração da variável
implementation
{$R *.dfm}
procedure TForm2.btn1Click(Sender: TObject);
begin
ShowMessage(IntToStr(campo));
end;
procedure TForm2.FormShow(Sender: TObject);
begin
ShowMessage(IntToStr(campo));
end;
end.
Note que testo 2 vezes, uma no evento OnShow do form2 e outra no evento OnClick do botão. Funcionou normalmente....
Cara só mais uma perguntinha, pois tudo que fiz deu certo. Após o FormCreate o form já esta criado, porém quando o focus cair sobre o primeiro campo na lista, eu preciso operar as opcoes antes, pois dai vou saber o que fazer, neste caso o OnShow é executado primeiro que o focus ?
Talvez eu não tenha me explicado direito. Vou tentar ser bem explicito. Fiz um form onde os grids dos titulos trazem todas as informações necessarias. Blz. O usuário poderá consultar todas as informacoes que neles estao contidas. Neste form posso excluir, incluir ou alterar um titulo. Na exclusao é facil e posso nele mesmo verificar se o usuario tem essa possibilidade. Caso o usuario queira incluir, ou alterar ele ira clicar nos botoes, o que chamara o outro form, que tem de servir para a mesma funcao. Ora se crio o form atraves do Create, em seguida a este a execucao já será executada, após isto o focus será para o primeiro campo da tela. Entao antes desse focus eu preciso executar algumas situacoes. A pergunta é: O que esta entre o Create e o Focus do campo ? Seria o OnShow, por acaso ?
Eu sei que o problema já foi resolvido, mas se eu puder dar minha opinião.
A forma com que foi resolvido, realmente funciona perfeitamente, mas o ideal, que já esta comprovando, é a utilização da Orientação a Objeto, você criaria um objeto do tipo Titulo, e passaria o objeto totalmente populado pelo Create para o outro form, você trabalha jogando objetos de um lado para outro, facilita muito.
Se for do seu interesse posso criar um exemplo simples e te enviar.
Abraço
Cauê Nishijima
A forma com que foi resolvido, realmente funciona perfeitamente, mas o ideal, que já esta comprovando, é a utilização da Orientação a Objeto, você criaria um objeto do tipo Titulo, e passaria o objeto totalmente populado pelo Create para o outro form, você trabalha jogando objetos de um lado para outro, facilita muito.
Se for do seu interesse posso criar um exemplo simples e te enviar.
Abraço
Cauê Nishijima
Citação:
Eu sei que o problema já foi resolvido, mas se eu puder dar minha opinião.
A forma com que foi resolvido, realmente funciona perfeitamente, mas o ideal, que já esta comprovando, é a utilização da Orientação a Objeto, você criaria um objeto do tipo Titulo, e passaria o objeto totalmente populado pelo Create para o outro form, você trabalha jogando objetos de um lado para outro, facilita muito.
Se for do seu interesse posso criar um exemplo simples e te enviar.
Abraço
Cauê Nishijima
concordo com vc amigo , ja disse issto desde do inicio (Funcionar porém ...)
Olá MARCO ANTONIO SALLES tudo bem? Não sei você, mas eu tenho dificuldade de encontrar programadores Delphi que tenham conhecimento em O.O. acredito que seja pela grande facilidade que o Delphi fornece, mas Delphi é uma linguagem completamente O.O. assim como Java e C#.
E acredito que com os investimentos que a Embarcadeiro vem fazendo nessa grande ferramente, agora com o firemonkey, DataSnap aperfeiçoado, RTTI, Unicode, métodos anônimos, etc...Só falta agora os programdores começarem a utilizar O.O. e Padrões de Projetos, mas a Embarcadeiro vem investindo nisso com as certificações e os novos cursos oficiais.
Qual sua opinião sobre O.O. no mundo dos programadores Delphi? Você também tem essa dificuldade de encontrar desenvolvedores O.O.?
Att.
Cauê Nishijima
E acredito que com os investimentos que a Embarcadeiro vem fazendo nessa grande ferramente, agora com o firemonkey, DataSnap aperfeiçoado, RTTI, Unicode, métodos anônimos, etc...Só falta agora os programdores começarem a utilizar O.O. e Padrões de Projetos, mas a Embarcadeiro vem investindo nisso com as certificações e os novos cursos oficiais.
Qual sua opinião sobre O.O. no mundo dos programadores Delphi? Você também tem essa dificuldade de encontrar desenvolvedores O.O.?
Att.
Cauê Nishijima
Citação:
Citação:
Eu sei que o problema já foi resolvido, mas se eu puder dar minha opinião.
A forma com que foi resolvido, realmente funciona perfeitamente, mas o ideal, que já esta comprovando, é a utilização da Orientação a Objeto, você criaria um objeto do tipo Titulo, e passaria o objeto totalmente populado pelo Create para o outro form, você trabalha jogando objetos de um lado para outro, facilita muito.
Se for do seu interesse posso criar um exemplo simples e te enviar.
Abraço
Cauê Nishijima
concordo com vc amigo , ja disse issto desde do inicio (Funcionar porém ...)
Ola Caue
Gostaria de saber sim como posso faze-lo ?
Citação:
Gostaria de saber como ? Inclusive seria muito mais facil pois poderia estar andando com esta informacao para qualquer lugar
dentro dos forms que por ventura venham a ser chamado
é assim
1) Vc define o Objeto . No meu caso vou trabalhar com Record
Type
TParametros = Record
numero_nota_fiscal :String;
serie_nota_fiscal : char;
End;
2)depois vc define um constructor Personalizado , pode ser tb um ShowModal , Vou definir o constructor
na secçã Public do form a ser chamado
........
public
{ Public declarations }
constructor create(Aowner:TComponent;Parametros:TParametros);overload;
end;
3) Vc defibe o campo na secção Private deste form do tipo do Objeto a ser Passado
private
FParametros:TParametros;
4) Vc implementa o método do constructor
constructor TForm3.create(Aowner: TComponent;Parametros:TParametros);
begin
inherited create(Aowner);
FParametros:=Parametros;
end;
5) Vc utiliza o objeto como quiser
procedure TForm3.Button1Click(Sender: TObject);
begin
Showmessage(FParametros.numero_nota_fiscal);
end;
6) No form que vc esta vc chama do modo
var
campo:TParametros;
begin
campo.numero_nota_fiscal:=0001;
campo.serie_nota_fiscal:=U;
Form3:=TForm3.create(nil,campo); // No meu casoo form a ser chamado é o Form3
try
form3.ShowModal;
finally
FreeAndNil(form3);
end;
end;
Deste modo vc trafega informações de um form para outro utilizando POO
entendeu ????












