GARANTIR DESCONTO

Fórum Passar valores entre forms #356752

07/04/2008

0

Saudações!

Gostaria de conhecer uma forma simples e optimizada para se passar valores (parâmetros) entre 2 forms.

[i:bc0c0bd04f]
Exemplo: Um diálogo para formação de um filtro para um relatório.
Como fazer para que os valores sejam propagados para
o form do relatório? (este é só um exemplo de uso...)
[/i:bc0c0bd04f]

Tenho usado um método um tanto quanto ´suíno´!
Criei um array global e o utilizo para armazenas os parâmetros, mas
certamente há uma forma mais inteligente.

Att.


Luciano.badoe

Luciano.badoe

Responder

Posts

08/04/2008

Edineidaniel

Bom dia, Luciano...

Desculpe mas fica um pouco difícil de entender o que realmente vc quer passar para o relatório? Quais os dados?

Quem sabe o que vc pode fazer é criar uma propriedade no form de relatório..!!!

t+
Edinei


Responder

Gostei + 0

08/04/2008

Luciano.badoe

[b:698cfe7890]edineidaniel[/b:698cfe7890]

Na verdade falei do relatório apenas como um exemplo.
O que quero fazer é:

* O processo roda em um determinado form;
* Em determinado momento abre-se outro form (caixa de diálogo, etc),
e este gera alguma informação que deva ser retornada para o form
chamdor (1º form).

outro:

* Um form com controles para se gerar um filtro para uma query, relatório, etc. é aberto;
* O usuário conclui o processo e este form é fechado, porém devendo
propagar os dados que compoem o filtro, ou seja, passá-los como parâmetro.

Como disse, faço isso com variáveis/arrays globais, mas não acho muito prático.

Abraço.


Responder

Gostei + 0

08/04/2008

Edineidaniel

OK, Luciano...

Imaginamos que um propriedade é criada no form1 como se fosse um Memo com sua propriedade visible = false;

//chamar o form2 estando no form1
form2 := Tform2.Create(self);
form2.showmodal;
FreeAndNil(form2);

// no on close, ou em outro evento vc pode passar o valor montado no form2 para o form1
form1.Memo1.Lines.Text := ´INSTRUÇÃO SQL OU FILTROS´;

Eu sempre faço desta forma....

t+
Edinei


Responder

Gostei + 0

08/04/2008

Luciano.badoe

[b:3a0457c346]edineidaniel[/b:3a0457c346]

OK, esta é uma forma... atribuo valores para um componente que está em outro form, certo?

Porém queria uma forma de abrir/criar um form e receber um retorno quanto este form for fechado. Semelhante a (var = showmodal...), porém com possibilidade de retornar qualquer valor.

Valeu pela ajuda.


Responder

Gostei + 0

08/04/2008

Rodc

Você pode fazer overloading da função ShowModal no form quer retorna o valor. O exemplo abaixo eu fiz e não testei, pois estou sem Delphi.
function TForm2.ShowModal(): String
begin
    ShowModal();                           // mostra a tela
    Result := texto_de_retorno;      // retorna o que for preciso retornar
end;

E você faz a chamada assim:
var retorno: STring;
begin
    retorno := Form2.ShowModal();
end;

Para retornar mais de um parâmetro você teria de passar os parâmetros por referência para a função ShowModal.


Responder

Gostei + 0

07/08/2009

Cruyahoo

Um exemplo bem pratico para quem quizer utilizar arquivos de procedures e funcoes que serão reconhecidos em qualquer form.

Este inclui uma procedure de filtro bem simples que salva em muito os
problemas de filtro de datas.

Crie uma unit de codigo puro sem view,coloque este arquivo junto com os do projeto dê um include atraves da opcao de projeto do Delphi.

//o codigo
unit UnitProced1;
{Esta unit tem dois modelos p/ uso nos forms. Uma procedure de filtro e uma funcao que chaca data.}
{Não se esqueça de mencionar na clausula Uses dos forms que as utilizarão. Ex Uses UnitProced1}
interface

USES
Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs,
Menus, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls, Grids, DBGrids,Senha;

