Páginas

domingo, 24 de janeiro de 2010

Lazarus - Criando menus

Aplicação exemplo

Para exemplificarmos a construção de menus vamos criar uma nova aplicação. Nossa aplicação será um editor de textos usando o componente TMemo. Após iniciar a nova aplicação defina a propriedade Name do  form como  frmEditor, o Caption como Editor e salve tudo atribuindo à unit o nome u_editor e ao projeto o nome Editor.
Selecione um componente Memo na aba Standard e insira-o no  form. Defina a propriedade Name  como  mmEditor. Na propriedade  Align selecione  alClient, dessa forma o Memo ocupará toda a área do form. Acesse a propriedade Lines e exclua a linha que lá aparece. Na propriedade ScrollBars selecione ssAutoVertical. Assim, quando for digitado um texto maior do que o pode caber no Memo, a barra de rolagem vertical irá aparecer automaticamente.

O Editor de Menus

Vamos criar um menu com a seguinte estrutura:

Arquivo
    Sair
Visualizar
    Barra de ferramentas
Opções
    Cor do texto
    Cor do fundo
    Alinhamento
        Esquerda
        Centro
        Direita
Ajuda
    Sobre 

Para utilizar o Editor de Menus do Lazarus precisamos de um componente TMainMenu. Selecione esse componente na aba Standard e o insira no form em qualquer posição. O Lazarus se encarrega de posicionar
o menu no lugar correto, abaixo da barra de título. 
Para abrir o editor dê um duplo clique no MainMenu. Na propriedade Caption digite &Arquivo e na propriedade Name digite mnuArquivo. Isso define o primeiro item de menu. Clique com o botão direito no item recém-criado. Em seguida clique em Inserir novo item (depois), digite &Visualizar no Caption e mnuVisualizar em Name. Repita esses passos para os itens &Opções e A&juda. Agora clique com o botão direito no item Arquivo e clique em Criar Submenu. Digite Sai&r no Caption, e mnuSair em Name. Faça o mesmo nos itens seguintes. Quando quiser incluir novo item use a opção Inserir novo item (depois) ou Inserir novo item (antes). Clique com o botão direito em Alinhamento e escolha Criar Submenu. Inclua os itens conforme descrito na estrutura do menu acima. Seu form deve estar com esta aparência:

Teclas de atalho e hotkeys

Uma característica dos itens de menu é que eles podem conter uma letra sublinhada, chamada  hotkey. Esta letra é usada para selecionar o menu usando o teclado. Pressionando ALT mais a letra sublinhada seleciona-se o menu. Pressionando outra letra sublinhada envia-se o comando. As letras sublinhadas de cada item dentro de um submenu devem ser diferentes. Observe que durante a criação do nosso menu, definimos as letras sublinhadas inserindo um & antes da letra.
Outra característica padrão dos menus são as teclas de atalho. Quando aparece uma combinação de teclas no lado direito do item de menu, significa que você pode usar essa combinação para executar o comando. Essa  característica oferece a maneira mais rápida de executar um comando.
Para associar teclas de atalho a um item de menu é muito fácil. No Editor de Menus simplesmente escolha uma combinação de teclas na propriedade ShortCut do item. Vamos fazer isso para as opções: Esquerda, Centro e Direita do item de menu Alinhamento. Selecione a opção Esquerda e na propriedade ShortCut selecione a combinação CTRL + E. Para a opção Centro selecione CTRL + C e para a opção Direita selecione CTRL + D. Veja a figura abaixo:

Respondendo aos comandos do menu

Vamos inserir o componente TColorDialog da aba Dialogs na nossa aplicação. Esse componente é uma janela onde podemos selecionar um cor. Mude a propriedade Name desse componente para dlgCores. Usaremos esse componente para mudar as cores do texto e do fundo do nosso editor. Dessa forma quando selecionarmos a opção Cor do texto ou Cor do fundo no menu Opções, a caixa de diálogo de cores será aberta e poderemos selecionar uma nova cor. Clique então em Cor do texto. O editor de código será aberto no método do evento OnClick dessa opção e digite o seguinte código:

