4_obliczenia

Transkrypt

4_obliczenia
Do najprostszej pracy z tekstami i danymi w okienku służą dwa komponenty biblioteki wxWidgets:
– etykietka umożliwiająca wyświetlenie tekstu
tekst jest umieszczony we właściwości Label
obiekt->SetLabel(wxString) – wyświetla tekst w obiekcie
obiekt->GetLabel() – zwraca tekst typu wxString, umieszczony wcześniej w obiekcie
– okienko edycyjne klasy wxTextCtrl – umożliwia wprowadzanie tekstu z klawiatury,
oraz odczyt i wyświetlanie programowe. Można umieszczać tekst w wielu liniach, z paskiem
przewijania (w okienku właściwości rozwiń +Edit_Style i ustaw wxTE_MULTILINE true).
tekst jest umieszczony we właściwości Text
obiekt->SetValue(wxString) – wyświetla tekst w obiekcie
obiekt->GetValue() – zwraca tekst typu wxString, umieszczony wcześniej w obiekcie
obiekt->LoadFile(plik) – ładuje i wyświetla tekst z pliku o podanej nazwie
obiekt->SaveFile(plik) – zapisuje tekst do pliku o podanej nazwie
Przykład
Program ma pobrać z klawiatury Twoje imię oraz wiek, zaś po kliknięciu przycisku:
• odczytać i wyświetlić Twoje imię na pasku tytułowym okienka, wraz z uprzejmym pozdrowieniem
• obliczyć i wyświetlić przybliżoną liczbę dni Twojego życia, mnożąc każdy rok przez 365
W pliku nagłówkowym okienka Project1Frm.h ppojawiły się deklaracje wszystkich komponentów
i przygotowane dla nich identyfikatory:
private: wxStaticText *WxStaticText1, *WxStaticText2, *WxStaticText3;
wxTextCtrl *WxEdit1, *WxEdit2;
wxButton *WxButton1;
enum { ID_WXSTATICTEXT1 = 1002, ID_WXSTATICTEXT2 = 1005, ID_WXSTATICTEXT3 = 1009, ID_WXEDIT1 = 1003,
ID_WXEDIT2 = 1006, ID_WXBUTTON1 = 1007,
ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
};
W pliku źródłowym okienka Project1Frm.cpp, w ciele metody CreateGUIControls(), automatycznie
pojawiły się polecenia utworzenia elementów przy zastosowaniu konstruktorów ich klas. Oto niektóre:
WxEdit1 = new wxTextCtrl(this, ID_WXEDIT1, wxT(""), wxPoint(104, 32), wxSize(105, 25), 0,
wxDefaultValidator, wxT("WxEdit1"));
WxButton1 = new wxButton(this, ID_WXBUTTON1, wxT("Oblicz dni życia"), wxPoint(104, 128),
wxSize(105, 25), 0, wxDefaultValidator, wxT("WxButton1"));
Jeśli chcesz, aby po uruchomieniu programu kursor automatycznie pojawiał się w okienku WxEdit1,
umożliwiając wpisanie tam imienia, dodaj w konstruktorze okienka, po CreateGUIControls();
WxEdit1->SetFocus();
Wybierz przycisk (ujmij go w uchwyty) i obsłuż jego zdarzenie OnClick, lub po prostu go „dwu-kliknij”
Automatycznie w pliku żródłowym okienka: ProjectFrm.cpp zostanie wstawiony „szkielet” funkcji:
void Okienko::WxButton1Click(wxCommandEvent& event) {
// insert your code here
}
oraz wpis do tabeli zdarzeń, który połączy zdarzenie obiektu o identyfikatorze ID_WXBUTTON1 z funkcją
WxButton1Click
BEGIN_EVENT_TABLE(Okienko,wxFrame)
EVT_CLOSE(Okienko::OnClose)
EVT_BUTTON(ID_WXBUTTON1,Okienko::WxButton1Click)
END_EVENT_TABLE()
Pozostaje tylko wypełnić ciało funkcji WxButton1Click:
void Okienko::WxButton1Click(wxCommandEvent& event)
{
wxString imie = WxEdit1->GetValue();
// odczytuje imię
this->SetTitle("Witaj "+imie);
// wyświetla imię na pasku tytułowym okienka
int lata = wxAtoi(WxEdit2->GetValue());
// odczytuje lata jako zmienną typu wxString
//i zamienia na liczbę całkowitą
int dni = 365*lata;
// przygotowuje wynik typu wsString
wxString wynik ="Liczba Twoich dni = "+wxString::Format("%i",dni);
WxStaticText3->SetLabel(wynik);
// wyświetla wynik
}
Konwersja łańcucha znaków typu wxString na liczbę całkowitą:
metoda bool ToLong(&w, baza) łańcucha klasy wxString, istnieje także podobna metoda: ToULong()
pobiera dwa parametry:
&w – adres zmiennej wynikowej typu long,
baza – const int, podstawa systemu liczbowego, w którym podane są cyfry łańcucha t
zwraca wartość logiczną true jeśli kowersja się powiodła, w przeciwnym razie zwraca false
Przykład zastosowania – konwersja łańcucha binarnego t na wartość całkowitą dziesiętną w :
wxString t = WxEdit1->GetValue();
long w;
if ( t.ToLong(&w,2) ) { // tu można użyć zmiennej w w dalszych obliczeniach
}
else wxMessageBox(“bład konwersji na liczbę całkowitą”);
funkcje wxAtoi(t) i wxAtol(t) – odpowiedniki, „wrappery” funkcji CRT - C Run-Time
Przykład zastosowania:
wxString s = ”123”;
int n = wxAtoi(s);
long m = wxAtol(s);
Konwersja łańcucha znaków typu wxString na liczbę rzeczywistą:
metoda bool ToDouble (&wynik) łańcucha klasy wxString
pobiera jeden parametr: adres zmiennej wynikowej typu double,
zwraca wartość logiczną true jeśli kowersja się powiodła, w przeciwnym razie zwraca false
Przykład zastosowania – konwersja łańcucha binarnego t liczbę rzeczywistą x :
wxString t = WxEdit1->GetValue();
double x;
if (t.ToDouble(&x))
wynik->SetLabel(wxString::Format("%2f",2*x));
else wynik->SetLabel("jakiś błąd");
funkcja wxAtof(t) – odpowiednik, „wrapper” funkcji CRT - C Run-Time
Przykład zastosowania:
wxString s = ”123.45”;
double x = wxAtof(s);
Konwersja liczby na łańcuch typu wxString:
Można przesłać strumieniem liczbę do wxStringa, lub wywołać metodę Format klasy wxString
double x = 3.777;
wxString t1, t2;
t1 << x;
t2 = wxString::Format("%f",x);
// przesłanie liczby strumieniem
// Format na liczbie x
Liczby całkowite – tak samo, tylko inny parametr formatujący: wxString::Format(”%i”,liczba);
Uwagi:
1. Jeżeli w okienku jest tylko jedno pole danych wxEdit, to wygodnie jest uruchomić odczyt
i obliczanie wyniku bezpośrednio po zakończeniu wprowadzania danej i naciśnięciu przycisku
ENTER, bez szukania i klikania przycisku.
Wystarczy dla kontroki wxEdit obsłużyć zdarzenie OnEnter
void Okno::WxEdit1Enter(wxCommandEvent& event) {
int n = wxAtoi(WxEdit1->GetValue());
int potega = pow(2,n);
WxStaticText1->SetLabel("2^n = "+wxString::Format("%i",potega));
}
2. Można zabezpieczyć się przed podaniem danej w niewłaściwym formacie:
a. jeśli potrzebujesz tylko liczb całkowitych, wykorzystaj metodę IsNumber() klasy wxString:
void Okno::WxEdit1Enter(wxCommandEvent& event) {
if (WxEdit1->GetValue().IsNumber()) { // moŜe być teŜ liczba ujemna
int n = wxAtoi(WxEdit1->GetValue());
double potega = pow(2,n);
WxStaticText1->SetLabel("2^n = "+wxString::Format("%f",potega));
}
else
WxStaticText1->SetLabel("Podaj liczbę całkowitą);
}
b. dla danych z częścią ułamkową, zastosuj metodę ToDouble(&zmienna) klasy wxString
(istnieje też podobna metoda ToLong(&zmienna) dla liczb całkowitych)
void Okno::WxEdit1Enter(wxCommandEvent& event) {
double n;
if (WxEdit1->GetValue().ToDouble(&n)) {
double potega = pow(2,n);
WxStaticText1->SetLabel("2^n = "+wxString::Format("%f",potega));
}
else
WxStaticText1->SetLabel("Podaj liczbę rzeczywistą z KROPKĄ dzies.");
}