Iniciante - não consigo utilizar IF THEN ELSE - Ajude-me

16/03/2006

Estou tentando fazer com que o edit receba um valor se satisfazer uma condição efetua o calculo caso contrario receba um texto quando eu clicar no botão. sem os if then else funciona normal o cálculo.
olhem o código e me digam o que esta errado.



unit Energia_pas; 

interface 

uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
Dialogs, StdCtrls; 

type 
  TForm1 = class(TForm) 
  LeituraAnterior: TEdit; 
  LeituraAtual: TEdit; 
  Consumo: TEdit; 
  Label1: TLabel; 
  Label2: TLabel; 
  Label3: TLabel; 
  BtnCalcula: TButton; 
  BtnLimpa: TButton; 
  BtnFechar: TButton; 
  Label5: TLabel; 
  TotalFatura: TEdit; 
  Label6: TLabel; 
  ConsEx: TEdit; 
  Label4: TLabel; 
  Label7: TLabel; 
  procedure BtnCalculaClick(Sender: TObject); 
  procedure BtnFecharClick(Sender: TObject); 
  procedure BtnLimpaClick(Sender: TObject); 
private 
  { Private declarations } 
public 
  { Public declarations } 
end; 

var 
  Form1: TForm1; 
  Atual,Anterior,Resultado,Ce,tf:Real; 
implementation 

{$R *.dfm} 


procedure TForm1.BtnCalculaClick(Sender: TObject); 
begin 
  Atual:=StrToFloat(LeituraAtual.text); 
  Anterior:=StrToFloat(LeituraAnterior.text); 
  Resultado:=Atual-Anterior; 
  Consumo.Text:=FloatToStr(resultado); 
  ce:=Atual-anterior-(100); 
  if ce >100 then 
  ConsEx.Text:=FloatToStr(ce); 
  else 
  ConsEx.Text:=´Não Tributado 
  tf:=ce*2 
  if tf >0 then 
  Totalfatura.Text:=FloatToStr(tf); 
  else 
  totalfatura.Text:=´Sem Valor Comercial´ 
end; 

procedure TForm1.BtnFecharClick(Sender: TObject); 
begin 
  close; 
end; 

procedure TForm1.BtnLimpaClick(Sender: TObject); 
begin 
  Leituraanterior.Text:=´´; 
  LeituraAtual.Text:=´´; 
  Consumo.Text:=´´; 
  LeituraAnterior.SetFocus; 
end; 

end.



Ciro_cj

Respostas

16/03/2006

Renato.pavan

olhem o código e me digam o que esta errado. unit Energia_pas; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) LeituraAnterior: TEdit; LeituraAtual: TEdit; Consumo: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; BtnCalcula: TButton; BtnLimpa: TButton; BtnFechar: TButton; Label5: TLabel; TotalFatura: TEdit; Label6: TLabel; ConsEx: TEdit; Label4: TLabel; Label7: TLabel; procedure BtnCalculaClick(Sender: TObject); procedure BtnFecharClick(Sender: TObject); procedure BtnLimpaClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Atual,Anterior,Resultado,Ce,tf:Real; implementation {$R *.dfm} procedure TForm1.BtnCalculaClick(Sender: TObject); begin Atual:=StrToFloat(LeituraAtual.text); Anterior:=StrToFloat(LeituraAnterior.text); Resultado:=Atual-Anterior; Consumo.Text:=FloatToStr(resultado); ce:=Atual-anterior-(100); if ce >100 then ConsEx.Text:=FloatToStr(ce); //Antes do else não tem ´;´ else //neste else falta o BEGIN - END ConsEx.Text:=´Não Tributado tf:=ce*2 if tf >0 then Totalfatura.Text:=FloatToStr(tf); else totalfatura.Text:=´Sem Valor Comercial´ end; procedure TForm1.BtnFecharClick(Sender: TObject); begin close; end; procedure TForm1.BtnLimpaClick(Sender: TObject); begin Leituraanterior.Text:=´´; LeituraAtual.Text:=´´; Consumo.Text:=´´; LeituraAnterior.SetFocus; end; end.