dlgCores.Color := mmEditor.Font.Color;
if dlgCores.Execute then
      mmEditor.Font.Color := dlgCores.Color;

A primeira linha do código define que a cor selecionada no ColorDialog será a mesma do texto do Memo. Na linha seguinte definine-se que, se o usuário clicar OK no ColorDialog, a cor selecionada será atribuída à propriedade Color de Font do Memo. Compile e execute o programa. Digite um texto e mude sua cor usando a opção Cor do texto.
No evento OnClick da opção Cor do fundo digite o seguinte código:


dlgCores.Color := mmEditor.Color;
if dlgCores.Execute then
      mmEditor.Color := dlgCores.Color;

Este código é semelhante ao código de Cor do texto, mas neste caso mudamos a propriedade Color do Memo, que significa mudar a cor do fundo.

No grupo de Alinhamento, usaremos as opções para alinhar o texto à esquerda, à direita ou centralizar. Além disso queremos que a opção de menu que estiver selecionada fique marcada. Clique então na opção Esquerda. Digite o seguinte código no método que foi aberto:

mmEditor.Alignment := taLeftJustify;
mnuEsquerda.Checked := True;
mnuCentro.Checked := False;
mnuDireita.Checked := False;

A primeira linha define o alinhamento do texto no Memo. As três linhas seguintes definem qual opção de menu está selecionada. Vamos definir o código para OnClick de Centro:

mmEditor.Alignment := taCenter;
mnuEsquerda.Checked := False;
mnuCentro.Checked := True;
mnuDireita.Checked := False;

E para o evento OnClick de Direita:

mmEditor.Alignment := taRightJustify;
mnuEsquerda.Checked := False;
mnuCentro.Checked := False;
mnuDireita.Checked := True;

Chamadas a forms

Com certeza suas aplicações sempre terão muitos forms. Existe um form principal (main) que faz chamadas a outros forms. A maneira de fazer chamadas a outros forms será estudada agora. Vamos criar um novo form na nossa aplicação. Esta nova janela será o nosso Sobre (About). Para incluir um novo form selecione no menu Arquivo -> Novo formulário. Ou utilize o botão correspondente na barra de ferramentas. Neste novo form defina Caption como Sobre. Na propriedade Name informe frmSobre. Salve-o e escolha u_sobre para nome da unit. Você é livre para criar o Sobre da maneira que preferir. Mas no nosso exemplo vamos inserir um rótulo (TLabel) onde definimos o Caption como Programa desenvolvido por Carlos Araújo apenas para fins didáticos. Deixe a propriedade Width como 220 e WordWrap como True. A propriedade WordWrap define se o Caption permite quebra de linha. Inclua mais um rótulo e defina o Caption como Versão 1.0. Inclua um botão do tipo TBitBtn da paleta Additional e defina Name como btnFechar e Kind como bkClose.

 

Este botão não precisa de código no evento OnClick. A propridade Kind define a função do botão.
Agora que Sobre estrá pronto queremos que nossa aplicação mostre-o quando o usuário selecionar o menu Ajuda -> Sobre. Para efetivarmos isso precisamos primeiramente informar à unit u_editor que ela usará a unit u_sobre. Isto é feito digitando o seguinte código logo abaixo da seção implementation de u_editor:

uses u_sobre;

Agora u_editor tem acesso a tudo que é público em u_sobre. Há duas maneiras de fazer chamadas a forms:
  • Modal - o foco fica preso ao form e não é liberado até que este seja fechado. O usuário pode ativar qualquer outra aplicação, mas não pode ativar outra janela da aplicação cuja janela foi aberta como modal. Para ativar esse modo chame o form usando o método ShowModal.
  • Não modal  - o foco pode ser transferido para outra janela sem que esta precise ser fechada. Para ativar esse modo chame o  form usando o método Show.

