sábado, setembro 24, 2005

Hello World

Este é um minúsculo tutorial de Robert Roebling.

Ele tem a intenção de ajudar as pessoas a fazer uma rápida análise relacionada a sintaxe e aos princípios básicos. O programa Hello Word completo está aqui.

Você tem que incluir os arquivos de cabeçalho, claro. Isto pode ser feito incluindo arquivos arquivo por arquivo, conforme a necessidade como, por exemplo
#include "wx/window.h"
ou usando um include global:
#include "wx/wx.h"


Isto também é útil em plataformas que suportam cabeçalhos pré-compilados tais como todos os principais compiladores da plataforma Windows.

#include "wx/wx.h"


Praticamente todos os aplicativos deveriam definir uma nova classe, derivada de wxApp.Sobrescrevendo o método
OnInit()
de wxApp o programa pode ser iniciado, por exemplo, criando uma nova janela principal.


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


A janela principal é criada derivando a classe de wxFrame e fornecendo-lhe um menu e uma barra de estado no seu construtor. Além disso, qualquer classe que deseje responder à qualquer evento (tais como os cliques do mouse ou às mensagens do menu ou de um botão) deve declarar uma tabela de eventos usando a macro abaixo.

Finalmente, o modo de reagir a tais eventos deve ser feito em handlers (manipuladores). No nosso exemplo, nós reagimos a dois itens de menu, um para o Quit (sair) e um para a exibição da janela About (sobre). Estes handlers não deveriam ser virtuais.


class MyFrame: public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

Para poder reagir a um comando do menu, deve ser dado um identificador único, como um const ou um enum.

enum
{
ID_Quit = 1,
ID_About,
};
Nós então prosseguimos para realmente implementar uma tabela de eventos na qual os eventos serão roteados para suas respectivas funções handler na classe MyFrame. Há macros pré-definidas para rotear todos os eventos comuns, indo da seleção da entrada de uma list box ao evento de redimensionamento quando o usuário redimensiona uma janela na tela.

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
Semelhante a todos os programas, deve haver uma função main. No wxWidgets o main é implementado usando-se macro, a qual cria uma instância da aplicação e inicia o programa.

IMPLEMENT_APP(MyApp)


Conforme mencionado acima,
wxApp::OnInit()
é chamado durante a incialização e deveria ser usado para iniciar o programa, talvez exibindo uma tela de splash e criando a janela principal (ou várias janelas). O frame deveria receber barra de título com o texto ("Hello World") e a posição e tamanho iniciais. Um frame também pode ser declarado para ser a janela principal. Retornar TRUE indica sucesso na intialização.


bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame( "Hello World", wxPoint(50,50), wxSize(450,340) );
frame->Show(TRUE);SetTopWindow(frame);
return TRUE;
}

No construtor da janela principal (ou depois) nós criamos um menu com dois itens, bem como uma barra de estado para ser exibida na base da janela principal. Ambas tem que ser anunciadas ao frame com as chamadas respectivas.


MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append( ID_About, "&About..." );
menuFile->AppendSeparator();
menuFile->Append( ID_Quit, "E&xit" );

wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( menuFile, "&File" );

SetMenuBar( menuBar );

CreateStatusBar();
SetStatusText( "Welcome to wxWidgets!" );
}
Aqui estão os manipuladores de evento. MyFrame::OnQuit() fecha a janela principal chamando Close(). O parâmetro TRUE indica que outras janelas não tem poder de veto como, por exemplo, perguntar: "Você tem certeza que quer fechar?". Se não há nenhuma outra janela principal, a aplicação irá encerrar.


void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
exibirá uma pequena janela contendo algum texto. Neste caso, uma janela "About" típica com informações sobre o programa.


void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox("This is a wxWidgets Hello world sample","About Hello World", wxOK wxICON_INFORMATION, this);
}

Você pode querer compilar o programa. Altere a extensão do arquivo de texto para .cpp, por exemplo, hworld.cpp. Usando o wxGTK e seu sistema de configuração você pode usar as seguintes declarações em qualquer sistema que tenha o g++ (em qualquer lugar que você tenha instalado o GTK+ e o wxGTK e qualquer que seja a opção que você tenha usado durante a instalação). Se você usar outra versão tal como wxMotif ou wxMSW, é recomendado que você adapte um dos makefiles de exemplo ou arquivos de projeto.


g++ hworld.cpp `wx-config --libs` `wx-config --cxxflags` -o hworld

Finalmente, você pode iniciar seu programa assim:
./hworld
Neste ponto o programa está no ar e você pode sair ou exibir o diálogo.

