Avviare un nuovo progetto wxDev-C++ basato su wxWidgets Frame e denominarlo Stringhe. Salvarlo in una cartella denominata wxStringhe.
Inserire un BoxSizer (Propietà Orientamento: wxVERTICAL, ).
Aggiungere uno staticText e allargarlo per coprire il frame in orizzontale, un pulsante wxButton, un wxMemo, ridimensionato per coprire il frame.
Negli esempi seguenti si userà un gestore dell'evento clic sul pulsante per impiegare i metodi appartenenti all'oggetto wxString. Poichè gli esempi non intendono pervenire ad un programma completo, ma sono tutti segmenti indipendenti, basterà, ogni volta sostituire le istruzioni presenti nel gestore dell'evento. Per ogni esempio, provare il programma lanciando il comando Compila ed Esegui del menu Progetto
Aggiungere un gestore al pulsante
// insert your code here wxString nomi[] = {_("Anna"), _("Maria"), _("Wanda")}; wxString verbi[] = {_("legge"), _("guarda"), _("strappa")}; wxString oggetti[] = {_("libri"), _("giornali"), _("quaderni")}; int Ncaso = rand()%3; int Vcaso = rand()%3; int Ocaso = rand()%3; wxString str = nomi[Ncaso] + _(" ") + verbi[Vcaso] + _(" ") + oggetti[Ocaso]; WxMemo1->AppendText(_("\n") + str);
Questo programma crea ed inizializza tre array di stringhe. Genera 3 numeri casuali che verranno utilizzati come indice per ciascun array. Viene composta una sola stringa concatenando le tre stringhe scelte (a caso) e separandole con uno spazio. Prima di stampare una stringa si va a capo.
Ogni array di caratteri, o il solo carattere spazio, è racchiuso tra parentesi tonde precedute dal carattere underscore, allo scopo di convertire l'array di caratteri in un oggetto di classe wxString.
wxString nomi[] = {_("Anna"), _("Maria"), _("Wanda")}; wxString verbi[] = {_("legge"), _("guarda"), _("strappa")}; wxString oggetti[] = {_("libri"), _("giornali"), _("quaderni")}; int Ncaso = rand()%3; int Vcaso = rand()%3; int Ocaso = rand()%3; int caso = rand()%18 + 2; wxString str = nomi[Ncaso] + _(" ") + verbi[Vcaso] + _(" %d ") + oggetti[Ocaso]; str.Printf(str, caso); WxMemo1->AppendText(_("\n") + str);
Il metodo Printf dell'oggetto wxString ammette la presenza del codice di formato (%d in questo caso) per stampare il contenuto di una variabile all'interno di una stringa. Ad esempio la seguente istruzione: str.Printf("%d fiori", 15) scrive 15 fiori nella stringa str.
wxString nomi[] = {_("Anna"), _("Maria"), _("Sig.ra Wanda"), _("Sig. Giorgio")}; wxString verbi[] = {_("legge"), _("guarda"), _("strappa")}; wxString oggetti[] = {_("libri"), _("giornali"), _("quaderni")}; int Ncaso = rand()%4; int Vcaso = rand()%3; int Ocaso = rand()%3; int caso = rand() % 18 + 2; wxString str = nomi[Ncaso] + _(" ") + verbi[Vcaso] + _(" %d ") + oggetti[Ocaso]; str.Printf(str, caso); if (str.Contains(_("Sig.ra"))) str = _("La ") + str; if (str.Contains(_("Sig. "))) str = _("Il ") + str; WxMemo1->AppendText(_("\n") + str);
Nell'istruzione:
if (str.Contains(_("Wanda"))) str = _("Mrs. ") + str;
Il metodo Contains() della classe wxString ricerca la presenza della stringa Wanda all'interno della stringa str e restituisce true se la trova. Il programma sceglie il giusto articolo da anteporre al titolo della persona.
Si deve anche notare che una sottostringa potrebbe essere interpretata erroneamente, come nel caso di "Sig." che è una sottostringa di "Sig.ra", a questo scopo nella stringa "Sig. " si considera che il punto sia seguito da uno spazio.
wxString nomi[] = {_("Anna"), _("Maria"), _("Sig.ra Wanda"), _("Sig. Giorgio")}; wxString verbi[] = {_("legge"), _("guarda"), _("strappa")}; wxString oggetti[] = {_("libri"), _("giornali"), _("quaderni")}; int Ncaso = rand()%4; int Vcaso = rand()%3; int Ocaso = rand()%3; if (nomi[Ncaso].length()>5) nomi[Ncaso] += _("\n"); int caso = rand() %18 + 2; wxString str = nomi[Ncaso] + _(" ") + verbi[Vcaso] + _(" %d ") + oggetti[Ocaso]; str.Printf(str, caso); if (str.Contains(_("Sig.ra "))) str = _("La ") + str; if (str.Contains(_("Sig. "))) str = _("Il ") + str; WxMemo1->AppendText(_("\n") + str);
In questo esempio, si valuta la lunghezza della stringa nomi[Ncaso]. Se questa contiene più di 5 caratteri si aggiunge un carattere vai a capo.
Per convertire in minuscolo i caratteri della stringa contenuti in str si richiama il metodo MakeLower();:
str.MakeLower();
Per convertire in maiuscolo i caratteri della stringa contenuti in str si richiama il metodo MakeUpper();:
str.MakeUpper();
Leggere il contenuto della cartella corrente:
Modificare il gestore di evento onClic con la seguente istruzione:
wxShell(_("dir > cartella.txt"));
L'istruzione wxShell passa un comando al sistema operativo. In questo caso si passa il comando dir con l'operatore di ridirezione (il segno di maggiore) che invia il risultato nel file cartella.txt (anzichè allo schermo) che verrà creato nella cartella corrente.
Si possono provare altre varianti dello stesso comando:
wxShell(_("dir .. | more"));
Il comando mostra il contenuto della directory superiore. L'operatore "|" (pipe) aggiunge un secondo comando: more che ha l'effetto di mostrare l'output prodotto dal comando Dir su più pagine. Per avanzare di pagina basta premere un tasto.
Il seguente comando, richiamato dal gestore dell'evento onClic, scrive il percorso della directory corrente nella label.
WxStaticText1->SetLabel(wxGetHomeDir());
Il seguente comando, richiamato dal gestore dell'evento onClic, scrive il nome del sistema operativo nella label.
WxStaticText1->SetLabel(wxGetOsDescription());
Il seguente comando, richiamato dal gestore dell'evento onClic, scrive il nome del computer nella label.
WxStaticText1->SetLabel(wxGetUserName());
Il seguente comando, richiamato dal gestore dell'evento onClic, scrive il nome utente nella label.
WxStaticText1->SetLabel(wxGetFullHostName());
Il seguente esempio scrive nella label la quantità di memoria libera.
wxString str; long mem = wxGetFreeMemory().ToLong(); str.Printf(_("Memoria libera: %ld\n"), mem); WxStaticText1->SetLabel(str);
La classe wxDateTime possiede numerosi metodi per elaborare una data. Il metodo Now() restituisce la data corrente. Per visualizzare una data, viene convertito in una stringa il risultato fornito dal metodo Format:
wxString str; wxDateTime adesso = wxDateTime::Now(); str = adesso.Format(_("%d %B %Y")); WxStaticText1->SetLabel(str);
Si salvi in un file di testo, nella cartella del progetto, la poesia di Carducci: piantoantico.txt
L'albero a cui tendevi
la pargoletta mano,
il verde melograno
da' bei vermigli fior,
nel muto orto solingo
rinverdì tutto or ora,
e giugno lo ristora
di luce e di calor.
Tu fior de la mia pianta
percossa e inaridita,
tu de l'inutil vita
estremo unico fior,
sei ne la terra fredda,
sei ne la terra negra
né il sol più ti rallegra
né ti risveglia amor.
Aggiungere due StaticText prima della casella di testo
Inserire la linea #include <wx/textfile.h> nel programma.
Nel gestore dell'evento inserire le seguenti linee:
wxTextFile file(_("piantoantico.txt")); wxString str, s; file.Open(); str.Printf(_("Numero linee: %d "), file.GetLineCount()); WxStaticText1->SetLabel(str); str.Printf(_("prima linea: %s "), file.GetFirstLine().c_str()); WxStaticText2->SetLabel(str); str.Printf(_("Ultima linea: %s "), file.GetLastLine().c_str()); WxStaticText3->SetLabel(str); for (s = file.GetFirstLine(); !file.Eof(); s = file.GetNextLine() ) { WxMemo1->AppendText(s + _("\n")); } file.Close();
Aggiungere le seguenti linee:
#include <wx/dir.h>
#include <wx/filefn.h>
Modificare il gestore dell'evento:
wxDir dir(wxGetCwd()); wxString file; bool cont = dir.GetFirst(&file, wxEmptyString, wxDIR_FILES | wxDIR_DIRS); while (cont) { WxMemo1->AppendText(file); cont = dir.GetNext(&file); }