Agora selecione o evento OnClick do comando Ajuda -> Sobre e digite o seguinte código:

frmSobre.ShowModal;

Selecione o evento OnClick do comando Arquivo -> Sair e digite Close no editor. Execute o programa e clique em Ajuda -> Sobre. Observe que você não pode fazer nada no programa sem que o form Sobre seja fechado. Confirme o funcionamento correto das outras opções do menu. Digite um texto no Memo e teste alterações de cores e alinhamento.
No próximo post mostraremos como criar barras de ferramentas, de status e menus locais (pop-ups).

domingo, 17 de janeiro de 2010

Lazarus - Explorando os Componentes Básicos (Parte III)

Entrando múltiplas linhas

Vimos antes, que o componente TEdit permite a entrada de uma única linha de texto. Para possibilitar a entrada de mais de uma linha de texto usaremos o componente memorando (TMemo). Selecione o componente Memo da paleta Standard e o insira no form dentro de um GroupBox, como mostrado na figura abaixo.
Usaremos este componente para mostrar todos os dados pessoais cadastrados quando for pressionado o botão correspondente. Assim, precisamos modificar algumas propriedades de Memo.
  • Align - alClient. Para o Memo preencher todo o GroupBox, onde ele está contido.
  • Lines - clique no botão elipse e apague o conteúdo.
  • Name - mmDadosPessoais.
  • ReadOnly - True. Define que o usuário não pode editar o conteúdo do controle.

Juntando tudo

Insira um novo botão no  form. Esse botão, quando pressionado, mostrará os dados pessoais no campo Memo. Defina a propriedade Caption como Mostrar, Default como True e Name como btnMostrar
A definição da propriedade Default como True indica que, se o usuário pressionar a tecla Enter, o evento OnClick será executado.
Agora iremos escrever o código que fará todo o trabalho para nós.
Como vimos no nosso primeiro programa, se queremos que a ação aconteça quando pressionarmos o botão, então deveremos programar o evento OnClick do botão. Dê um duplo clique no botão e o editor de código será aberto para inserirmos o código.
Vamos analisar cada linha do código mostrado na figura acima. A linha 52 é responsável por deletar as linhas do memorando. Dessa forma toda vez que inserirmos os dados de uma nova pessoa e pressionarmos o botão btnMostrar, os dados anteriores são apagados. Observe que, para chamar um método de um componente, informamos o nome do componente seguido do nome do método separados por ponto.
A propriedade  Lines do componente  Memo é um objeto do tipo  TStrings, portanto possui propriedades e métodos. Dos métodos disponíveis de Lines usaremos Add, para adicionar novas linhas ao texto do controle.
Na linha 53 do código o nome da pessoa é adicionada ao texto. Observe a forma de invocarmos o método Add. Add é um método de Lines, e Lines é uma propriedade de mmDados. O argumento do método deve ser uma string. Como argumento usamos um literal, que identifica o dado da linha de texto, concatenado ao
nome da pessoa, que é dado pela propriedade Text  do componente edNome. A linha 54 é semelhante à 53, não merece maiores comentários.
A profissão da pessoa é adicionada na linha 55. As  profissões estão na propriedade Items de lbxProfissao. O índice do elemento selecionado no ListBox é dado pela propriedade ItemIndexItems  pode ser tratado como um vetor indexado por ItemIndex. Por isso a linha 55 é escrita dessa forma.
Na linha 56 adicionamos a idade da pessoa, definida pela propriedade Position de ScrollBar. Position é uma propriedade numérica do tipo integer. Antes de concatenar seu valor é necessário convertê-lo para string. Por isso usamos a função IntToStr(), para converter um número inteiro para string.
A linha 57 pode ser analisada de forma semelhante à linha 55. Portanto não será necessário acrescentar nenhum comentário a respeito.
No caso da linha 58 e seguintes, é o que se faz necessário para mostrar o sexo da pessoa. Como a propriedade Checked do componente CheckBox é boolean, usamos isso para implementar uma estrutura de decisão. Se Checked estiver marcado (True) então será mostrada situação ativo, caso contrário será mostrada situação inativa.
Bem, esse é um programa didático. Foi usado apenas para apresentar alguns componentes. Logo iniciaremos uma nova série de posts para apresentar mais recursos dessa poderosa ferramenta.