var msgSituacao : string;//Neste ponto coloque todas as variaveis globais que precisar,
e serão vistas em todos os forms que usam esta Unit.
VariavelX: String;
VariavelY: integer;

procedure FiltraDataAssign(Tabela:Tdataset;edInicio,edFim:TDate;DataPeriodo,DataAssign,Situacao:string);
function ChkDiasEntData(DataMaior,DataMenor:TDate;QdeDias:Extended):boolean;
FUNCTION DatEspaco(Dtorig:TdateTime;Esp:string):string;

implementation

USES UnitDtm{Datamodulo ou form que estao as tabelas};

{Filtra no periodo, registros com campo data ,assignados ou nao ou todos no periodo
OBS. O único diferenciador é a tupla > para Assig, e < para NaoAssig, em so 2 pontos da funcao
Ex. de uso:
procedure Tform1.botaoTOTALRECEBIDO1Click(Sender: TObject);
begin
//As duas datas do filtro (DataInicio e Datafim devem ser passadas como tipo Tdate e as restantes deverm ser passadas como string (´07/10/2009´)
FiltraDataAssign(Tabela,mkedit_de.Date,mkedit_Ate.date,´DataVencimento´{nome do campo data que o filtro de duas datas vai ver},´DataPagamento´{nome do campo data que estara ou nao preenchida},´NaoAssig´{comando da funcao que define o que se quer});
msgOrdem:=´ ÒRDEM: Vencimento´;
msgSituacao:=´TOTAL A RECEBER (base:Data de vencimento)´;

end;}


procedure FiltraDataAssign(Tabela:Tdataset;edInicio,edFim:TDate;DataPeriodo,DataAssign,Situacao:string);
var tupla,VedInicio,VedFim : string;
begin
VedInicio:=DateToStr(edInicio);
VedFim:=DateToStr(edFim);
{Seleciona tupla que diferencia situacao em dois pontos da funcao}
If situacao = ´Assig´ then tupla:=´>´;
If situacao = ´NaoAssig´ then tupla:=´<´;
// ´TodosNoPeriodo´ = Ver no if relacionado abaixo;

Tabela.Filtered:=False;

{Se data estiver preenchido}
if (edInicio <> null) and (edFim <> null) then
//Se for geral do periodo
if situacao=´TodosNoPeriodo´ then
begin
Tabela.Filter:=DataPeriodo+ ´>=´ +QuotedStr(VedInicio)+ ´ and ´ +DataPeriodo+ ´<=´ +QuotedStr(VedFim);
end
else //Se for Assignado ou Nao Assignado
begin
Tabela.Filter:=DataPeriodo+ ´>=´ +QuotedStr(VedInicio)+ ´ and ´ +DataPeriodo+ ´<=´+QuotedStr(VedFim)+´ and ´ +DataAssign+tupla +QuotedStr(´01/01/1990´);
end
{Se data estiver em branco}
else
Tabela.Filter:=DataAssign+tupla + QuotedStr(´01/01/1990´);

Tabela.filtered:=True;

end;
//----------------------------------------------------------------------------------------
{Checar se a diferança entre duas datas é maior que a qde de dias definidos}
function ChkDiasEntData(DataMaior,DataMenor:TDate;QdeDias:Extended):boolean;
var vD:extended;
begin
vD:=DataMaior-DataMenor;
if vD < QdeDias then Result:=true;
end;
//------------------------------------------------------------------------------------------
//Esta funcao colocar espaços na data para por exemplo adequar p/ um formulario preimpresso de NOta fisca.
Ex. de uso: DatEspaço(
FUNCTION DatEspaco(Dtorig:TdateTime;Esp:string):string;
VAR Diae,Mexe,Anoe:word;
DatEspacada:string;
BEGIN
DecodeDate(Dtorig,Anoe,Mexe,Diae);
DatEspacada:=inttostr(Diae)+Esp+inttostr(Mexe)+Esp+inttostr(Anoe);
result:=DatEspacada;
END;

end.

Extenda esta Unit como quizer ao decorrer do projeto ou use ela como
arquivo de funcao/proc global.

Isto simplifica muito. Esta dica serve inclusive para os iniciantes.

Espero que ajude.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar