Matéria



Pascal + GTK


Por Luiz Fernando “Zendrael” Estevarengo
Publicado em 02/10/2008

Este artigo foi visualizado 11056 vezes.

Versão para impressão Enviar por email



Por Luiz Fernando “Zendrael” Estevarengo



Ok, você leu o título deste artigo e deve estar pensando: “Putz! Pascal não!” – mas calma, leia as próximas linhas que tenho certeza que serão interessantes. Senão como programador, leia como curioso!



A linguagem Pascal nasceu com o intuito de ensinar a programar. Com sua sintaxe simples e objetiva, é utilizada até hoje por muitas instituições de ensino e normalmente acompanha os primeiros passos da maioria dos programadores; e em alguns casos, acompanha os passos até hoje. É errôneo dizer que “Pascal só serve pra fazer programas para o DOS” ou “Pascal só é bom no Delphi”... isso demonstra desconhecimento do nível da linguagem e das possibilidades ligadas a ela.



Vamos falar um pouco dessas possibilidades: hoje, através do compilador FreePascal podemos desenvolver aplicações compiláveis em diversas plataformas, entre elas o Windows (XP, Vista, CE), Mac OS X, GNU/Linux, *BSD e até mesmo GameBoy Advance (e há em desenvolvimento uma biblioteca para Nintendo DS também). Pois bem, e como alternativa ao Delphi e ao Kylix, temos o Lazarus cuja filosofia é “Write once, compile everywhere” – escreva uma vez, compile em qualquer lugar – o que demonstra quão avançado está o velho Pascal em relação ao que normalmente se conhece dele. Mas o foco aqui é a combinação Pascal + GTK certo? E o que tudo isso tem a ver? Simplesmente que a união de uma das mais simples linguagens de programação com uma das mais conhecidas bibliotecas gráficas permite escrever aplicações compiláveis multiplataforma! Duvida da facilidade? Ok, então mãos ao teclado e vamos lá!



Vou supor que você já tenha o compilador FreePascal instalado em sua máquina e as respectivas bibliotecas necessárias. A saber, se estiver em uma distribuição Debian GNU/Linux ou derivada, os pacotes são: fpc e fp-units-gtk2. Outras distribuições devem conter os respectivos pacotes em seus repositórios. Se você não achou, pode visitar o endereço www.freepascal.org e procurar o link de download.



Abra seu editor de texto preferido e digite o seguinte código (a explicação de cada linha vem em seguida):



program exemplo_1;

uses glib2, gtk2;

var
pJanela : PGtkWidget;
pLabel : PGtkWidget;

begin
gtk_init(@argc, @argv);

//criando widgets
pJanela := gtk_window_new(GTK_WINDOW_TOPLEVEL);
pLabel:= gtk_label_new( 'Pascal + GTK2' );

//configurando propriedades
gtk_window_set_title( GTK_WINDOW( pJanela ), 'Exemplo simples');

//empacotando
gtk_container_add( GTK_CONTAINER( pJanela ), pLabel );

//mostrando tudo
gtk_widget_show_all( pJanela );

//iniciando loop
gtk_main();
end.



Antes, deixe-me dizer que você vai apenas visualizar uma janela sendo aberta com um rótulo dentro, nada demais. É só um simples exemplo, ok? Depois mostrarei outras coisas. A idéia agora é entender como isso funciona.



Na primeira linha, iniciamos nosso programa da forma padrão de qualquer aplicação em Pascal e em seguida chamamos as bibliotecas que serão utilizadas:



program exemplo_1;

uses glib2, gtk2;



Na seção var declaramos nossos objetos. Se você está acostumado com linguagens dinamicamente tipadas como Python ou PHP, pode achar estranho ter de declarar cada objeto da interface, mas, assim como em C, isso é de grande valia e, em termos de organização de código, é sempre bom manter as coisas nos seus lugares corretos e não “jogados” em qualquer lugar do fonte. Para cada objeto em nossa aplicação, dizemos que ele é do tipo pGtkWidget, que nada mais é que um ponteiro (sem desespero!) para um objeto GTK.



var
pJanela : PGtkWidget;
pLabel : PGtkWidget;



Em seguida, iniciamos o bloco principal da aplicação (como o main() de C) e iniciamos o GTK com os parâmetros passados para nossa aplicação, caso eles existam.



begin
gtk_init(@argc, @argv);



Agora, vamos começar a criar nossos objetos. Em uma única linha criamos a janela principal de nossa aplicação e dizemos, com o parâmetro que a função recebe, que se trata de uma janela do tipo “normal” – isso porque existe outro tipo, o popup (uma janela sem bordas ou controles do gerenciador de janelas). E na linha seguinte, criamos o GtkLabel que vai ficar dentro dela já passando seu conteúdo como parâmetro também:



//criando widgets
pJanela := gtk_window_new(GTK_WINDOW_TOPLEVEL);
pLabel:= gtk_label_new( 'Pascal + GTK2' );



Depois disso, configuramos os widgets da maneira que acharmos necessária. Aqui estamos definindo o título da janela e depois colocando o rótulo dentro dela:



//configurando propriedades
gtk_window_set_title( GTK_WINDOW( pJanela ), 'Exemplo simples');

//empacotando
gtk_container_add( GTK_CONTAINER( pJanela ), pLabel );



Moleza, até agora, não? O próximo passo é exibir a janela. De nada adianta criar uma janela e não exibi-la. Para isso, usamos a função gtk_widget_show_all(), que mostra a janela (passada como parâmetro) e todo o conteúdo que estiver dentro dela:



//mostrando tudo
gtk_widget_show_all( pJanela );