Correto
procedure TForm1.BtnCalculaClick(Sender: TObject); 
begin 
  Atual:=StrToFloat(LeituraAtual.text); 
  Anterior:=StrToFloat(LeituraAnterior.text); 
  Resultado:=Atual-Anterior; 
  Consumo.Text:=FloatToStr(resultado); 
  ce:=Atual-anterior-(100); 
  if ce >100 then 
    ConsEx.Text:=FloatToStr(ce) 
  else
  begin 
    ConsEx.Text:=´Não Tributado; 
    tf:=ce*2;
  end;
  if tf >0 then 
    Totalfatura.Text:=FloatToStr(tf)
  else 
    totalfatura.Text:=´Sem Valor Comercial´;
end; 

procedure TForm1.BtnFecharClick(Sender: TObject); 
begin 
close; 
end; 

procedure TForm1.BtnLimpaClick(Sender: TObject); 
begin 
Leituraanterior.Text:=´´; 
LeituraAtual.Text:=´´; 
Consumo.Text:=´´; 
LeituraAnterior.SetFocus; 
end; 

end.


Bem acho q é isso, testa la, qq coisa volte a postar.

[]´s

Renato


Responder Citar

16/03/2006

_rodfaria_

 if ce >100 then 
  ConsEx.Text:=FloatToStr(ce); 
  else 
  ConsEx.Text:=´Não Tributado


Tire o ponto-e-vírgula que está antes do else.
Falta fechar a apóstrofe do else.

http://www.delphibasics.co.uk/RTL.asp?Name=If


Responder Citar

16/03/2006

_rodfaria_

 if ce >100 then 
  ConsEx.Text:=FloatToStr(ce); 
  else 
  ConsEx.Text:=´Não Tributado


Tire o ponto-e-vírgula que está antes do else.
Falta fechar a apóstrofe do else.

http://www.delphibasics.co.uk/RTL.asp?Name=If


Responder Citar

16/03/2006

Cristianojedi

unit Energia_pas; 

interface 

uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
Dialogs, StdCtrls; 

type 
  TForm1 = class(TForm) 
  LeituraAnterior: TEdit; 
  LeituraAtual: TEdit; 
  Consumo: TEdit; 
  Label1: TLabel; 
  Label2: TLabel; 
  Label3: TLabel; 
  BtnCalcula: TButton; 
  BtnLimpa: TButton; 
  BtnFechar: TButton; 
  Label5: TLabel; 
  TotalFatura: TEdit; 
  Label6: TLabel; 
  ConsEx: TEdit; 
  Label4: TLabel; 
  Label7: TLabel; 
  procedure BtnCalculaClick(Sender: TObject); 
  procedure BtnFecharClick(Sender: TObject); 
  procedure BtnLimpaClick(Sender: TObject); 
private 
  { Private declarations } 
public 
  { Public declarations } 
end; 

var 
  Form1: TForm1; 
  Atual,Anterior,Resultado,Ce,tf:Real; 
implementation 

{$R *.dfm} 


procedure TForm1.BtnCalculaClick(Sender: TObject); 
begin 
  Atual:=StrToFloat(LeituraAtual.text); 
  Anterior:=StrToFloat(LeituraAnterior.text); 
  Resultado:=Atual-Anterior; 
  Consumo.Text:=FloatToStr(resultado); 
  ce:=Atual-anterior-(100); 
  if ce >100 then 
  ConsEx.Text:=FloatToStr(ce)
  else 
  ConsEx.Text:=´Não Tributado; 
  tf:=ce*2 
  if tf >0 then 
  Totalfatura.Text:=FloatToStr(tf) 
  else 
  totalfatura.Text:=´Sem Valor Comercial´;
end; 

procedure TForm1.BtnFecharClick(Sender: TObject); 
begin 
  close; 
end; 

procedure TForm1.BtnLimpaClick(Sender: TObject); 
begin 
  Leituraanterior.Text:=´´; 
  LeituraAtual.Text:=´´; 
  Consumo.Text:=´´; 
  LeituraAnterior.SetFocus; 
end; 

end.


Você tem que tirar os ( ; ) antes do else.

Cristiano


Responder Citar

16/03/2006

Paullsoftware

[b:6e2873bfe3]Extrutura de Condição: If-then-else[/b:6e2873bfe3]
O comando mais usado para fazer decisões simples é o comando if. O comando if verifica uma condição e executa um comando ou bloco de comandos somente se a condição for verdadeira. O comando if é sempre usado com a palavra-chave then. Há várias maneiras de usar o comando if. Veja a mais simples a seguir:
if condição then
comando;
Aqui a condição é qualquer expressão que tenha valor booleano (True ou False). Condições são geralmente comparações, como a > b, x = 1, total <= 1000, etc. Pode-se também usar o valor de uma propriedade como condição. O exemplo abaixo, ativa um botão (chamado ´Button2´) somente se ele estiver desativado (com Enabled=False). Caso contrário, nada acontece.
if Button2.Enabled = False then
Button2.Enabled = True;

Há também várias funções predefinidas que retornam valores booleanos e que também podem ser usadas como condições.
Usando else
Um comando if pode também apresentar uma segunda parte, delimitada pela palavra-chave else. O comando da segunda parte (depois de else) é executado quando a condição é falsa. O exemplo a seguir mostra uma mensagem diferente dependendo do valor da variável ´x´:
if x > limite then
ShowMessage(‘Limite ultrapassado!’);
else
ShowMessage(‘Sem problemas.’);

[b:6e2873bfe3]Usando blocos com o comando if[/b:6e2873bfe3]
A versão simples do comando if usada nos exemplos acima tem uso muito limitado. Na maioria das vezes, é necessário executar mais de um comando se uma certa condição for verdadeira. Para isso você deve usar blocos de comandos. Veja um exemplo completo:
procedure TForm1.Button1Click(Sender: TObject);
var
Dividendo, Divisor, Resultado: Real;
begin
Dividendo := StrToFloat(Edit1.Text);
Divisor := StrToFloat(Edit2.Text);
if Divisor = 0 then
begin
Color := clRed;
ShowMessage(´Divisor inválido´);
end
else begin
Color := clSilver;
Resultado := Dividendo/Divisor;
ShowMessage(´Resultado = ´ + FloatToStr(Resultado));
end;
end;
Note os dois blocos de comandos: um para o if-then e outro para o else. O programa calcula a divisão de dois valores do tipo Real (lidos a partir de dois componente Edit). Se o divisor for zero, o primeiro bloco do if é executado: o formulário muda para vermelho e uma mensagem é exibida. Se o divisor não for zero, o segundo bloco (depois do else) é executado, mudando a cor do formulário para cinza.
As funções StrToFloat e FloatToStr convertem de Strings para números reais e de números reais para Strings, respectivamente.
Note como o end depois do primeiro bloco não é seguido de ponto-e-vírgula (;). Essa é uma regra obrigatória da linguagem Object Pascal: um end antes de um else nunca deve ser seguido por ´;´. Somente o último end do comando if deve terminar com ponto-e-vírgula.
[b:6e2873bfe3]Aninhando comandos if[/b:6e2873bfe3]
Muitas vezes, um programa deve decidir entre mais de duas opções. Para isso, pode-se usar comandos if aninhados (um if dentro de outro). Veja um exemplo:
procedure TForm1.Button1Click(Sender: TObject);
var
Nota: Real;
begin
Nota := StrToFloat(Edit1.Text);
 if nota < 5.0 then
  ShowMessage(´Reprovado por média´)
 else
 if (Nota >= 5.0) and (Nota < 7.0) then
  ShowMessage(´Aprovado na final´)
 else
 if Nota > 8.5 then
  ShowMessage(´Aprovado com excelência´)
 else
  ShowMessage(´Aprovado simplesmente´)
