sábado, 16 de abril de 2011

Caixas de Texto

Introdução
      Caixas de texto são utilizadas em sistemas com interface gráfica para capturar entrada de dados do usuário. Através de caixas de texto podemos entrar com nomes de usuário e senhas para validação, gravar informações em um banco de dados e setar variáveis de nossos programas para fazer cálculos, por exemplo. Em wxWidgets a classe que representa uma caixa de texto é a wxTextCtrl.
    Para capturar o valor de um wxTextCtrl utilizamos o método GetValue() que retorna um wxString.     
    Para setar o valor de um wxTextCtrl utilizamos o método SetValue(wxString valor).

Cálculo do volume do cilindro

     Neste post vou mostrar um programa para calcular o volume de um cilindro. O usuário entrará com o raio da base e a altura do cilindro. A fórmula para calculo do volume do cilindro é dada por: A = PI * r^2 * h, onde r é o raio e h é a altura. O programa avisará através de uma caixa de mensagem (wxMessageBox) se o usuário deixar algum campo vazio ou se os valores digitados não forem números.


     


     

Segue abaixo o código da aplicação:

#include <wx/wx.h>
//cilindro.h

class Cilindro : public wxFrame {

    public:

        Cilindro(const wxString &titulo);

        double Volume(double raio, double altura);

        void Calcula(wxCommandEvent &evt);
        void Limpa(wxCommandEvent &evt);

    private:

       double raio, altura, volume;

       wxTextCtrl *txtraio;
       wxTextCtrl *txtaltura;
       wxTextCtrl *txtvolume;
       wxStaticText *stcraio;
       wxStaticText *stcaltura;
       wxStaticText *stcvolume;
       wxButton *calcular;
       wxButton *limpar;

};

#include "cilindro.h"
//cilindro.cpp

Cilindro::Cilindro(const wxString &titulo) : wxFrame(NULL, -1, titulo, wxDefaultPosition, wxSize(290, 180))
{
    wxPanel *painel = new wxPanel(this, -1);
    wxBoxSizer *boxprincipal = new wxBoxSizer(wxVERTICAL);
    wxGridSizer *boxtexto = new wxGridSizer(3, 2, 5, 5);
    wxBoxSizer *boxbotoes = new wxBoxSizer(wxHORIZONTAL);
    txtraio = new wxTextCtrl(painel, -1, wxT(""));
    txtaltura = new wxTextCtrl(painel, -1, wxT(""));
    txtvolume = new wxTextCtrl(painel, -1, wxT(""));
    stcraio = new wxStaticText(painel, -1, wxT("Raio:"));
    stcaltura = new wxStaticText(painel, -1, wxT("Altura:"));
    stcvolume = new wxStaticText(painel, -1, wxT("Volume:"));
    calcular = new wxButton(painel, 1000, wxT("Calcular"));
    Connect(1000, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Cilindro::Calcula));
    limpar = new wxButton(painel, 1001, wxT("Limpar"));
    Connect(1001, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Cilindro::Limpa));
    boxtexto->Add(stcraio, 1, wxALL, 10);
    boxtexto->Add(txtraio, 1, wxALL, 5);
    boxtexto->Add(stcaltura, 1, wxALL, 10);
    boxtexto->Add(txtaltura, 1, wxALL, 5);
    boxtexto->Add(stcvolume, 1, wxALL, 10);
    boxtexto->Add(txtvolume, 1, wxALL, 5);
    boxbotoes->Add(calcular, 1, wxALL, 10);
    boxbotoes->Add(limpar, 1, wxALL, 10);
    boxprincipal->Add(boxtexto, 1, wxEXPAND);
    boxprincipal->Add(boxbotoes, 1, wxEXPAND);
    painel->SetSizer(boxprincipal);
    txtraio->SetFocus();
    Centre();
}

double Cilindro::Volume(double raio, double altura)
{
    this->raio = raio;
    this->altura = altura;
    volume = 3.14 * (this->raio*this->raio) * altura;
    return volume;
}

void Cilindro::Calcula(wxCommandEvent &evt)
{
    double r, h, a;
    //verificamos se algum dos campos está vazio
    //se estiver mostramos uma mensagem de alerta
    if((txtraio->IsEmpty()) || (txtaltura->IsEmpty())) {
        wxMessageBox(wxT("Nao podem haver campos vazios!"), wxT("Aviso"));
        return;
    }
    //verificamos se os valores digitados sao numeros
    //se nao forem exibimos uma mensagem de alerta
    if((!txtraio->GetValue().ToDouble(&r)) || (!txtaltura->GetValue().ToDouble(&h))) {
        wxMessageBox(wxT("Os valores dos campos devem ser numericos!"), wxT("Aviso"));
        return;
    }
    //chamamos o metodo Area() para calcular o volume do cilindro
    a = Volume(r, h);
    //setamos o textbox volume com o valor calculado
    txtvolume->SetValue(wxString() << a);
}

void Cilindro::Limpa(wxCommandEvent &evt)
{
    //limpamos os campos com o método Clear()
    txtraio->Clear();
    txtaltura->Clear();
    txtvolume->Clear();
}

#include "cilindro.h"
//main.h


class MinhaApp : public wxApp
{
    public:
        virtual bool OnInit(); 
   
};

#include "main.h"
//main.cpp

IMPLEMENT_APP(MinhaApp)

bool MinhaApp::OnInit()
{
    Cilindro *cilindro = new Cilindro(wxT("Calculo da area do cilindro"));
    cilindro->Show(true);
    return true;
}





Nenhum comentário:

Postar um comentário