Por fim, basta iniciar o loop principal do GTK e finalizar o bloco principal do programa:



//iniciando loop
gtk_main();
end.



Para compilar, basta utilizar o comando:



$ fpc nome_do_programa.pas



E rodar a aplicação com:



$ ./nome_do_programa



Há, claro, muito mais coisas envolvidas em se criar uma aplicação dessa forma, como os contêineres do GTK, as funções para definir e consultar propriedades dos objetos etc. Porém, antes que você desista de estudar o Pascal+GTK por sua complexidade (ou preguiça de digitar os códigos para criar os objetos gráficos), vamos a um recurso muito útil: o Glade. Glade é uma aplicação muito conhecida de quem desenvolve programas com GTK. Ele é uma ferramenta RAD (Rapid Application Development – Desenvolvimento Veloz de Aplicações) que auxilia na criação das interfaces da aplicação. Vamos fazer um teste?



Primeiro, vamos baixar o Glade: mais uma vez, em sua distribuição deve existir o pacote glade ou glade-3 (última versão). Se você não encontrar, procure em http://glade.gnome.org.



Depois de instalado, abra a aplicação e brinque como quiser, posicione qualquer objeto na tela, dimensione etc. Não vou explicar como se faz isso pois esse não é o foco de nosso artigo nesse momento. Salve seu arquivo .glade na mesma pasta onde estiver o fonte da aplicação que estamos criando e vamos nos concentrar na programação:



program exemplo_2;

uses glib2, gtk2, libglade2, sysutils;


var
arquivo_glade : PGladeXML;


begin
gtk_init(@argc, @argv);

//carrega arquivo glade
arquivo_glade := glade_xml_new( Pchar( '/arquivo.glade' ), nil, nil);

//iniciando loop
gtk_main();
end.



O leitor deve ter observado que são necessárias menos linhas de código para se utilizar uma interface externa (com N objetos) e somente uma variável para ela. Na verdade, o Glade gera um arquivo em formato XML contendo a especificação de cada objeto GTK criado. Por exemplo, seu tamanho, posição, nome etc. Isso também é útil para que possamos separar, em nossa aplicação, a interface da lógica envolvida. O próprio GTK se encarrega de processar o arquivo XML da interface e criar os objetos.



Note que o início da aplicação é o mesmo, à exceção da declaração de duas novas bibliotecas: libglade2 – responsável por tratar os objetos Glade – e sysutils – utilizada para fornecer algumas funções necessárias (como Pchar();, por exemplo):



program exemplo_2;

uses glib2, gtk2, libglade2, sysutils;



Ao invés de declararmos objetos da interface, declaramos apenas um ponteiro para o arquivo XML gerado pelo Glade:



var
arquivo_glade : PGladeXML;



Em seguida, iniciamos normalmente a aplicação e criamos a interface a partir do XML. Utilizamos o Pchar para converter a string do caminho da interface:



begin
gtk_init(@argc, @argv);

//carrega arquivo glade
arquivo_glade := glade_xml_new( Pchar( '/arquivo.glade' ), nil, nil);

E, por fim, finalizamos a aplicação normalmente:

//iniciando loop
gtk_main();
end.



Se a interface criada contiver a definição da janela para ser mostrada normalmente, basta compilarmos o programa e executá-lo em seguida. Se nada aparecer, verifique se a propriedade “visível” da janela está marcada para “sim”:



$ fpc nome_do_programa_.pas
$ ./nome_do_programa



Olha só! Quem diria que ia ser tão fácil assim? Este artigo não abordou aspectos como sinais e callbacks, nem a utilização de bancos de dados. Eu apenas quis que o leitor despertasse a curiosidade e abrisse a mente para algo “novo” ou “não tão falado”. Essa mesma aplicação pode ser compilada sem problemas em plataformas que suportem o GTK sem a necessidade de se alterar uma linha sequer. Espero que o leitor tenha gostado e se anime a buscar mais informações sobre curiosidades e funcionalidades pouco conhecidas das linguagens de programação.



Gostou? Curta e Compartilhe!

Versão para impressão Enviar por email

Comentários

lançamento!

LM 119 | Backup e Restauração




Impressa esgotada
Comprar Digital  R$ 10,90 Digital

  1. Baixe o curso de shell script do Julio Cezar Neves

    Publicado em 07/04/2008 às 19:41 | 433833 leituras

  1. Soluti Certificação Digital em busca de especialista Linux

    Publicado em 19/04/2017 às 17:18 | 310201 leituras

  1. Seminário sobre gestão de privilégios do Linux dá direito a certificado CPE

    Publicado em 23/05/2017 às 10:35 | 225497 leituras

  1. Resultado do concurso "Por que eu mereço ganhar um netbook?"

    Publicado em 30/09/2009 às 3:00 | 184946 leituras

  1. Software público brasileiro na Linux Magazine Especial

    Publicado em 29/07/2011 às 15:07 | 163324 leituras

  1. Novell realiza lucros no seu primeiro trimestre fiscal de 2010

    Publicado em 26/02/2010 às 10:43 | 8014 leituras

  1. JavaFX 2.2 permite a criação de pacotes nativos

    Publicado em 19/06/2012 às 17:23 | 11019 leituras

  1. Sun premia brasileiros vencedores de concurso

    Publicado em 30/09/2008 às 14:10 | 7992 leituras

  1. A nova derivação do Nautilus

    Publicado em 06/08/2012 às 15:38 | 10241 leituras

  1. Google terá rede de cabos submarinos no Brasil

    Publicado em 10/10/2014 às 12:03 | 6014 leituras

whitepapers

mais whitepapers