end;
O exemplo lê uma nota digitada pelo usuário e mostra uma mensagem que varia de acordo com o valor da nota. Acompanhe o fluxo do programa: se a nota for menor que 5, a primeira mensagem é exibida; caso contrário (qualquer valor maior ou igual a 5), o programa checa a segunda condição: se a nota estiver entre 5 e 7, a segunda mensagem é exibida. Se não, o programa verifica se a nota é maior que 8.5 e, se for, mostra a terceira mensagem. A mensagem depois do último else só é exibida se nenhuma das condições anteriores for verdadeira (isso acontece se a nota estiver entre 7 e 8.5).
[b:6e2873bfe3]NOTA:[/b:6e2873bfe3] no programa acima foi usada a palavra chave and para criar uma condição mais complexa. Há mais duas palavras-chaves semelhantes: or e not. Pode-se usar qualquer combinação de not, and e or para criar novas condições. Lembre-se, entretanto de usar parênteses para agrupar as condições. Os parênteses usados no programa anterior, por exemplo, são todos obrigatórios.

Atual,Anterior,Resultado,Ce,tf:Real;

primeiro não há a necessidade de declarar variáveis globais na unit a não ser que queira usá-las, em outros comandos. Sem contar que, quando vc cria variaveis globais deve zerar seus valores antes de usar novamente assim:
Atual        := 0;
Anterior    := 0;
Resultado := 0;
CE           := 0;
TF            := 0;

Outro detalhe, sempre que poder use [b:6e2873bfe3]Double[/b:6e2873bfe3] no lugar de Real já que possuem o mesmo efeito e podem assumir valores do tipo [i:6e2873bfe3]Data e Time[/i:6e2873bfe3], além dos valores numericos.

procedure TForm1.BtnCalculaClick(Sender: TObject); 
begin 
Atual:=StrToFloat(LeituraAtual.text); 
Anterior:=StrToFloat(LeituraAnterior.text); 
Resultado:=Atual-Anterior; 
Consumo.Text:=FloatToStr(resultado); 
ce:=Atual-anterior-(100); 
if ce >100 then 
ConsEx.Text:=FloatToStr(ce); //Tire esse ponto e virgula
else 
ConsEx.Text:=´Não Tributado // essa linha contém um erro, está faltando finalizar ASPAS simpes --> ´ e o ponto e vírgula ;
tf:=ce*2 
if tf >0 then 
Totalfatura.Text:=FloatToStr(tf); 
else 
totalfatura.Text:=´Sem Valor Comercial´ 
end; 

espero ter ajudado! :wink:


Responder Citar

16/03/2006

Vinicius2k

Colega,

A identação facilitaria o entendimento da lógica que você quer seguir.
Se os dois testes forem independentes, seria algo como:
  { Primeiro teste }
  if ce > 100 then
    ConsEx.Text := FloatToStr(ce)
  else
    ConsEx.Text := ´Não Tributado´;
  { Segundo teste }
  tf := ce * 2
  if tf > 0 then
    Totalfatura.Text := FloatToStr(tf)
  else
    totalfatura.Text := ´Sem Valor Comercial´;

Se o segundo teste estiver atrelado ao primeiro, seria:
  { Primeiro teste }
  if ce > 100 then
    ConsEx.Text := FloatToStr(ce)
  else
  begin    
    ConsEx.Text := ´Não Tributado´;
    { Segundo teste }
    tf := ce * 2
    if tf > 0 then
      Totalfatura.Text := FloatToStr(tf)
    else
      totalfatura.Text := ´Sem Valor Comercial´;
  end;

Depende de qual a lógica dos testes... As regras que parece-me não estar claras para você são:

1. Não utiliza ´;´ antes de ELSE e sempre se utiliza ´;´ para finalizar uma instrução (a menos que ela esteja antes do ELSE).
if condicao then
  <instrução>;
{ **** }
if <condição> then
  <instrução>
else
  <instrução>;


2. Todo bloco de código com mais de uma linha deve estar entre ´begin...end´. E se o bloco estiver antes do ELSE o ´;´ é utilizado nas instruções mas não no ´END´
if <condicao> then
begin
  <instrução>;
  <instrução>;
end
else
  <instrução>;
{ **** }
if <condicao> then
  <instrução>
else
begin
  <instrução>;
  <instrução>;
end;



Responder Citar

16/03/2006

Ciro_cj

TIVE UMA VERDADEIRA AULA CONSEGUI FAZER O QUE ESTAVA TENTANDO MUITO OBRIGADO PELA AJUDA DE VCS. CONTINUEM ASSIM AJUDANDO QUEM ESTA COMEÇANDO


Responder Citar