Jump to content
Hercles

É possivel que as variaveis de um formulário em Delphi possa ser acessadas e manipuladas em outros formulários do projeto?

Recommended Posts

Hercles

Caros, é possivel que as variaveis de um formulário (form1 por exemplo) em Delphi possa ser acessadas e manipuladas em outros formulários (ex: form2, form3) do projeto?

Share this post


Link to post
Share on other sites
pwseo

Sim, é perfeitamente possível. Basta-te incluíres a unit respectiva na uses, e podes fazer o que desejares.

Share this post


Link to post
Share on other sites
pwseo

As variáveis não se declaram em parte alguma do formulário, mas sim na unit (o ficheiro .pas) que o representa. Se tiveres dois Forms, (Form1, Form2), provavelmente terás que incluir Unit1 na cláusula uses da Unit2.pas, de forma a poderes alterar Form1.

Para evitar referências circulares, podes utilizar a uses da secção implementation.

Share this post


Link to post
Share on other sites
Hercles

usando esta ideias eu consigo. por exemplo, calcular o preço liquido que seria: o preço bruto que esta no form1, menos o desconto que esta no form2?

p_liquido:= p_bruto - desconto;

Share this post


Link to post
Share on other sites
pwseo

Consegues, mas parece-me que estás a fazer isso mal. Para começar, se p_bruto está no Form1, então tens que te referir a ele via Form1.p_bruto. Além disso, tanto p_bruto como desconto devem ser algo do género TEdit, pelo que primeiro tens que converter o seu texto para números antes de fazer as contas, e voltar a converter o resultado para string antes de o colocares em p_liquido.

De qualquer modo, se tens que andar a aceder a variáveis de outros Forms, provavelmente o teu programa precisa de alguma re-estruturação (se calhar introduzir uma variável global que centralize esse tipo de valores que são utilizados em todo o programa...).

Edited by pwseo

Share this post


Link to post
Share on other sites
Hercles

Existe algum método em que o valor liquido apareça apos eu digitar o desconto sem que eu precione nenhum botão (automático)?

Share this post


Link to post
Share on other sites
nunopicado

Existe algum método em que o valor liquido apareça apos eu digitar o desconto sem que eu precione nenhum botão (automático)?

Sim.

Sempre que precises que alguma coisa seja feita automaticamente, tens de te virar para os eventos.

- Podes usar, por exemplo, o onchange, e o valor liquido será calculado sempre que o valor bruto ou o desconto seja alterado.

- Podes também usar o OnExit, e neste caso o valor liquido será calculado quando saias do TEdit

- Podes também usar o onkeypress, para por exemplo calcular a carregar no Enter dentro do TEdit.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

como faça pra usar o onchange... fiz este codigo:

procedure Tfrmpagvista.txtpliquidoChange(Sender: TObject);
begin
 pliquido:= strtocurr(txtpbruto.text) - (strtocurr(txtdesconto.text)*0.10);
 txtpliquido.text:= currtostr(pliquido);
end;

Edited by Hercles
Adicionadas tags GeShi

Share this post


Link to post
Share on other sites
nunopicado

É mais ou menos isso, embora me pareça que estás a calcular mal o desconto. O utilizador insere-o em percentagem?

É necessário no entanto fazer algumas validações.

Por exemplo, se o txtdesconto.text não tiver nada, deves assumir que é 0.

E se o txtpbruto.text não tiver nada, não deve calcular nada. O txtpliquido.text deverá ser 0, ou se preferires, ser vazio também.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

Cara acho que esto indo para um caminho errado. Estava verificando eu estou usando as Tedit pra manipular todas as informações e isto parece que não é o certo... eu deveria declarar variáveis globais.... agora não sei o que faço.. acho melhor eu deletar tudo e começar do zero.

Share this post


Link to post
Share on other sites
nunopicado

Sem stress... :)

Variáveis globais, só em último caso. Quanto menos, melhor.

Podes é usar variaveis locais dentro do evento para fazer os calculos. Isso pode facilitar.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

É mais ou menos isso, embora me pareça que estás a calcular mal o desconto. O utilizador insere-o em percentagem?

É necessário no entanto fazer algumas validações.

Por exemplo, se o txtdesconto.text não tiver nada, deves assumir que é 0.

E se o txtpbruto.text não tiver nada, não deve calcular nada. O txtpliquido.text deverá ser 0, ou se preferires, ser vazio também.

Sim.

Sempre que precises que alguma coisa seja feita automaticamente, tens de te virar para os eventos.

- Podes usar, por exemplo, o onchange, e o valor liquido será calculado sempre que o valor bruto ou o desconto seja alterado.

- Podes também usar o OnExit, e neste caso o valor liquido será calculado quando saias do TEdit

- Podes também usar o onkeypress, para por exemplo calcular a carregar no Enter dentro do TEdit.

Sim.

Sempre que precises que alguma coisa seja feita automaticamente, tens de te virar para os eventos.

- Podes usar, por exemplo, o onchange, e o valor liquido será calculado sempre que o valor bruto ou o desconto seja alterado.

- Podes também usar o OnExit, e neste caso o valor liquido será calculado quando saias do TEdit

- Podes também usar o onkeypress, para por exemplo calcular a carregar no Enter dentro do TEdit.

