Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Hercles

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

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...).

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

Editado por Hercles
Adicionadas tags GeShi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por pwseo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Hercles, uma pergunta:

Há quanto tempo aprendes Delphi/Lazarus?

Qualquer procedimento tem de ser na implementation. Na interface, isto dava-te erro na hora.

INTERFACE - Secção de declarações

Basicamente, só serve para declarares o que vais usar

IMPLEMENTATION - Secção de implementação

Qualquer código é aqui que vai

Agora, não precisa complicar... Abres o onchange de um dos TEdits e metes lá o codigo. Depois no outro TEdit, basta fazeres como te disse em cima para atribuir o mesmo codigo.


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Hercles

Vc sabe se este projeto que estou fazendo no Lazarus do Windows vai rodar no Lazarus do Linux? É uma exigência da faculdade que rode no Linux

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Hercles,

Hoje em dia qualquer um tem facilidade em testar os seus projectos em Linux: basta instalar (por exemplo) o Virtual Box e instalar lá o Linux. Posteriormente instalas lá o Lazarus e tentas compilar lá.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Do que eu vi que tens no projecto, não deve haver crise...


"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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.