Nota para os usuários wxGTK: se o programa não iniciar e você receber uma mensagem como "hworld: can't load library libwx_gtk.so.1" então você esqueceu de re-executar o linker após a instalação da biblioteca. Faça isto logando como root e executando ldconfig (no Linux e no Solaris).

Se você obteve um erro do seu servidor X e o programa fechou, então você compilou sua biblioteca com suporte a threads apesar do seu sistema não suportá-las. Você terá que configurar --without-threads e recompilar todo o wxGTK após executar o comando make clean.

Para pessoas que não gostam do modo de rotear os eventos para os handlers usando a tabela de eventos e que preferem o modo como é feito no GTK+ or Qt: Também existe o método Connect(), a qual funciona de maneira muito similar ao modo do GTK+. Um argumento contra o uso do Connect() (apesar de ser mais próximo ao C++ e mais curto de se escrever) é que o wxIDE, o ambiente de programação visual do wxWidgets irá utilizar (e modificar) as tabelas de métodos e não as rotinas Connect().

Uma versão do hworld usando o Connect() está aqui.

Quer saber mais? Leia o livro do Julian Smart, principal desenvolvedor do wxWidgets.

Nota
Este artigo foi traduzido. A versão original encontra-se aqui: http://www.wxwidgets.org/hello.htm

sexta-feira, setembro 23, 2005

Como aprender a programar com wxWidgets

A seguir está uma resposta de Edward Ream para uma questão comum, "Qual é o melhor modo de aprender wxWidgets [e C++]?"

Data: domingo, 04 de junho de 2000 14:37:06 -0500
De: "Edward K. Ream"
Para: wx-users@wxwidgets.org
Assunto: Re: [wx-users] Como aprender a usar wx-windows
Reply-To: wx-users@wxwidgets.org

> Lendo o artigo sobre wxpython no Linux Journal e, tendo usado wxclips
> eu me interessei pelo wxwindows como uma interface de desenvolvimento. Entretanto, a
> experiência de programação que eu obtive é ultrapassada, and from a former generation (For-> tran). Eu gostaria de refrescar minha experiência e começar com C++.
> Será que o wx-windows é um passo muito grande para eu dar?

Eu também sou novato com wxWidgets, mas eu gostaria de responder a esta questão do mesmo modo. Nos últimos dois anos eu aprendi dois frameworks similares similares (Caixa Amarela da Apple, ou seja, NextStep/OpenStep e C++ Builder/Delphi da Borland) e neste último ano eu me tornei um entusiasta do C++ após 20 anos usando o C.

Sobre o C++.
O maior Ah pra mim foi que a complexidade do C++ na prática não importa. O que _realmente_ importa é que o C++ permite que você faça coisas simples de modo simples, mais simples que o C. Com um sistema como o wxWidgets você estará criando objetos e então utilizando os objetos e seus métodos.

Assim, não tenha medo do C++: você estará usando apenas a ponta do iceberg.
Besides the C++ A linguagem de programação, de Bjarne Stroustrup, o guia "oficial" do C++, Eu recomendo fortemente Inside the C++ Object Model, de Stanley B. Lippman. (Lipmann foi um dos C++ honchos na Bell Labs.) Este livro irá ensiná-lo o que _não_ fazer, bem como porque tudo no C++ é do jeito que é. Se você está confuso sobre qualquer coisa no C++, o livro do Lippman é a solução.

Sobre os frameworks de aplicações.
Frameworks de Aplicativos, tais como o wxWidgets, são organizados ao redor de um conjunto de classes cooperativas. Veja classe principal do Aplicativo, wxApp, algumas classes de frames e painel, classes gráficas, classes de menus, classes de controle, etc. Em geral, fazer qualquer coisa em um framwork envolve criar um objeto de um tipo específico, então fazer algo com o objeto.

Por exemplo, suponha que você quer criar uma barra de menu. Uma barra de menu é composta de um objeto barra de menu simples do tipo (classe) wxMenuBar que contém objetos menu do tipo wxMenu. Cada menu contém objetos itens de menu do tipo wxMenuitem.

Assim, você cria o objeto barra de menu, então cria todos os objetos menu (criando os objetos itens do menu deste modo) e finalmente "conecta" os objetos do menu à barra de menu usando uma chamada ao método wxMenuBar::Append.

