quarta-feira, outubro 11, 2006

Curso de wxWidgets, post 6: Strings com wxString

Até aqui, você já tem condições de criar um aplicativo simples em wxWidgets, com uma interface gráfica razoável e alguns eventos. Agora, gostaria de falar sobre o tratamento de strings no wxWidgets.

Quando alguém aprende a programar em C (não C++), sente um pouco de dificuldade com o tratamento de strings no início. Como nós sabemos, as strings em C são na verdade vetores de char terminados com \0. A manipulação dessas strings se dá através de funções da biblioteca string.h: strcmp(), strcat(), strtok(), strstr()...

Já com C++, surge uma classe chamada string, da biblioteca string, com o objetivo de facilitar a manipulação das strings em C++ (quanta string! :P). Essa classe possui alguns métodos interessantes como string::append(), string::assign(), string::compare() e, inclusive, um método que retorna a string no formato de vetor do C padrão, a string::c_str().

Com a classe string do C++, evitamos problemas de referência de ponteiros e de manipulação de strings em geral, que podiam acontecer no C padrão. Mas agora que estamos usando wxWidgets, temos em mãos uma nova classe chamada wxString. Uma classe para manipulação de strings, como a classe string do C++, mas com algumas facilidades a mais.

Nada melhor que exemplos para demonstrar a classe wxString. Primeiro, vamos declarar um objeto do tipo wxString e atribuir um valor a ele:

wxString Texto;
Texto = wxT("Nossa nova string!");


Você pode fazer tudo em uma linha só, se preferir:

wxString Texto = wxT("Nossa nova string!");


Agora já temos um objeto wxString com a string "Nossa nova string!" atribuída a ele. O que podemos fazer em seguida? Vamos começar adicionando mais string:

Texto.Append(wxT(" Com wxString, claro."));


O método wxString::Append() adiciona texto ao final da string contida no objeto. O conteúdo do objeto Texto agora é "Nossa nova string! Com wxString, claro.".

Também é possível alterar todo o conteúdo do objeto. Podemos fazer isto com uma nova atribuição:

Texto = wxT("Aprendendo wxWidgets com Just.");


Depois da linha acima, o conteúdo do objeto será alterado para "Aprendendo wxWidgets com Just.". Vamos agora criar outra string:

wxString Texto2 = wxT("Aprendendo wxWidgets com Just.");


Temos agora dois objetos: Texto e Texto2. Podemos compará-los:

if (Texto == Texto2)
wxMessageBox(wxT("São iguais."));


Com esse trecho de código, iremos ver uma caixa de mensagem que dirá "São iguais.". Atenção! As string são sensíveis à capitulação, ou seja, "Just", "just" e "JuSt" são todas diferentes entre si.

Podemos também verificar se uma string está dentro da outra. Por exemplo:

if (Texto.Contains(wxT("wxWidgets")))
wxMessageBox(wxT("Texto encontrado."));


O método wxString::Contains() verifica se a string passada como parâmetro está contida na string atribuída ao objeto, retornando true ou false.

Os amantes do C puro (como eu) que nunca abrem mão do sprintf, têm uma alternativa com a classe wxString. Vamos criar uma string formatada, com alguns trechos dependentes de variáveis. Por exemplo:

int a, b;
a = 2;
b = 3;
wxString Soma;
Soma.Printf(wxT("A soma de %d com %d é %d."), a, b, a + b);


Qual será o conteúdo do objeto Soma? Se você pensou em "A soma de 2 com 3 é 5.", acertou em cheio. Com o método wxString::Printf(), podemos atribuir uma string ao objeto da mesma forma que fazemos isso em um vetor de char com a função sprintf do C. Existe também um método static que tem a mesma função, o wxString::Format(). Com esse método, não precisamos de um objeto instanciado para criar strings formatadas. Veja:

wxMessageBox(wxString::Format(wxT("A soma de %d com %d é %d."), a, b, a + b));


wxMessageBox() irá mostrar a mesma string do exemplo anterior, sem precisarmos instanciar um objeto para isso.

Temos também o método wxString::c_str(), caso queiramos obter um vetor de char, como no C puro:

char *soma_c = Soma.c_str();


Na versão ANSI do wxWidgets, wxString::c_str() retorna a string no formato ANSI. Esse mesmo método retorna a string no formato UNICODE, na versão UNICODE do wxWidgets. Se quiser obter o formato ANSI, independentemente da versão da compilação da biblioteca, use wxString::mb_str(). Para o mesmo, no formato UNICODE, temos wxString::wc_str().

Acredito ter mostrado exemplos suficientes dos métodos da classe wxString. Como sempre recomendo, leiam a documentação da classe para ver os outros métodos e utilizações dela. Recomendo também o tópico "wxString overview".

Por último, já que estamos usando wxWidgets, vamos usar wxString para manipular nossas strings. Dessa forma, a coisa toda fica mais fácil e temos mais opções, como demonstrei acima. :)

2 comentários:

Anônimo disse...

Opa! Só dando os parabéns pela sua iniciativa.

O "Curso de wxWidgets" está bem simples e direto, exatamente como um bom tutorial deve ser.

E o Blog também é bom. Está de parabéns.

lucas disse...

Maravilha cara....salvou mesmo...
eu estou criando um chat e to sem saber como dou um enter entre um texto e outro..tipo digito uma mensagem..e a outra vai vir embaixo da primeira...quando eu addiciono com append adiciona na frente
eu tentei dar um append com \n mais nada feito....abraço