sexta-feira, 15 de janeiro de 2010

Lazarus - Explorando os Componentes Básicos (Parte II)

Escolhendo opções

Há dois controles que permitem ao usuário escolher diferentes opções. O primeiro é a caixa de verificação (TCheckBox), que corresponde a uma opção que pode ser selecionada livremente. O segundo controle é o botão de rádio (TRadioButton), que corresponde a uma seleção exclusiva. Por exemplo, se você tiver dois botões de rádio com rótulos A e B, você pode selecionar um dos dois, mas não ambos ao mesmo tempo. A outra característica é que a escolha de uma das opções é obrigatória. Selecione uma caixa de verificação na paleta Standard e insira-o no form. Usaremos a caixa de verificação para definir a situação cadastral da pessoa - pode assumir a situação Ativo, se a caixa estiver marcada e Não ativo, caso contrário.

Vamos alterar as propriedades da caixa de verificação:
  • Caption - digite Ativo.
  • Checked - defina como True. Especifica que o controle estará marcado por padrão.
  • Name - chxSituacao.

Vamos inserir um componente para selecionarmos o sexo da pessoa que está sendo cadastrada. Nesse caso precisamos de um componente que possibilite mais opções. Usaremos então o grupo de botões de rádio (TRadioGroup). Grupo de botões de rádio permite que sejam inseridos vários botões, cada um com uma opção. Selecione o grupo de botões de rádio da paleta Standard e o insira no form.

Defina as propriedades do grupo de botões da seguinte forma:
  • Caption - Sexo.
  • ItemIndex - 0. Define o item do grupo de botões que será selecionado por padrão (o primeiro item é 0).
  • Items - Masculino/Feminino. Lista de opções do grupo de botões.
  • Name - rgSexo.
Para definir a lista de opções, clique no botão elipse no lado direito da propriedade Items no Inspetor de Objetos. Será aberto o editor de String List. Digite uma opção em cada linha e confirme pressionando o botão Ok. A propriedade Items é do tipo TStrings e será utilizada em outros componentes, com o mesmo nome ou não. Observe que o Lazarus tem uma linha azul que indica se os controles estão alinhados.

Uma lista com muitas opções

Se você precisar de muitas opções os botões de rádio não são apropriados, a menos que você tenha um  form realmente grande. Não se deve usar mais que 5 ou 6 botões de rádio. A solução é usar caixas de lista (TListBox). Uma caixa de lista pode manter um grande número de opções em um pequeno espaço, pois ela tem uma barra de rolagem para mostrar na tela apenas uma pequena parte da lista completa. Outra vantagem é que podemos facilmente adicionar ou remover elementos da lista. Caixas de lista também podem permitir uma única escolha ou múltiplas escolhas.
A caixa de lista usada em nossa aplicação servirá para a definição da profissão do cadastro de dados pessoais. Selecione um TGroupBox da paleta Standard e o insira no form conforme a figura mostrada a seguir. Defina a propriedade Caption dessa caixa como Profissão. Agora coloque uma caixa de lista dentro desta caixa.
Defina as propriedades da caixa de lista assim:
  • Align - alClient. Define o alinhamento do controle. Neste caso a caixa de lista é alinhada para preencher exatamente o controle onde está contida.
  • ItemIndex - 0. Define que item será selecionado por padrão.
  • Items - Carpinteiro/Analaista de Sistemas/Arquiteto/Enfermeira/Engenheiro/Pedreiro e outras que você preferir. Para informar as opções o procedimento é semelhante ao que foi feito na propriedade Items de TRadioGroup.
  • Name - lbxProfissao.
  • Sorted - True. Define que os elementos da lista serão ordenados.

