Curso de Delphi
1. IntroduçãoProgramar em Windows sempre foi algo extremamente complicado e acessível apenas a programadores dispostos a investir muito tempo e fosfato na leitura de pilhas de livros, intermináveis testes e análise de programas exemplos que mais confundem do que explicam. Mas porque é tão difícil fazer programas para Windows? Para começar, o Windows usa o conceito de GUI (Graphics User Interface), que embora seja muito familiar para usuários do Unix, é novidade para usuários do DOS. O uso de um sistema GUI implica em aprender vários conceitos que são estranhos ao usuário de um sistema baseado em texto como o DOS. Para complicar um pouco mais, o Windows é um sistema multi-tarefa, e as aplicações são orientadas a eventos, o que implica em aprender um novo estilo de programação. Finalmente, o programador tinha que ter alguma familiaridade com as centenas de funções oferecidas pela API do Windows. Por tudo isso, programação em Windows é um assunto que costuma provocar arrepios nos programadores.
Felizmente as linguagens visuais chegaram para mudar esta situação. Foi só com elas que o Windows consegui cumprir sua promessa de ser um sistema amigável e fácil de usar também para os programadores, que sempre tiveram que pagar a conta da facilidade de uso para o usuário.
Entre as linguagens visuais que surgiram, nenhuma veio tão completa e acabada quanto o Delphi. O Delphi vem com um compilador capaz de gerar código diretamente executável pelo Windows, proporcionando uma velocidade de execução de 5 a 20 vezes maior que as linguagens interpretadas. Além disso, vem também com um gerenciador de banco de dados completo e um gerador de relatórios. O tempo de desenvolvimento de qualquer sistema é reduzido a uma fração do tempo que seria necessário usando outras linguagens e o resultado é sempre muito melhor. É por isso que o Delphi fez tanto sucesso no mundo inteiro
2. Conceitos básicos
Programação em Windows: Janelas e eventosExistem muitas diferenças entre a programação em DOS e a programação em Windows. Vejamos a principal: Quando programamos em DOS, nosso programa é responsável pelo fluxo de processamento. Temos que definir claramente não só que instruções, mas também em que ordem devem ser executadas. Em Windows não é bem assim. Nosso programa não controla o fluxo de processamento, ele responde e trata eventos que ocorrem no sistema. Existem muitos eventos que podem ocorrer, sendo que os principais são aqueles gerados pelo usuário através do mouse e do teclado. A coisa acontece mais ou menos assim: O usuário clica o mouse e o Windows verifica que aplicação estava debaixo do mouse no momento em que foi clicado. Em seguida ele manda uma mensagem para a aplicação informando que ocorreu um clique e as coordenadas do cursor do mouse na tela no momento do clique. A aplicação então responde à mensagem executando uma função de acordo com a posição do mouse na tela. É claro que o Delphi toma conta do serviço mais pesado e facilita muito as coisas para o programador. Detalhes como as coodenadas da tela em que ocorreu o clique, embora estejam disponíveis, dificilmente são necessários nos programas.
Programação Orientada a Objeto (POO)Embora não seja objetivo deste curso ensinar POO, uma breve introdução é necessária, já que o Delphi é essencialmente orientado a objeto.
De maneira prática, podemos pensar no objeto sendo uma estrutura que agrupa dados e funções para manipular estes dados. Como as funções são sempre “íntimas” dos dados, o sistema todo funciona de maneira mais segura e confiável. Além disso, a POO utiliza conceitos como encapsulamento e herança que facilitam muito programação e manutenção dos programas.
Neste ponto é oportuno citar que os dados de um objeto costumam ser chamados de variáveis de instância e as funçoes de métodos. As variáveis de instância definem as propriedades (as vezes chamada de atributos) do objeto e os métodos definem seu comportamento.
Encapsulamento - Como as variáveis e métodos estão na mesma estrutura, pode-se pensar em variáveis e métodos privados, ou seja, dados e funções que só podem ser manipulados pelas funções que estão dentro da estrutura. Desta maneira é possível formar uma camada protetora nos dados e evitar atribuições desastradas que comprometeriam o funcionamento do programa. Os defensores mais ortodoxos da POO dizem que todos os dados de um objeto deveriam ser privados e o número de funções públicas deve ser o menor possível, mas isso nem sempre é viável ou prático. O Delphi implementa este conceito e oferece dados/funções publicas (public) e privadas (private). Outra consequência do encapsulamento é que os objetos podem ser “caixas pretas”. Não é necessário (teoricamente) conhecer detalhes de funcionamento de um objeto para usá-lo, basta enviar as mensagens apropriadas que ele responde com a ação desejada.
Classes - A classe representa um tipo ou categoria de objetos, o modelo a partir do qual um objeto pode ser construído. É a estrutura propriamente dita, que define os dados e métodos daquela classe de objetos. O objeto em si, é uma instância da classe. Na programação estruturada podemos fazer uma analogia com os tipos e variáveis, onde a classe equivale ao tipo e o objeto à variavel desse tipo.
Herança - É a capacidade que uma classe de objetos tem de herdar variáveis e métodos de outra classe. Esta capacidade permite que o código já escrito seja reutilizado de maneira muito mais eficiente e simples do que na programação estruturada. Um programa orientado a objeto costuma implementar verdadeiras árvores genealógicas de classes, com vários níveis de herança.
Para programar no nível do designer (veja adiante o que significa) não é necessário um conhecimento profundo de POO. Mas é preciso conhecer pelo menos a sintaxe. Todas as aplicações para Windows, precisam de pelo menos uma janela, que no Delphi é chamada de Form. Cada form (assim como todos os objetos visuais) tem um objeto associado a ele e sua representação visual, que vemos na tela. Todos os componentes que incluímos no form, passam a fazer parte do objeto que define o form. Exemplo: Se colocarmos um botão no form, a classe deste form será modificada para incluir este botão. Os eventos e métodos deste form, também estão na classe. Assim, supondo que o form se chame Form1 (nome default), para por exemplo desativar o botão que incluímos (de nome Buttom1) escreveríamos:
- Código:
-
Form1.Buttom1.Enabled := false;
Note como o Buttom1 faz parte da estrutura que define o form. Mas se quisermos ativar método RePaint (Repintar) do form faríamos:
- Código:
-
Form1.Repaint;
Veja que Repaint, não é uma variável, tecnicamente é uma procedure, mas fazemos referência a ela como parte da estrutura Form1. Pode parecer confuso no início, mas facilita muito a programação.
3. O ambiente do DelphiO Delphi oferece dois níveis de programação distintos. Existe o nível do que o manual chama de designer, que se utiliza dos recursos de programação visual e aproveita componentes prontos, e o nível do component writer, que escreve os componentes para o designer utilizar nas aplicações. Podemos dizer que o component writer programa em um nível mais baixo e o designer em um nível mais alto. Para este curso, consideraremos a programação no nível do designer.
Quando ativamos o Delphi, a tela inicial é parecida com a figura 1. Na janela superior, temos a barra do menú principal do Delphi, à esquerda a SpeedBar, com as opções mais comuns e à direita a paleta de componentes. Estes componentes são a base da programação visual e é onde o designer vai buscar recursos para sua aplicação.
Abaixo da SpeedBar, está a janela do Object Inspector, que permite visualizar e modificar as propriedades e eventos de todos os componentes. É também largamente utilizado pelo designer. Abaixo da paleta ficam a janela de código-fonte e as janelas que estão sendo construídas.
Primeiro contatoPara iniciarmos poderíamos criar a versão Delphi do famoso “Hello Word”, mas vamos partir para alguma coisa um pouco mais interessante e aproveitar para apresentar uma propriedade que pode ser útil no futuro. Como os programas em Windows são orientados a eventos é comum desativar opções de menús e botões, até que o usuário ative as opções que o sistema precisa para inicializar. Neste primeiro programa, vamos criar uma espécie de gangorra eletrônica. Mas antes de começar, vejamos o que está acontecendo no Delphi.
Se a tela está parecida com a figura 1, então não há nenhum projeto selecionado e o Delphi tomou a liberdade de criar um novo projeto para você, chamando-o de Project1. Um projeto é a coleção de arquivos necessários para compilar o sistema. Como toda aplicação precisa de pelo menos um form (Form1), ele também foi criado. Finalmente, todo form tem uma Unit correspondente que é mostrada no Editor de Código (Unit1).
Não há problema em utilizar esse projeto inicial que é oferecido pelo Delphi, mas é uma boa idéia renomear e salvar o projeto o quanto antes. Se você não escolher outro diretório, o projeto será salvo no diretório do Delphi e não é aconselhável salvar todos os seus projetos no mesmo diretório. Portanto vamos começar este programa criando um novo diretório para ele. Após isso, vamos seguir os seguintes passos:
1. Selecione a página Standard na paleta de componentes e clique no componente Buttom. A seguir clique no form. Um botão deve aparecer no form. Coloque mais dois botões.
2. Alinhe na horizontal os dois primeiros e coloque o terceiro logo abaixo dos dois. Se quizer um alinhamento exato, use a opção Edit/Align... do menú. Para marcar mais de um componente, deixe o Shift pressionado enquanto clica os componentes. Brinque um pouco com o tamanho dos botões e do form.
3. Clique o primeiro botão para selecioná-lo, a seguir procure no Object Inspector a propriedade Caption. Mude a string para “
ON”. Para o segundo botão a string é “
OFF” e para o terceiro “
Close”. Para o segundo botão, mude a propriedade Enabled para False.
4. Neste ponto é uma boa idéia renomear e salvar o projeto. Escolha a opção File/Save project as...Selecione o diretório criado para o projeto e use o nome Main.pas para a unit1 e
Gangorra para o projeto.
5. Clique a área pontilhada do form e em seguida ache a propriedade Caption no OI. Mude a string para “
Gangorra”. Aproveite e mude a propriedade Name para “
fmMain”.
6. Dê um clique duplo sobre o primeiro botão. A janela de código será ativada já com a função correspondente ao evento OnClick criada e posicionada sob o cursor. Digite o seguinte código:
- Código:
-
Button1.Caption := ‘OFF’;
Button1.Enabled := False;
Button2.Caption := ‘ON’;
Button2.Enabled := True;
7. Selecione a janela do form e faça o mesmo com o segundo botão, mas o código fica invertido:
- Código:
-
Button2.Caption := ‘OFF’;
Button2.Enabled := False;
Button1.Caption := ‘ON’;
Button1.Enabled := True;
8. Finalmente para o terceiro botão o código é simplesmente:
- Código:
-
Close;
9. Já podemos executar o programa pressionando F9.
O que está acontecendo:O evento OnClick ocorre sempre que clicamos o mouse sobre um componente. O Delphi se encarrega de determinar qual é o componente que deve responder ao evento e direciona o evento para ele. Neste caso, usamos este evento para ativar/desativar botões manipulando a propriedade Enabled, que determina se o componente está ativo ou não. Quando o componente está inativo, ele não responde aos eventos. Também usamos a propriedade Caption para mudar a mensagem que aparece nos botões. Finalmente usamos o método Close do form para fechar a aplicação.
Algumas Propriedades mais utilizadas:
Name:É comum a todos os componentes da paleta. O Delphi nomeia automaticamente todos os componentes que são incluídos no form (inclusive o proprio form). Usa o nome da classe do componente mais um número sequencial. O nome atribuído pelo Delphi pode ser mantido, mas é aconselhável renomear os componentes que serão referidos no programa. Por exemplo, no programa da Gangorra, Button1 e Button2 deveriam ser renomeados, já que é feita referência a eles no código fonte, já para o Button3 não há necessidade por que não há referência a ele. Quando voce renomeia um componente, o Delphi atualiza automaticamente todo o código gerado pelo Delphi, o que inclui o cabeçário da Unit, os eventos do componente e as propriedades de outros componentes que fazem referência ao componente renomeado,
mas não atualiza o código gerado por você. Exemplo: se renomearmos agora o Button1, o Delphi atualizará o cabeçário da unit, o nome dos eventos de Button1, mas você terá que atualizar as referências que você fez ao Button1 com o novo nome. Aliás esta é uma regra geral no Delphi: ele nunca modifica automaticamente o código gerado pelo programador, mesmo que esteja em comentário.
Caption: Todos os componentes que podem apresentar um rótulo tem esta propriedade. Armazena a string que será mostrada quando o componente for desenhado.
Left e Top: Esquerda e Topo. Armazenam a posição do componente em relação ao form ou painel que o contém. Movendo o componente, estas propriedades se atualizam automaticamente, e alterando estas propriedades, o componente é movido.
Height e Width: Altura e comprimento do componente. Idem acima.
Font: Permite selecionar tamanho e tipo da fonte que será usada para escrever o texto no componente.
Color: Cor do componente. Existe uma lista de cores padrão usadas pelo Windows e pelo Delphi, mas é possível definir qualquer cor através de seus componentes RGB.
TabOrder: Ordem do componente no Form ou painel. Quando há vários componentes selecionáveis no Form ou painel, a tecla Tab permite navegar entre os componentes. Esta propriedade define a ordem em que os componentes são selecionados quando o usuário tecla Tab.
Hint: (Dica) Este é um recurso muito útil e fácil de usar. Permite que apareça um texto de ajuda quando o usuário posiciona o cursor do mouse sobre um componente. Todos os componentes podem ter Hint. Na propriedade Hint, voce deve digitar a frase que deve aparecer. Veja a propriedade abaixo.
ShowHint: Ativa o hint para o componente. Se estiver desligado, o hint não é mostrado.
Alguns Eventos básicos: OnClick: É gerado cada vez que o botão esquerdo do mouse é pressionado e solto. O evento só ocorre quando o usuário libera o botão. O Delphi já direciona o evento para o componente que está debaixo do cursor do mouse.
OnDblClick: Gerado quando é feito um duplo clique no botão esquerdo.
OnKeyPress: Gerado quando o usuário pressiona (e libera) uma tecla no teclado.
OnEnter: Gerado quando o foco de atenção do Windows “cai” sobre o componente. Exemplo: Suponha uma tela de entrada de dados, onde vários campos devem ser digitados. Quando a tela é apresentada, o foco, ou o cursor de texto, está sobre o primeiro campo. Depois de digitar o campo, o usuário pressiona Tab para passar para o campo seguinte. Veja que o que passa para o campo seguinte é a atenção da aplicação e do Windows. Essa atenção é chamada de foco, ou focus em inglês. Este evento é gerado assim que o componente recebe o foco, antes de executar qualquer código do componente.
OnExit: Gerado imediatamente antes de o foco deixar o componente.
OnResize: Gerado quando o tamanho do componente é alterado. É usado principalmente em forms e painéis.
OnChange: Gerado quando o valor do componente muda. Só é aplicado em componentes que permitem edição de seu conteúdo.