Hercles Posted August 7, 2013 at 12:15 AM Report #521045 Posted August 7, 2013 at 12:15 AM 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?
pwseo Posted August 7, 2013 at 07:18 AM Report #521053 Posted August 7, 2013 at 07:18 AM Sim, é perfeitamente possível. Basta-te incluíres a unit respectiva na uses, e podes fazer o que desejares.
Hercles Posted August 7, 2013 at 11:28 AM Author Report #521062 Posted August 7, 2013 at 11:28 AM Mas em qual parte no formilário eu declaro estas variáveis?
pwseo Posted August 7, 2013 at 11:36 AM Report #521065 Posted August 7, 2013 at 11:36 AM 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.
Hercles Posted August 7, 2013 at 11:56 AM Author Report #521066 Posted August 7, 2013 at 11:56 AM 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;
pwseo Posted August 7, 2013 at 12:02 PM Report #521067 Posted August 7, 2013 at 12:02 PM (edited) 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 August 7, 2013 at 12:02 PM by pwseo
Hercles Posted August 7, 2013 at 12:23 PM Author Report #521069 Posted August 7, 2013 at 12:23 PM 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)?
nunopicado Posted August 7, 2013 at 12:45 PM Report #521076 Posted August 7, 2013 at 12:45 PM 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.
Hercles Posted August 7, 2013 at 01:04 PM Author Report #521080 Posted August 7, 2013 at 01:04 PM (edited) 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 August 7, 2013 at 01:42 PM by Hercles Adicionadas tags GeShi
nunopicado Posted August 7, 2013 at 01:16 PM Report #521081 Posted August 7, 2013 at 01:16 PM É 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.
Hercles Posted August 7, 2013 at 01:30 PM Author Report #521084 Posted August 7, 2013 at 01:30 PM 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.
nunopicado Posted August 7, 2013 at 01:37 PM Report #521085 Posted August 7, 2013 at 01:37 PM 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.
Hercles Posted August 7, 2013 at 01:44 PM Author Report #521088 Posted August 7, 2013 at 01:44 PM É 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
nunopicado Posted August 7, 2013 at 01:49 PM Report #521090 Posted August 7, 2013 at 01:49 PM 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.
pwseo Posted August 7, 2013 at 02:06 PM Report #521091 Posted August 7, 2013 at 02:06 PM (edited) 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 August 7, 2013 at 02:09 PM by pwseo
nunopicado Posted August 7, 2013 at 02:09 PM Report #521092 Posted August 7, 2013 at 02:09 PM 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.
pwseo Posted August 7, 2013 at 02:12 PM Report #521093 Posted August 7, 2013 at 02:12 PM 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.
nunopicado Posted August 7, 2013 at 02:19 PM Report #521095 Posted August 7, 2013 at 02:19 PM 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.
pwseo Posted August 7, 2013 at 02:30 PM Report #521096 Posted August 7, 2013 at 02:30 PM 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 🙂
Hercles Posted August 7, 2013 at 02:41 PM Author Report #521098 Posted August 7, 2013 at 02:41 PM 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?
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now