Muitas opções em pouco espaço

Caixas de lista ocupam muito espaço na tela e suas opções são fixas, não dando ao usuário a oportunidade e escolher uma opção diferente daquelas previamente programadas. 
Podemos solucionar essas dificuldades usando caixas combinadas (TComboBox). Uma caixa combinada reúne em um mesmo controle uma caixa de edição, onde se pode digitar algum texto, e uma caixa de lista que é aberta quando pressionamos a seta. O próprio nome do controle sugere que ele é a combinação de dois
componentes, um Edit e um ListBox. No entanto, o comportamento do ComboBox pode mudar,  dependendo do valor da propriedade  Style. Veremos um pouco mais adiante como definir corretamente esta propriedade para que o componente tenha o comportamento desejado.
Vamos usar uma caixa combinada para definir a escolaridade no cadastro de dados pessoais. Selecione o componente na paleta Standard e o posicione no  form conforme a figura. Coloque um rótulo também para identificar a caixa. No rótulo defina a propriedade Caption como Escolaridade.

Defina as seguintes propriedades:
  • Name - cbxEscolaridade.
  • Sorted - True. Define que os elementos da lista estarão ordenadas.
  • Style - csDropDown. Define o estilo de apresentação da caixa. Neste caso a caixa permite a escolha de uma opção e também a edição de uma nova opção. csDropDownList não permite edição, mas podem ser digitados caracteres que posicionam na primeira opção que inicie com os caracteres digitados.
Escolhendo um valor de um intervalo

Vamos explorar agora o controle chamado barra de rolagem (TScrollBar). Barras de rolagem são normalmente associados com outros componentes, tais como caixas de lista. Nesses casos a barra de rolagem é  parte do componente, uma propriedade sua.
Iremos usar a barra de rolagem para definir a idade da pessoa no cadastro. 
Selecione então uma barra de rolagem na paleta Standard e o insira no  form conforme é mostrado na figura abaixo. Coloque um rótulo para identificar o componente.

Vamos alterar as seguintes propriedades do componente:
  • LargeChange - 10. Especifica o quanto Position varia quando clicamos nso lados da barra.
  • Max - 100. Especifica o valor máximo de Position.
  • Min - 1. Especifica o valor mínimo de Position.
  • Name - sbIdade.
  • Position - 1. Define a posição atual da barra.
  • SmallChange - 1. Especifica o quanto Position varia quando clicamos nas setas.
No rótulo que foi inserido defina a propriedade Caption como Idade.
No próximo post concluiremos este programa.

terça-feira, 12 de janeiro de 2010

Lazarus - Explorando os Componentes Básicos (Parte I)

Agora que já conhecemos um pouco o ambiente Lazarus, já entendemos a estrutura de uma aplicação, já criamos um pequeno programa, estamos prontos para ir para a parte principal do ambiente de programação:  o uso de componentes. Esta é a característica chave deste ambiente: programação visual usando componentes.
O sistema vem com uma série de componentes prontos para uso. Não serão descritos aqui todos os componentes em detalhes com suas propriedades, métodos e eventos. Mas será suficiente para que você possa explorar os demais objetos. Neste capítulo usaremos exemplos bastante simples para focar em apenas algumas características mais importantes.
Iniciaremos dando destaque a um grupo de componentes básicos, tais como botões, rótulos, caixas de listas, campos de edição e outros controles relacionados. A maioria dos componentes que são discutidos neste capítulo está presente na aba Standard da paleta de componentes.
Vamos então criar uma nova aplicação. Selecione o menu Arquivo e em seguida em Novo. Na janela clique em Aplicação que está sob o grupo Projeto. Será criado um novo projeto e um novo form.
Vamos então salvar nosso projeto para atribuir nomes aos arquivos. Clique em Salvar Tudo no menu Arquivo. Inicialmente é solicitado o nome da unit. Vamos salvá-la com o nome u_exemplo. Em seguida é pedido o nome do projeto. Digite Exemplo e confirme. Para definir um ícone para a aplicação selecione Opções de Projeto no menu Projeto. Na aba Aplicação clique em Carregar Icone. Escolha o ícone apropriado e confirme.
Nosso programa consistirá de um cadastro de dados pessoais: nome, idade, profissão, escolaridade, sexo e situação cadastral.

