passar valores de variaveis de um form para outro no delphi 7

Delphi

30/07/2012

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.
Carlos Cabral

Carlos Cabral

Curtidas 0

Respostas

Marco Salles

Marco Salles

30/07/2012

Porque vc quer fazer um Locate para trazer o mesmo registro ???

Vc não utiliza DataModulo ???
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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.
GOSTEI 0
Wilton Júnior

Wilton Júnior

30/07/2012

Cria uma variavel global, cria uma unit e dentro dessa unit todas variaveis que vai usar.
No evento onshow do forma inicie elas.

Espero ter ajudado
Deus o abençoe.
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Abaixo esta como estou tentando fazer


Form2

public
passacampo: Integer;

Form1

botaoclick
Tform2.create(Self)
form2.passacampo := 001;
form2.showmodal;
Freeandnill(form2);

Sem contar outras várias formas que tentei, mas toda vez que vou ver a variavel esta sem valor
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

Olha so , não é a forma mais indicada , mas irá funcionar

form2:=Tform2.create(nil);
try
form2.passacampo := 001;
form2.showmodal;
finally
Freeandnill(form2);
end;
GOSTEI 0
William

William

30/07/2012

Colega em qual evento vc tenta capturar esse valor, se for no evento OnCreate do form2 não vai funcionar mesmo, pq vc primeiro cria o form e depois alimenta a variável, faz um teste no OnShow ou coloca um botão no form2 e chama o valor da variável.
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Meu é exatamente o que estou fazendo, também tentei no onShow. Eu acho que não estou sabendo como utilizar. Sabe eu sou novato no delphi, to apanhando um pouco. Mas nada do que eu tentei esta funcionando.
GOSTEI 0
William

William

30/07/2012

Tenta debugar linha por linha, assim vc acompanha o valor da variável ...
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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.
GOSTEI 0
William

William

30/07/2012

A primeiro form está assim?

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;
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Sim. Esta desta forma. Agora no segundo form eu preciso ter esses valores em mãos.
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Faltou apenas que antes do Numero_nota e Serie_nota esta o nome do formulario2 no caso frmCtpagarTitulos2.Numero_Nota e...
GOSTEI 0
William

William

30/07/2012

Repare neste teste usando 2 forms, o form1 vai passar um valor para variável do form2:

// 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....
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Vou tentar e te falo já
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Voce é o cara. Na realidade o botão não é o que quero, mas entendi o fundamento, pô meu, valeu.
GOSTEI 0
William

William

30/07/2012

Disponha precisando estamos por aí ...
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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 ?
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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 ?
GOSTEI 0
William

William

30/07/2012

Sim, use o OnShow ..
GOSTEI 0
Cauê Nishijima

Cauê Nishijima

30/07/2012

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
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

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 ...)
GOSTEI 0
Cauê Nishijima

Cauê Nishijima

30/07/2012

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
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

Abri um outro tópico para discutir este assunto , para não poluir este tópico cujo o assunto é diferente desde
obrigado
[]sds
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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 ?
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

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
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

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

GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Aparentemente Sim. Estou terminando o módulo. Vou implementar essa função e ver como fica. Valeu
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

Aparentemente Sim. Estou terminando o módulo. Vou implementar essa função e ver como fica. Valeu


Ok...
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Aparentemente Sim. Estou terminando o módulo. Vou implementar essa função e ver como fica. Valeu


Ok...


Olá Marcos. Quanto tempo heim. Hoje as coisas estão bem diferentes, preciso de uma ajuda sua se possivel. Como faço para passar valores de variaveis entre 2 executaveis ? Estou usando o comando WinExec, mas não consigo enxergar o valor da variavel e sim somente o nome, por exemplo: WinExec('teste2.exe codigousuario',SW_NORMAL);
quando o projeto TESTE2 é executado ao invés de enxergar o valor que esta dentro de codigousuario eu consigo ver o nome da variavel. Você pode me ajudar por favor ? Obrigado.
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

Olá tudo Bem

tente assim

WinExec(PChar(´teste2.exe'+codigousuario), Sw_ShowNormal);


ps) CodigoUsuario do tipo STRING
GOSTEI 0
Carlos Cabral

Carlos Cabral

30/07/2012

Olá tudo Bem

tente assim

WinExec(PChar(´teste2.exe'+codigousuario), Sw_ShowNormal);


ps) CodigoUsuario do tipo STRING


Cara. Apanhei um pouco, e tirei de um lado e coloquei por outro, quase joguei o micro fora, mas consegui. Deu certo. Agradeço demais você. Você me ajudou demais. Espero um dia poder te ajudar. Muito Obrigado.

Montei da seguinte forma e deu certissimo.

WinExec(Pchar('ContasPagar.exe '+par1empresa+' '+par2usuario+''),SW_NORMAL);

Obrigado mais uma vez.
GOSTEI 0
Marco Salles

Marco Salles

30/07/2012

Obrigado amigo pelo feedback

[]sds
GOSTEI 0
POSTAR