Como uma visão geral eu olharia na seção "Alphabetical class reference" do manual de referência. Eu acho a versão HTML a mais fácil de usar: você pode navegar muito rapidamente através dela. este é o modo como você deve ler esta (imensa) referência:


  1. Obtenha uma visão geral de todos os tipos de classe envolvidos. Os nomes das classes irão de dizer muito sobre o que cada uma faz. Abra algumas das classes, em particular a wxApp (o objeto principal do aplicativo), wxFrame, wxControl (a classe base para todos os controles) e um ou dosi controles, como o wxButton.

  2. Quando estiver escrutinando a classe pela primeira de muitas vezes, leia as notas e rapidamente varra a lista de métodos da classe para obter uma idéia geral sobre quais tipos de operação podem ser feitos com os objetos daquela classe. Você não está procurando por detalhes neste estágio, apenas por um panorama. Em particular, quais classes existem e como que elas trabalham em conjunto.
  3. Preste atenção nas classes das quais uma classe é derivada. Por exemplo, um botão (um objeto do tipo wxButton) é derivado das classes wxControl, wxWindow, wxEvtHandler e wxObject.
    O que isto significa? isto significa que um botão _é_ um controle, e um botão _é_ uma janela (window), e um botão _é_ um tratador de eventos (event handler) e um botão _é_ um objeto.
    Assim, você deve entender as classes pai de um objeto para entendê-lo. por exemplo, se b é um botão voc pode invocar b.m para qualquer método m das classes wxControl, wxWindow, wxEvtHandler ou wxObject Você não está limitado apenas aos métodos de wxButton! Esta é uma das chaves da programação orientada à objetos.


Mais algumas dicas:
Leia alguns códigos de exemplo. Você verá que quase nada da linguagem C++ está realmente sendo utilizada; Há apenas a criação sem fim de objetos e então a chamada dos métodos daqueles objetos.

Aprenda o máximo que você puder da classe String; após utilizar uma boa classe String, você nunca mais vai querer usar as funções de string do C. wxWidgets possui outras classes utilitárias muito interessantes.

A classe de aplicação, wxApp, contém o laço de eventos principal. Aprenda sobre a manipulação de eventos e a tabela de eventos (ler alguns códigos de exemplo irá ajudar). Quase tudo neste tipo de framework de aplicação acontece como resultado de um evento e o seu programa essencialmente não faz nada além de responder aos eventos. Ter um laço de eventos escritos para você é o maior benefício.

Eu espero que isto ajude. Talvez nós possamos trabalhar juntos no aprendizado do wxWidgets. Por favor, sinta-se à vontade para me perguntar qualquer questão que você possa ter.

Se eu tiver feito qualquer ?? neste post eu espero que os especialistas em wxWidgets gentilmente me corrijam.

Edward
--------------------------------------------------------------------
Edward K. Ream email: edream@tds.net
Leo: Literate Editor with Outlines
Leo: http://personalpages.tds.net/~edream/front.html
--------------------------------------------------------------------

Quer saber mais? Leia o livro do Julian Smart, principal desenvolvedor do wxWidgets.

Nota
Este artigo foi traduzido. A versão original encontra-se aqui: http://www.wxwidgets.org/technote/tn0008.htm

quinta-feira, setembro 22, 2005

Conversão de arquivos de texto do formato DOS para o do Unix