Propriedades de form

Vamos modificar as seguintes propriedades do form no Inspetor de Objetos.

  • biMaximize em BorderIcons - coloque em False. Isso evita que o form seja maximizado.
  • BorderStyle - defina como bsSingle. Para evitar o redimensionamento da janela.
  • Caption - informe Exemplo.
  • Height - defina como 480. Altura da janela.
  • Name - defina como frmExemplo.
  • Position - defina como poScreenCenter. Para centralizar a janela na tela do monitor.
  • Witdh - defina como 640. Largura da janela.
Para modificar a propriedade biMaximize clique no sinal de + à esquerda de BorderIcons para expandir suas subpropriedades.

Usando um Botão

O Lazarus disponibiliza alguns tipos de botão. Vamos selecionar o botão (TButton) da paleta Standard e posicioná-lo no form.

Vamos alterar as propriedades do botão:
  • Caption - defina como &Fechar. É a legenda do botão. O & define um atalho para o caso de querer usar o teclado em vez do mouse. Neste caso se você pressionar F será o mesmo que clicar no botão.
  • Name - defina como btnFechar. A propriedade Name em qualquer componente define o identificador desse componente.
Bem, queremos que nosso form seja fechado quando pressionarmos neste botão. Para fazermos isso precisamos escrever algum código. Esse código será escrito para o evento OnClick do botão. Ou seja, queremos que o form seja fechado quando clicarmos no botão. Dê um duplo clique no botão. O editor de código será aberto no procedimento que está associado com o evento. Digite o seguinte código:

Close;

Como desejamos que o  form seja fechado quando clicarmos no botão, isso representa uma ação a ser realizada pelo  form. Portanto devemos usar um método que tenha esse comportamento, por isso escolhemos o método  Close. Close é o método de form que causa o seu fechamento.
Compile e execute o programa. Agora o form pode ser fechado usando o botão padrão do Windows ou o botão que programamos.

Aceitando dados do usuário

Já vimos que o usuário pode interagir com uma aplicação usando o mouse, ou o teclado em vez do mouse para selecionar um botão pressionando a tecla correspondente à letra sublinhada no Caption.
Além desses casos, o Windows pode manipular entrada do teclado diretamente. O Lazarus oferece uma série de controles para construir campos de edição e editores de texto. Dentre esses vamos utilizar o componente campo de edição (TEdit) da paleta Standard. Este componente permite que o usuário digite apenas uma linha de texto. Mais adiante usaremos um componente que possibilita a entrada de mais de uma linha. Selecione então esse componente e insira-o no form.
Esse primeiro campo de edição que estamos inserindo será utilizado para entrada do nome da pessoa em nosso cadastro de dados pessoais.

Da mesma forma que procedemos com o botão e o form iremos alterar as propriedades desse componente.
  • Name - defina como edNome.
  • Width - defina como 400.
  • Text - apague o conteúdo dessa propriedade. Na verdade esta propriedade irá retornar o conteúdo do campo que for digitado pelo usuário do programa. 

Identificando controles

Rótulos são apenas texto, ou comentários, escritos em um  form. Geralmente o usuário não interage com rótulos - pelo menos não diretamente. Não faz muito sentido clicar em um rótulo, embora no Lazarus isso seja tecnicamente possível.
Usamos rótulos para descrever outros componentes, tais como campos de edição e caixas de lista ou combo, pois eles não têm legenda. O Lazarus implementa rótulos como componentes gráficos, não ajanelados.
Vamos então inserir um rótulo no nosso  form. Selecione o rótulo (TLabel) na paleta Standard e insira-o ao lado esquerdo do campo de edição conforme mostrado na figura seguinte.


