• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Calcula Equação

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Agora nos vamos desenvolver um aplicativo que nos permitirá conhecer melhor algumas propriedades e eventos do componente Label, bem como conhecer o Edit e caixas de mensagem e de entrada de dados.



Nosso programa será usado para fornecer os resultados do cálculo de equações de segundo grau.



Inicie uma nova aplicação e salve todo o projeto em um diretório de sua preferência.



Coloque quatro Label(s) e três Edit(s) no Form.



Altere as propriedades de acordo com a tabela:





Form1:

Hint = Para iniciar os cálculos, clique sobre onde está escrito: "Digite um valor para ..."

BorderStyle = bsToolWindow

Caption = Calcula Equação de 2º Grau

Color = clBtnFace

OldCreateOrder = False

ShowHint = True



Comentário: a propriedade Hint serve para transmitir alguma informação ao usuário quando o cursor do mouse fica estacionado sobre o componente por alguns segundos. A propriedade ShowHint determina quando o conteúdo da propriedade Hint será mostrado.





Label1:

Hint = Dê um clique aqui para digitar um valor para 'a'

Alignment = taCenter

Caption = Digite um valor para 'a'

Font.Color = clWindowText

ShowHint = True





Label2:

Hint = Dê um clique aqui para digitar um valor para 'b'

Alignment = taCenter

Caption = Digite um valor para 'b'

ShowHint = True





Label3:

Hint = Dê um clique aqui para digitar um valor para 'c'

Caption = Digite um Valor para 'c'

ShowHint = True





Label4:

Alignment = taCenter

AutoSize = False

Hint = Após inserir os valores 'a', 'b' e 'c', dê um clique aqui para conhecer o resultado...

Caption = Resultado:

Font.Size = 10

ShowHint = True



Comentário: as propriedades Alignment e AutoSize trabalharão em conjunto para permitir o efeito de profundidade em direção ao centro do componente Label.





Edit1:

Hint = este é o valor de delta

TabStop = False

Color = clBtnFace

ReadOnly = True

ShowHint = False

Text = valor de delta



Comentário: a propriedade TabStop marcada para false elimina o foco e, conseqüentemente, o cursor na inicialização do programa do componente Edit. Neste caso, fica também prejudicada a propriedade TabOrder que é a seqüência de deslocamento do cursor entre os Edit(s). Já a propriedade ReadOnly (somente leitura) permitirá que copiemos o conteúdo do Edit, todavia não permitirá que o alteremos.



Edit2:

Hint = este é o valor de x1

TabStop = False

Color = clBtnFace

ReadOnly = True

ShowHint = False

Text = valor de x1





Edit3:

Hint = este é o valor de x2

TabStop = False

Color = clBtnFace

ReadOnly = True

ShowHint = False

TabOrder = 1

Text = valor de x2



Feito isso, seu projeto deve ficar parecido com a seguinte figura:




Calc_Equac_html_m7714a6b3.gif
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Como você já deve ter notado, nosso projeto não possui botões. Isso porque queremos demonstrar os eventos OnClick, OnMouseDown e OnMouseUp do componente Label fazendo às vezes de um componente Button, bem como algumas propriedades sendo alteradas em tempo de execução.



Usaremos o Evento OnClick para conseguir o mesmo resultado que conseguiríamos com um componente Button; e os eventos OnMouseDown e OnMouseUp serão usados para dar um efeito especial de profundidade no componente, como se o Label estivesse afundando em direção ao seu centro a cada clique do mouse.



Feito isso, vamos aos códigos.



Na região dos arquivos de cabeçalho, declare:



#include <math.h>



AnsiString a, b, c;



Nota: match.h é um arquivo com funções matemáticas da linguagem C e AnsiString é uma classe do C++Builder para trabalhar com strings, ou seja, com textos (é como se estivéssemos declarando variáveis de textos).





Eis o código completo da unidade Unit1.cpp, explicado nos comentários:




//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include <math.h>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

/*declara variáveis globais que serão acessíveis por todas as funções*/
AnsiString a, b, c;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label1Click(TObject *Sender)
{
try /* try { }, com catch(...) { } são usados no tratamento de erros*/
{ // início do bloco try
retornoA: // Label para o comando goto
// chama a caixa de entrada InputBox que receberá a AnsiString 'a'
a = InputBox("Caixa de Entrada de Valores",
"Digite um valor para 'a'", "");
StrToInt(a); // converte AnsiString 'a' em inteiro
/* como na solução de uma equação de 2º grau há uma divisão onde 'a' faz parte
do divisor, então 'a' não pode ser igual a zero. O bloco abaixo testa essa
igualdade e, em caso positivo, retorna uma mensagem de erro e remete o programa
para o Label de goto: retornoA, reiniciando a entrada de valores */
if (a == 0) // Se 'a' é igual a zero
{ // então devolva uma MessageBox comunicando o erro
MessageBox(0,"Zero não é um valor válido para 'a' !\nDigite outro valor... ",
"Erro no valor escolhido", 16);
goto retornoA; // e remeta o pragrama para retornoA
}

else // ou então, caso 'a' seja diferente de zero
Label1 -> Caption = " a = " + a; // altera Caption de Label1
Label1 -> Font -> Color = clRed; // altera a cor da Font de Label1
Label1 -> Font -> Style = TFontStyles()<< fsBold; /*Font de Label1 em negrito*/
Form1 -> ShowHint = false; // deixa de exibir a informação Hint de Form1
} // fim do bloco try
catch(...) // o bloco a seguir trata qualquer erro que ocorra no bloco anterior
{ // exibe mensagem de erro
MessageBox(0, "Erro ... Valor não suportado pelo programa ...",
"Erro de digitação", 16);
} // fim de catch(...)
} // fim de void __fastcall TForm1::Label1Click(TObject *Sender)