eu usei onchage mas o campo txtpliquido só atualiza se eu simular que vou digitar algo nele

Share this post


Link to post
Share on other sites
nunopicado

eu usei onchage mas o campo txtpliquido só atualiza se eu simular que vou digitar algo nele

Não podes usar o onchange do PLiquido...

Se queres que algo aconteça quando alteras o preço bruto, tens de usar o evento do preço bruto. (e não o do preço liquido).

Tens de meter o código no evento do preço bruto, e se quiseres, também no evento do desconto. Assim, qualquer um que alteres, os calculos serão feitos.

Exemplo:

procedure Tfrmpagvista.CalculaPLiquido(Sender: TObject);
var
  PBruto, PLiquido:Currency;
  Desconto:Byte;
begin
  if txtpbruto.text<>''
     then PBruto:=StrToCurr(txtpbruto.text)
     else PBruto:=0;
  if txtdesconto.text<>''
     then Desconto:=StrToFloat(txtdesconto.text)
     else Desconto:=0;

  PLiquido:=PBruto-(PBruto*(Desconto/100));
  txtpliquido.text:= currtostr(pliquido);
end;

E deves atribuir este procedimento aos dois componentes PBruto e Desconto.

Dica: Quando fores a por no segundo componente, em vez de clicares duas vezes no evento para abrir um novo, abre na setinha a lista e escolhe o que já tens. Assim evitas duplicar código.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Variáveis globais, só em último caso. Quanto menos, melhor.

Podes é usar variaveis locais dentro do evento para fazer os calculos. Isso pode facilitar.

Pois, mas armazenar as variáveis apenas no campo Text de meia dúzia de TEdit parece-me muito pior que variáveis globais. Muito mesmo. A menos que me esteja a escapar algo... :)

Não faria sentido ter um record estruturado de acordo com os valores importantes da aplicação e isso como variável global acessível em todo o programa?

Edited by pwseo

Share this post


Link to post
Share on other sites
nunopicado

Pois, mas armazenar as variáveis apenas no campo Text de meia dúzia de TEdit parece-me muito pior que variáveis globais. Muito mesmo. A menos que me esteja a escapar algo.

Ou então está a escapar-me a mim... :)

Para o trabalho em causa, tendo os TEdits os valores já armazenados, qual é a necessidade das globais?

A ideia das variáveis aqui é só para fazer os calculos, ou não?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Para o trabalho em causa, tendo os TEdits os valores já armazenados, qual é a necessidade das globais?

A ideia das variáveis aqui é só para fazer os calculos, ou não?

A questão é que são valores numéricos, não faz sentido tê-los armazenados unicamente num TEdit (a menos que sejam utilizados apenas nesse TEdit, claro). No entanto, como há várias forms imaginei que seria algo razoavelmente complexo, o suficiente para achar que os valores deveriam estar nalgum sítio além dos TEdit. Imaginemos que adicionamos mais funções que calculam outros valores... Temos que andar sempre a recorrer aos TEdit... Além disso, e sendo eles números de vírgula flutuante, há sempre perda de dados nas conversões de e para strings :)

PS.: Alterei o meu post anterior.

Share this post


Link to post
Share on other sites
nunopicado

Não me parece que o caso tenha essa complexidade.

É calcular e armazenar.

Ainda assim, se fosse mais complexo, preferia criar um Helper à classe TEdit e meter uma propriedade que devolvesse o resultado em currency. Tenho aversão a informação duplicada, especialmente quando essa duplicação não é sincronizada. Uma distração e lá está a variável com valores diferentes do TEdit, e depois é que nunca mais se descobre o gato! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Pelas dúvidas que temos visto, duvido muito que a helper class seja uma alternativa muito viável ;) Além disso, centralizar não implica duplicar... implica apenas tratar os TEdit como aquilo que são na realidade: campos de input/output.

Mas pronto, isto já foge um pouco à thread, pelo que parei por aqui :)

Share this post


Link to post
Share on other sites
Hercles

Não podes usar o onchange do PLiquido...

Se queres que algo aconteça quando alteras o preço bruto, tens de usar o evento do preço bruto. (e não o do preço liquido).

Tens de meter o código no evento do preço bruto, e se quiseres, também no evento do desconto. Assim, qualquer um que alteres, os calculos serão feitos.

Exemplo:

procedure Tfrmpagvista.CalculaPLiquido(Sender: TObject);
var
  PBruto, PLiquido:Currency;
  Desconto:Byte;
begin
  if txtpbruto.text<>''
  then PBruto:=StrToCurr(txtpbruto.text)
  else PBruto:=0;
  if txtdesconto.text<>''
  then Desconto:=StrToFloat(txtdesconto.text)
  else Desconto:=0;

  PLiquido:=PBruto-(PBruto*(Desconto/100));
  txtpliquido.text:= currtostr(pliquido);
end;

E deves atribuir este procedimento aos dois componentes PBruto e Desconto.

Dica: Quando fores a por no segundo componente, em vez de clicares duas vezes no evento para abrir um novo, abre na setinha a lista e escolhe o que já tens. Assim evitas duplicar código.

mas eu colo este trecho de texto abaixo da implementation?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.