Vamos alterar suas propriedades conforme o seguinte:
  • Caption - &Nome.
  • FocusControl - edNome. Define qual componente receberá o foco quando for selecionada a tecla de atalho definida no Caption.
  • Name - lblNome.

Tenha em mente que nos referimos apenas nas propriedades que são necessárias para a nossa aplicação. Certamente vamos necessitar usar outras em diferentes programas. Vamos continuar explorando os componentes no próximo post.

terça-feira, 5 de janeiro de 2010

Lazarus - Entendendo os Arquivos do Projeto

Em um post anterior vimos como criar uma aplicação simples. Aprendemos como alterar propriedades usando o Inspetor de Objetos e como escrever um método para responder a eventos. Vimos como compilar e executar o programa. Agora vamos estudar mais alguns recursos do Lazarus.
Para prosseguir em nosso estudo vamos usar o programa AloMundo criado anteriormente. Clique no botão Abrir ou pressione CTRL + O. Selecione o projeto AloMundo e confirme.

Alterando propriedades em tempo de execução

Dificilmente um programa pode ser escrito sem que seja necessário alterar propriedades dos componentes em tempo de execução, ou seja, através de código. Por exemplo, queremos mudar a propriedade Caption do botão btnAloMundo para Diga alô de novo depois que o usuário clicar nele pela primeira vez. Será necessário mudar a largura - propriedade Width - do botão para 100, para caber o novo Caption. Vamos alterar o código do procedimento btnAloMundoClick como mostrado na figura.
Desta forma se quisermos mudar o valor de uma propriedade em tempo de execução, utiliza-se um comando de atribuição normalmente. Muitas propriedades podem ser alteradas em tempo de execução e outras podem ser alteradas apenas em tempo de execução. Aquelas que só podem ser alteradas em tempo de execução não são listadas no  Inspetor de Objetos. Algumas dessas propriedades de tempo de execução são definidas como apenas leitura, o que significa que você pode ler seu valor, mas não pode alterá-lo.

Adicionando mais código ao programa

Vamos centralizar o botão no form. Clique em btnAloMundo com o botão direito do mouse. Clique em Alinhamento. Marque Centralizar na janela nas duas colunas e confirme. Agora o botão está centralizado, mas há um probleminha. O botão não permanece centralizado quando redimensionamos o form. Isto pode ser resolvido de duas formas.
Uma solução é mudar o estilo da borda do form de modo que ele não possa ser redimensionado em tempo de execução. Para isso selecione o form e localize a propriedade BorderStyle. Mude para bsSingle. Isso evita que o usuáro mude as dimensões do formulário. Outra abordagem é escrever um código que faça o botão se mover para o centro sempre que o form for redimensionado. Embora pareça que grande parte do trabalho do programador em Lazarus seja selecionar opções e componentes visuais, tem um momento em que é necessário escrever código. Quanto mais experiente você fica, mais código tem que escrever.
Quando precisamos adicionar código ao programa, a primeira pergunta a ser respondida é: Onde? Em uma linguagem orientada a eventos, em geral, o código é executado em resposta a um evento. Neste caso queremos que nosso programa execute um código quando o form for redimensionado. O evento que ocorre nessa situação é OnResize. Para programá-lo, selecione o o form e a aba Eventos do Inspetor de Objetos. Localize o evento OnResize e dê um duplo clique à direita do nome. Um novo procedimento é adicionado ao editor de código. Digite então o seguinte código:
Lembre de retornar a propriedade BorderStyle para bsSizeable antes de executar o programa. Para determinar as propriedades Top e Left do botão - isto é, a posição do seu canto superior esquerdo - o programa calcula o centro da página, dividindo a altura e a largura interna ou área cliente da página por 2, e então subtrai metade da altura (Height) e da largura (Wdith) do botão. Execute o programa e redimensione o form para ver o que acontece com o botão.