//---------------------------------------------------------------------------

void __fastcall TForm1::Label2Click(TObject *Sender)
{
try
{
b = InputBox("Caixa de Entrada de Valores",
"Digite um Valor para 'b'", "");
StrToInt(b);
Label2 -> Caption = " b = " + b;
Label2 -> Font -> Color = clRed;
Label2 -> Font -> Style = TFontStyles()<< fsBold;
Form1 -> ShowHint = false;
}
catch(...)
{
MessageBox(0, "Erro ... Valor não suportado pelo programa ...",
" Erro de digitação", 16);
}
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Label3Click(TObject *Sender)
{
try
{
c = InputBox("Caixa de Entrada de Valores",
"Digite um Valor para 'c'", "");
StrToInt(c);
Label3 -> Caption = " c = " + c;
Label3 -> Font -> Color = clRed;
Label3 -> Font -> Style = TFontStyles()<< fsBold;
Form1 -> ShowHint - false;
}
catch(...)
{
MessageBox(0, "Erro ... Valor não suportado pelo programa ...",
"Erro de digitação", 16);
}
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Label4Click(TObject *Sender)
{
try
{
Label4 -> Font -> Color = clBlue;
Label4 -> Font -> Style = TFontStyles()<< fsBold;
float x1, x2, delta; // declara três variáveis locais
delta = (b*b) - ((a * 4) * c); // inicializa delta, instruindo seu cálculo
/* como a solução de uma equação de segundo grau envolve a extração da raiz
quadrada de delta, e como não existe raiz quadrada de números negativos, o
bloco if ... else abaixo avalia a possibilidade de delta ser negativo para
informar o erro ao usuário*/
if(delta < 0) // se delta é menor que zero
// exiba uma MessageBox informando o erro
MessageBox(0,"delta negativo... não existem raízes reais...\n\n" +
"tente novamente com outros valores...", "Erro nos valores", 16);

else // ou então
{
/* altera a propriedade Text de Edit1, fazendo que Edit1 exiba o valor de delta.
A função FloatToStr() é usada para converter delta em string, uma vez que
colocamos a cadeia de caracteres "delta = " na propriedade Text de Edit1*/
Edit1 -> Text = "delta = " + FloatToStr(delta);
Edit1 -> Font -> Color = clBlue; // altera a cor da font de Edit1
Edit1 -> Font -> Style = TFontStyles()<< fsBold; // font em negrito
Edit1 ->ShowHint = true; // ativa a propriedade Hint de Edit1
/* fórmula para achar x1. sqrt() é uma função do arquivo match.h
usada para o cálculo de raízes quadradas*/
x1 = ((b * (-1)) + (sqrt (delta))) / (a * 2);
Edit2 -> Text = "x1 = " + FloatToStr(x1); // altera Text de Edit2
Edit2 -> Font -> Color = clBlue; //altera cor da Font
Edit2 -> Font -> Style = TFontStyles()<< fsBold; //font em negrito
Edit2 -> ShowHint = true; // ativa Hint de Edit2
x2 = ((b * (-1)) - (sqrt (delta))) / (a * 2); //fórmula para x2
Edit3 -> Text = "x2 = " FloatToStr(x2); //altera Text de Edit3
Edit3 -> Font -> Color = clBlue; // altera cor da Font
Edit3 -> Font -> Style = TFontStyles()<< fsBold; // negrito
Edit3 -> ShowHint = true; //ativa Hint de Edit3
}
}
catch(...)
{
MessageBox(0, "Por favor, digite os valores corretamente", "Erro de execução...", 16);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Label4MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
/* O evento MouseDown de qualquer componente é o que ocorre quando se dá a
descida do botão do mouse sobre o componente durante o clique. Ou seja, aquele
que ocorre quando estamos pressionando o botão do mouse, antes de soltá-lo,
sem, contudo, movimentar o mouse sobre a janela ou componente.*/

/* reduzirá o tamanho do Font de Label4 durante o MouseDown, dando um efeito
de profundidade no clicar*/
Label4 -> Font -> Size = 6;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label4MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
/* O evento MouseUp de qualquer componente é o que ocorre quando se dá a subida
do botão do mouse sobre o componente durante o clique. Ou seja, aquele que
ocorre quando estamos deixando de pressionar o botão do mouse,
no momento de soltá-lo.*/

/* aumentará o tamanho da Font de Label4 durante o MouseUp,
completando o efeito de profundidade de MouseDown*/
Label4 -> Font -> Size = 10;
}
//---------------------------------------------------------------------------







Para visualizar o código completo, sem os comentários, porém: Unit1.cpp e Unit1.h
 
Topo