O artigo que eu publiquei no dia 21/09/2005 no site script fácil ( http://www.scriptfacil.com/index.php?arquivo=e&t=5&a=13 ) mostrava um script que convertia arquivos de texto do formato DOS para o Unix.

Bem, hoje, brincando um pouco com o sed, descobri um outro modo de fazer a conversão:
sed 's/.$//'
Assim, poderíamos executar o seguinte comando:
cat arquivo_dos.txt sed 's/.$//' > arquivo_unix.txt

Podemos usar ainda os seguintes comandos:
arquivo_dos.html sed 'N;s/\n/\t/' > arquivo_unix.txt
arquivo_dos.html sed 'N;s/\n//' > arquivo_unix.txt
O script que eu publiquei no site da script fácil é bom para converter váriops arquivos de uma vez. Estes mostrados aqui são bons para usos exporádicos.
Bom proveito.

Se tu queres aprender a programar expressões regulares, podes ler este livro. Para aprender a programar shell scripts, estude este livro ou este aqui. Na minha opinião estes são os dois melhores livros sobre o assunto.

sexta-feira, setembro 09, 2005

wxWidgets já dominou o mundo...agora vai dominar o Brasil

Em um post anterior eu falei sobre desenvolvimento multiplataforma. Abordei duas soluções: Java ( a mais conhecida ) e wxWidgets.

Retomando o tema, estou mostrando algumas instituições de outros países que utilizam o framework wxWidgets.

Para citar apenas 3: NASA, a agência espacial americana, National Human Genome Research Institute, que desenvolve pesquisas sobre o genoma humano e a AMD, uma das maiores fabricantes de microprocessadores do mundo.

A lista (quase completa) completa pode ser vista em http://www.wxwidgets.org/users.htm

Com o intuito de facilitar a adoção do wxWidgets, vou publicar uma série de artigos, ensinando passo a passo como programar com ele.

Não vou reinventar a roda, assim, alguns serão traduções e/ou adaptações de textos em inglês (quando isso acontecer, vou deixar bem visível o link para o artigo original) e outros serão de minha autoria.

Os artigos sobre wxWidgets podem ser lidos aqui

Ah, só para lembrar: quem for fã do Python pode programar com o wxPython, quem gosta de Perl pode usar o wxPerl. Há também versões para JavaScript, Ruby e Lua.

Quer saber mais? Leia o livro do Julian Smart, principal desenvolvedor do wxWidgets.

quinta-feira, setembro 08, 2005

Meu primeiro artigo publicado

É uma felicidade indescritível!!

Hoje recebi a edição de número 19 da revista Active Delphi com a primeira parte do meu artigo sobre Internet móvel com WAP e WML.

Estou muito satisfeito. Espero que os leitores da revista gostem da matéria, pois escrevi com o maior afinco, para tornar a leitura fácil, agradável e instrutiva.

Agora é só esperar pelos emails com as criticas.


Quer aprender a fazer páginas WAP ? Leia estes livros.

Desenvolva um aplicativo e execute-o no Windows, no Linux e no Mac

Um aplicativo multi-plataforma é o sonho de muitos desenvolvedores. A linguagem C surgiu com a promessa de ser multiplataforma, pois livraria os programadores de programarem em Assembly.

Com o passar dos anos, verificou-se que simplesmente utilizar o C não tornava um aplicativo multi-plataforma. Várias diferenças de arquiteturas de hardware e de bibliotecas tornavam a portabilidade um pesadelo.

A Sun lançou o Java como sendo a solução definitiva para o problema de portabilidade. Write once. Run Everywhere é o lema. De fato, Java é uma excelente linguagem que quase que elimina todos os problemas de portabilidade.

Como isso é conseguido? Ao invés de gerar um binário compatível com o processador (que é o que todas as linguagens compiladas fazem), o Java gera um pseudo-código: os byte-codes.
Este código é interpretado por uma máquina virtual java (jvm).

A máquina virtual Java (desenvolvida em C) é um programa compilado especificamente para a plataforma em que será executada.

É responsabilidade máquina virtual interpretar os byte-codes e executar as operações para o programa em java. Para cada nova plataforma, basta o desenvolvimento da nova jvm pelo fabricante e nossos códigos em Java podem ser executados, sem nenhum esforço adicional do programador.

Apesar desta solução ser ideal para a maioria dos casos, às vezes ela não é conveniente. Há vários motivos para que alguém não queira ou não possa programar em Java:


  • desconhecimento da linguagem
  • necessidade de rodar o programa em máquinas mais antigas, onde há sérias restrições de memória e processador
  • desejo que o programa tenha a mesma aparência que os aplicativos nativos.
Desde 1992 existe um framework denominado wxWidgets que tem as seguintes premissas:


  1. ser rápido
  2. programação fácil
  3. fácil portabilidade
  4. mesma aparência que aplicativos nativos
  5. baixo custo

Como que o wxWidgets consegue os objetivos acima?

A velocidade é obtida por duas coisas:

  1. a biblioteca é implementada em C / C++, ou seja as mais rápidas linguagens de programação são utilizadas.
  2. Não existe um interpretador (como acontece com o Java).

Epa! Se o código é em C, então ele é nativo. Como que pode ser portável?

Todas as classes disponibilizadas pelo wxWidgets são implementadas com as bibliotecas nativas de cada plataforma.Por exemplo, no MS Windows, as bibliotecas usam o SDK WIN32. No Linux, usam o GTK+.

Deste modo, o código fonte é sempre o mesmo. O desenvolvedor só precisa recompilar o programa na plataforma de seu interesse. Esta abordagem permite ao aplicativos desenvolvidos com wxWidgets terem a mesma cara dos outros programas, sem nenhum esforço extra.

Você programa para várias plataformas diferentes sem ter que aprender classes diferentes para cada uma delas. Além disso, a licensa do wxWidgets permite que você desenvolva aplicativos comerciais sem necessidade de pagar royalties e sem precisar liberar o código fonte.

Vou escrever mais sobre o wxWidgets (e sobre Java também), para tentar te mostar como funciona esta framework e como portar um aplicativo feito com a MFC da Microsoft.

Quer saber mais? Leia o livro do Julian Smart, principal desenvolvedor do wxWidgets.