Uma ferramenta de mão dupla

No exemplo que criamos até aqui escrevemos códigos para responder a eventos. Cada porção de código é parte de um procedimento diferente. O código fonte de um form é escrito em uma unit em FreePascal, nesse caso na unit u_alomundo.pas. O código aumenta não apenas quando escrevemos código para eventos, mas também quando adicionamos componentes ao form. As definições de propriedades e eventos do form e dos componentes adicionados são adicionados em um segundo arquivo denominado, nesse caso, u_alomundo.lfm.
O Lazarus pode ser definido como uma ferramenta de mão dupla, pois tudo que é feito no ambiente visual gera algum código. O desenvolvedor tem acesso total ao código gerado, e mesmo parecendo bastante complexo às vezes, é possível alterá-lo. Até se tornar um programador fluente em Lazarus, você pode continuar fazendo tudo visualmente.
Quando você altera o código dos componentes, isso se reflete visualmente no form. Só é preciso tomar algum cuidado.

Analisando o código fonte

Sempre que iniciamos um novo form o Lazarus tem uma unit com um código fonte associado como mostra a figura abaixo.


A unit usa (uses) algumas units que contém bibliotecas de procedimentos de funções do FreePascal. Também define uma nova classe. A nova classe é TForm1 e é derivada de TForm. Define também uma nova instância dessa classe: Form1.
Units são módulos nos quais uma aplicação é dividida. Quando iniciamos um novo projeto, o Lazarus gera um módulo program e uma unit que define o form principal. A cada vez que adicionamos um novo form ao programa, uma unit é adicionada. Por padrão as units tem extensão .PAS, os arquivos program tem a extensão .LPR e os arquivos de descrição de form tem extensão .LFM.
Assim que adiconamos novos componentes a declaração da classe form muda. Por exemplo, quando você adiciona um botão ao form, a parte do código fonte que define novos tipos de dados torna-se o seguinte:



Agora se a propriedade Name do botão from mudada para btnAloMundo, o código muda para:



A alteração de outras propriedades de um componente não modifica o código fonte da unit. As propriedades de form e seus componentes são armazenados em um arquivo de descrição de form com a extensão .LFM.
Adicionar código para tratar eventos causa maiores modificações no código fonte. Sempre que um novo manipulador de eventos é definido, uma nova linha é adicionada à definição de tipo de dado do form, um corpo de método vazio é inserido na implementation, e alguma informação é armazenada no arquivo de descrição do form.



A descrição textual do form

Como vimos anteriormente o arquivo com extensão .LFM tem a descrição textual do form. Podemos visualizar e até alterar usando o editor. Para abrir clique com o botão direito no form e selecione a opção Mostrar Fonte (.lfm). Outra forma é simplesmente usando a opção Abrir do menu Arquivo. Vamos dar uma olhada nesse arquivo para entender o que é armazenado nele.



Como podemos observar o arquivo contém descrição de objetos. O primeiro deles é o form frmAloMundo, com suas propriedades. Um dos atributos de frmAloMundo é o botão btnAloMundo. Note também que podem existir conexões entre os eventos e procedimentos - neste caso o OnClick do botão. Procure não editar esse arquivo. Tudo que precisamos fazer é feito visualmente no form e é mais seguro.

Arquivo de Projeto

Quando iniciamos uma nova aplicação, além dos dois arquivos detalhados antes, o Lazarus cria automaticamente o arquivo de projeto - com a extensão .LPR. Raramente precisamos alterá-lo. Só modifique esse arquivo se você tiver certeza do que está fazendo. Faça uma cópia de toda a aplicação antes de modificá-lo para poder retornar se algo sair errado. Quando você compila a aplicação o Lazarus gera um executável com o mesmo nome do arquivo .LPR. Esse é o arquivo principal, o program. Se você observar esse arquivo verá que ai são criados os forms e executada a aplicação.
 
Creative Commons License
This work by Carlos Alberto P. Araújo is licensed under a Creative Commons Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil License.