quarta-feira, 31 de outubro de 2007

AMBIENTE DELPHI

Vamos mostrar agora um pouco do ambiente de programação do delphi. Os seus principais recursos estão listados abaixo:

1 - Barra de Menus

Através da barra de menu o usuário terá acesso a todos os recursos do Delphi. Os menus seguem até certo ponto a padronização do Windows.

2 - SPEEDBAR

A Speedbar contém ícones que foram considerados como de uso comum, justamente para que os programadores Delphi não precisem acessar constantemente à barra de menus. Em caso de dúvida sobre a função de qualquer ícone na tela do Delphi, basta mover o mouse sobre o ícone que surgirá um texto descritivo. Todo item da Speedbar possui uma tecla de atalho correspondente, portanto, se voce já tiver o costume de utilizar de teclas de atalho poderá dispensar o uso do mouse.


3 - PALHETA DE COMPONENTES

Está é a principal barra de ferramentas do Delphi. Através dela você tem acesso a todos os recursos que permitirão construir visualmente a sua aplicação.
Na página Standard, por exemplo, você tem acesso a objetos como: caixas de textos, combos, botões de rádio, caixas de verificação, campos de textos, e muito mais. Para utilizar qualquer um destes objetos
basta selecioná-lo com o mouse e arrastá-lo para o formulário de sua aplicação.



4 - O FORMULÁRIO


O Formulário é o ponto central de qualquer aplicação Delphi e constitui a área de programação e a tela da aplicação em desenvolvimento. O formulário é equivalente às janelas dos programas Windows. A partir de um formulário você constrói a janela da sua aplicação. Nesta janela você deve posicionar os componentes ou objetos desejados (Combos, Caixas de listagem,
etc) e escrever os códigos associados aos eventos selecionados dos componentes.
Tudo o que é colocado e realizado para o formulário, fica gravado num arquivo (.DFM) anexado ao projeto da aplicação. Embora este arquivo esteja em formato binário, é possível abrí-lo no Delphi e ler o seu conteúdo.


5 - CODE EDITOR

A janela Code Editor é propriamente o lugar onde o código do programa, será escrito. O código dos eventos, definidos no formulário através dos mais variados componentes, será necessário para fazer com que o Delphi responda as ações do usuário.Em outras palavras quando o usuário clicar sobre um botão do formulário, os comandos executados serão escritos no Code Editor.
O código escrito em Pascal, ou seja o programa, será gravado num arquivo com extensão (.PAS) que será designado UNIT. Estes arquivos são armazena
dos no padrão ASCII podendo ser acessados através de qualquer editor de textos no Windows.
É bom saber que nem tudo o que estiver escrito na UNIT será por iniciativa própria do usuário. O Delphi nos auxilia escrevendo sozinho a maior parte do código e insere nos lugares certos aqueles comandos que o programador deseja acrescentar.


6 - OBJECT INSPECTOR
Através desta importantíssima janela auxiliar o Delphi permite que você altere certos atributos dos componentes e dos formulários usados na aplicação. Alguns dos atributos ou propriedades poderiam ser: a cor do texto, a cor do fundo, o tipo de letra, etc. (PROPRIEDADES)
Além disso é através do Object Inspector que podemos programar o que deverá acontecer quando o usuário da aplicação clicar sobre um botão , selecionar uma opção no formulário, etc. (EVENTOS)

Tipos de dados Compostos

Tipo Array

Arrays são matrizes, isto é, coleções ordenadas de elementos de um mesmo tipo de dados, que faz uso de um índice para dar acesso aos itens da coleção. Como array já é um tipo, basta declarar uma variável como array, da seguinte forma:

var
Dia_da_semana: array [1..7] of string;
Dia_do_mês: array [1..31] of integer;

Note que separamos os valores mínimo e máximo de um array por dois pontos. Os arrays declarados acima são unidimensionais, isto é, seus elementos podem ser dispostos formando uma única linha. Para atribuir valores a um array proceda da seguinte forma:

begin
Dia_da_semana [1] := ‘Domingo’;
Dia_da_semana [2] := ‘Segunda-feira’;
Dia_da_semana [3] := ‘Terça-feira;
Dia_da_semana [4] := ‘Quarta-feira’;
Dia_da_semana [5] := ‘Quinta-feira’;
Dia_da_semana [6] := ‘Sexta-feira’;
Dia_da_semana [7] := ‘Sábado’;
end;

Para armazenar valores de um array em outra variável, podemos escrever:

var
Dia : string;

begin
Dia := Dia_da_semana [1];
end;

e assim por diante. A declaração de arrays multidimensionais é semelhante à de arrays unidimensionais. Por exemplo, para declarar um array a ser usado como uma tabela 30x30, escrevemos:

var
Bi_array: array [1..30,1..30] of currency;

Note que os elementos de um array podem pertencer a qualquer tipo de dados pré-definido ou definido pelo usuário.

- Arrays Dinâmicos

Uma novidade no Delphi 4 são os arrays dinâmicos. Arrays Dinâmicos são arrays alocados dinamicamente em dimensões que não são conhecidas em tempo de compilação. Para declarar um array dinâmico, apenas declare um array sem incluir as dimensões:

var
// array dinâmico de string:
SA: array of string
;

Antes de poder usar um array dinâmico, você deve usar o procedimento SetLength() para alocar memória para o array:

begin
// aloca lugar para 33 elementos:
SetLength(SA, 33);

Depois que a memória foi alocada, você pode acessar os elementos do array dinâmico como um array normal:

SA[0] := 'O urso parece feliz';
OutraString := SA[0];

Nota: Arrays Dinâmicos sempre iniciam no zero.

Arrays dinâmicos são auto-suficientes, assim não é necessário liberá-los quando você deixar de usá-los; eles serão liberados quando deixarem o escopo. Entretanto, pode haver uma hora que você queira remover o array dinâmico da memória antes que ele saia do escopo (se ele usa muita memória, por exemplo). Para fazer isso, você apenas precisa atribuir ao array dinâmico um nil:

SA := nil; // libera SA

Arrays dinâmicos são manipulados utilizando semanticas de referência similares à AnsiStrings


Tipo Enumerado

Este tipo permite que você crie uma lista organizada de itens. Para usar um tipo você deve antes declará-lo com a palavra reservada type. Por exemplo, um tipo enumerado que descreve os dias da semana pode ser declarado da seguinte maneira:

type
Semana = (Segunda, Terça, Quarta, Quinta, Sexta, Sábado, Domingo);

Espaços em branco não são permitidos dentro de um elemento. Uma vez declarado um tipo, você deve declarar uma variável pertencente a este tipo. Não usamos o tipo diretamente, mas sim uma variável deste tipo. Por exemplo, vamos supor que queiramos construir um programa que forneça o nome da pessoa escalada para um plantão semanal. Poderíamos declarar uma variável Plantao da seguinte forma:

var
Plantao : Semana;

Para atribuir valores à variável Plantao escreva simplesmente:

Plantao := Segunda;
Plantao := Terça;
etc.


Tipos Registro(Record)

O tipo de dados Record provavelmente é o mais versátil à disposição, pois pode conter tipos de dados heterogêneos. Por exemplo, a folha de pagamento de uma empresa conterá dados do tipo string (nome, endereço, etc), dados do tipo currency (salário), dados do tipo TDateTime (data de contratação) e assim por diante. Não poderíamos usar um array, pois este tipo só pode conter dados de um mesmo tipo. O tipo Record resolve o problema e, mais uma vez, devemos declarar o tipo de dados antes de usá-lo:

type
Folha_Pgto = Record
Nome: String;
Data_Cont : TDateTime;
Salario: currency;
end;

var
Folha_Abril: Folha_Pgto;

begin

Folha_Abril.Nome := ‘Ana Paula Magalhães’;
Folha_Abril.Data_Cont := 10/02/1998;
Folha_Abril.Salário := 2200;

end;

Note que você deve usar um ponto para separar o nome do Record do nome do campo a que você está se referindo. O Object Pascal, e várias linguagens modernas fornecem uma maneira mais fácil de executar esta operação, usando a instrução With:

begin

With Folha_Abril do begin

Nome := ‘Ana Paula Magalhães’;
Data_Cont := 10/02/1998;
Salário := 2200;

end;

end;

Aqui, o primeiro "end" é da instrução With. A documentação do Object Pascal sugere que você use With quando for possível, pois isto diminui o tempo de execução.

Os tipos Record também podem conter arrays e são bastante usados quando se requer bancos de dados simples. Veremos que o Delphi permite a implementação de estruturas de dados bastante complexas, usando bancos de dados Dbase, Paradox, Access, etc. Contudo, vez por outra não é necessária toda esta sofisticação e é conveniente optar pelos tipos Record. Além disso, nesses casos simples não será necessário instalar os drivers de bancos de dados.


Tipo Subintervalo

O tipo subintervalo permite que você defina um intervalo válido de respostas que um usuário pode inserir em um programa, tal como o número de horas trabalhadas em um mês, a faixa de idade dos membros de um clube, etc. Um subintervalo pode conter os seguintes tipos: boolean, char, integer e tipos enumerados.

A declaração de um tipo subintervalo é similar àquela de um tipo enumerado:

type
Salario_faixa1 = 500 .. 1000;

Note que usamos dois pontos para separar os limites do subintervalo, e não vírgulas. Isto permite que o compilador identifique o tipo como um subintervalo e não um tipo enumerado. A seguir, devemos declarar uma variável como pertencente ao tipo declarado anteriormente:

var
Salario_Ana : Salario_faixa1;

Quando um programa usando subintervalos é executado, e se um valor atribuído a um tipo subintervalo estiver fora do intervalo, o programa gerará um erro de tempo de execução. Para que o teste de intervalo seja executado, você deve antes incluir a diretiva de compilação {$R+} no programa, da seguinte forma:

procedure Tform1.ButtonClick (Sender : Tobject);
{$R+}

type
Salario_faixa1 = 500 .. 1000;

var
Salario_Ana : Salario_faixa1;


Tipo Conjunto

Os conjuntos são ainda mais interessantes que os subintervalos. Os conjuntos podem usar intervalos em suas definições. Um conjunto é um grupo de elementos que você quer associar a um nome e que pode comparar com outros valores para a inclusão ou exclusão do conjunto. Um exemplo poderia ser um conjunto contendo todas as respostas de um caractere possíveis para uma pergunta do tipo SIM/NÂO. As quatro respostas são y , Y, n e N. você poderia criar um conjunto que abrangesse as quatro: [ ‘y’, ‘Y’, ‘n’, ‘N’]. uma vez definido esse conjunto , você pode então usá-lo para ver se algo está nele ou não.

Você procura inclusão de um conjunto chamando a instrução in. Por exemplo, a instrução :

Myinput in [‘y’, ‘Y’, ‘n’, ‘N’] then

Está dizendo que, se o valor da variável, Myinput é um dos itens do conjunto, então essa expressão é valida como TRUE booleano. Se o valor de Myinput não esta no conjunto, então essa instrução é FALSE. Um conjunto pode conter quase tudo, desde que seus membros sejam do mesmo tipo ordinal ou de tipos ordinais compatíveis.

Constantes Tipadas

Na verdade, constantes tipadas são variáveis inicializadas com valor persistente, que podem ser alteradas normalmente, como qualquer variável. A única diferença de sintaxe entre constantes tipadas e simples é que o tipo da constante é indicado explicitamente na declaração. Se uma constante tipada for declarada localmente, ela não será destruída quando o método for encerrado


Tipo Variant

O tipo Variant pode assumir tipos como SmallInt (inteiro de 16 bits), Integer(inteiro de 32 bits), Strings, Single (ponto flutuante de precisão simples), Double (ponto flutuante de precisão dupla), Boolean(lógico de 16 bits)... Bem como também assumir tipos como Null (para nulo), e Empty (para nunca atribuído, vazio). As conversões de tipos acontecem automaticamente (na medida do possível), e a atribuição de tipos para uma variável do tipo Variant pode mudar em modo de execução, observe o exemplo abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var m_valor1,

m_valor2,

m_valor3 : Variant;

m_Str1 : String;

Begin

m_valor1 := 12; // atribui valor inteiro

m_valor2 := 5.2; // atribui um ponto flutuante

m_valor3 := m_valor1 * m_valor2;

m_Str1 := m_valor3;
// atribui resultado(já convertendo)

End;

Como pode notar, temos em mãos uma flexibilidade ímpar no trabalho com variáveis. Todavia, como nem tudo são rosas, existem desvantagens com o uso de Variant, entre elas, o tamanho mínimo de 16 bits para as variáveis (tornando-as mais lentas), e também o fato de não haver verificações em modo de compilação quando usamos Variant, podendo surgir Bugs que daremos conta somente em modo de execução.


Tipo Ponteiros

Os ponteiros em Object Pascal têm o mesmo poder dos ponteiros em C / C++, porém são muito menos utilizados.

Vejamos algumas comparações de sintaxe de ponteiros em Delphi e C.

Linguagem

C

Delphi (pascal)

Declaração

tipo * apontador;

var apontador: ^tipo;

Exemplos

int * PointerPara_int;
char * string;

var PointerPara_integer: ^integer;
Mensagem: ^String[40];


Para usarmos apontadores é necessário fazê-los apontar para a referência correta. Um apontador nulo ou inválido faz com que o programa aborte. Para usar o valor referenciado por um apontado, utilizamos a seguinte sintaxe:

Linguagem

C

Delphi

Sintaxe

* apontador

apontador^

Exemplos

a = *b;
*a = *a + 1;

a := b^;
a^ := a^ + 1;


Para inicializar apontadores, é necessário "apontá-lo" para o endereço de memória no qual se deseja referenciar. Isso pode ser feito através do operador "cria pointer". Veja os exemplos abaixo:

C

Delphi

int main() {

int dia = 5;

int mes = 1;

int *ap;

ap = &dia;

*ap --;

ap = &mes;

*ap ++;

}

var dia, mes: integer;

ap: ^integer;

begin

dia := 5;

mes := 1;

ap := @dia;

dec(ap^);

ap := @mes;

inc(ap^);

end;

Para usar a memória dinâmicamente, ela precisa ser alocada. A alocação de memória reserva um bloco de memória e armazena o seu endereço em um apontador, para futuras referências. Existem várias formas para se alocar memória. Abaixo estão algumas:

Linguagem

C

Delphi

Declaração

char *buffer;

type tBuffer = array[0..1023] of char;
var Buffer: ^tBuffer;

Alocação

buffer = (char *)malloc(1024);

buffer = (char *)calloc(1024,1);

getmem(Buffer, 1024);

Liberação

free(buffer);

freemem(Buffer, 1024);


Um apontador pode referenciar outro apontador ao invés de uma variável. Esse recurso é em geral utilizado quando um apontador é passado para uma função, por referência. A função abaixo, por exemplo, aloca memória e testa se a alocação foi bem sucedida:

C

Delphi

void aloca(void **apont, int tamanho) {

*apont = (void *) malloc(tamanho);

if (*apont == NULL) {

printf(stderr, "Erro alocando buffer!\n");

exit(-1);

}

}

type tBuffer = array[0..1000] of char;

pBuffer = ^tBuffer;

procedure aloca(var apont: pBuffer; tamanho: integer);

begin

getmem(apont, tamanho);

if (apont = nil) then begin

writeln('Erro alocando buffer!');

halt(-1);

end;

end;

A linguagem pascal usa a palavra reservar "var" para indicar que a passagem de parâmetros foi feita por referência e evita a necessidade de se tratar o apontador para apontador diretamente na linguagem.

Tipos de dados Primitivos

Tipo de dados Integer


Os tipos de dados integer são usados para representar números inteiros. Existem vários tipos diferentes de dados integer. Vejamos:

Tipo

Intervalo de valores

Bytes

Com sinal

Byte

0 a 255

1

Não

Word

0 a 65535

2

Não

ShortInt

-128 a 127

1

Sim

SmallInt

-32768 a 32767

2

Sim

Integer

-2147483648 a 2147483647

4

Sim

Cardinal

0 a 2147483648

4

Não

LongInt

-2147483648 a 2147483647

4

Sim


Tipos de dados Real

Os tipos de dados real são projetados para conter um número com uma parte fracionária. Vejamos uma tabela com tipos de dados real:

Tipo

Intervalo

Bytes

Real

±2.9*1039 a 1.7*1038

6

Single

±1.5*10-45 a 3.4*1038

4

Double

±5.0*10-324 a 1.7*10308

8

Extended

±3.4*10-4932 a 1.1*104392

10

Comp

-263 a 263 -1

8

OBS: O tipo Comp é, na verdade, um grande inteiro, e não um real. A razão de estar incluído nesta tabela é que ele é implementado da mesma maneira dos tipos ponto flutuante. Na verdade, trata-se de um inteiro de 64 bits.


Tipo de Dados Currency

Na maioria das linguagens, você tem q usar um tipo de dado real para representar um valor monetário. O delphi fornece o tipo Currency especialmente para este uso. Trata-se de um tipo ponto flutuante que é compatível em relação à atribuição com todos os outros tipos de ponto flutuante. O tipo Currency tem uma precisão de 4 casas decimais, e é armazenado como um inteiro de 64 bits (onde os 4 dígitos menos significativos representam os 4 números à direita do ponto decimal).

Você pode estar se perguntando por que deveria usar o tipo currency em vez do tipo de dado real. Tipo Currency oferece duas vantagens importantes:

· O tipo Currency tem uma precisão maior para conter números grandes;

· O tipo Currency é usado em CurrencyField e em outros componentes. Ele é compatível com tipos de banco de dados q representam dinheiro;


Tipo de Dados Boolean

O tipo de dados Boolean é um dos mais simples e mais usados. As variáveis desse tipo representam uma quantidade lógica; por exemplo, TRUE e FALSE.

As variáveis do tipo boolean aceitam operadores condicionais, que serão discutidos posteriormente.


Tipos de Dados Character

O tipo de dados caracter é bastante conhecido daqueles que já programaram em C. Esse tipo de dado foi projetado para armazenar um caracter. Um caracter tem um byte de comprimento, o que daria 256 caracteres que poderiam ser colocados em uma variável do tipo char.

O Delphi permite também o uso de caracteres do sistema UNICODE (Unicode é um padrão que permite aos computadores representar e manipular, de forma consistente, texto de qualquer sistema de escrita existente) utilizando de 2 Bytes.

Tipo de Caracter

Bytes

Conteúdo

ANSIChar ou Char

1

Caracter ANSI

WIDEChar

2

Caracter UNICOD



Tipos de dados String

O tipo de dados String tende a ser um pouco mais útil do que o tipo Char. No Delphi, o tipo de dados String era uma concatenação de até 255 caracteres individuais. Outro termo para isso é array de caracteres. A Tabela a seguir lista os 4 tipos de Strings disponíveis no Delphi.

Tipo String

Comprimento

Conteúdo

Terminado em Nulo

ShortString

255

ANSIChar

Não

AnsiString

Até ~3GB

ANSIChar

Sim

String

255 ou até ~3GB

ANSIChar

Sim ou Não

WideString

Até ~1.5GB

WideChar

Sim

Strings maiores de 255 caracteres são alocadas dinamicamente.

domingo, 28 de outubro de 2007

Introdução

A linguagem PASCAL ( nome dado em homenagem ao matemático BLAISE PASCAL) foi criada em 1968 por Niklaus Wirth,
do Institut fur Informatik de Zurich, tem como principais características:
- Ser uma linguagem adequada ao ensino de programação, isto é, estruturada, bem organizada e compreensível.
- Permitir uma implementação confiável e eficiente em grandes computadores ou em pequenos computadores.
- Simplicidade, incluindo os avanços da ciência de computação atingidos na época.
- Baseada no ALGOL 60, de modo a criar bons hábitos de programação.

Em 1.983 a software house americana Borland International lançou o Turbo Pascal para microcomputadores. O
turbo Pascal consegue em um ambiente, colocar um editor de textos, bastante parecido com o Wordstar e um compilador de um
passo bastante veloz, com a desvantagem de que apenas um erro é localizado pôr vez, e também oferece facilidades para a
depuração de programas e programação orientada o objetos.

O Delphi é uma linguagem de programação orientada a eventos e a objetos (OBJECT PASCAL), criada pela
BORLAND, voltada para o ambiente Windows 95/98, NT, com capacidade para gerar aplicações em arquitetura Cliente/Servidor
ou Local. O Delphi baseia-se na programação visual onde o programador utiliza-se de diversos ícones para recriar todos os
objetos presentes na tela do Windows, tais como: Botões de Pressão, Pop-Ups, Caixas de Listagem, Botões de Rádio, etc; o que
facilita a utilização dos programas para os usuários dos programas até mesmo para os iniciantes.

Além de todas facilidades que esta linguagem apresenta, vale dizer, que ela herda muitos recursos e estruturas
próprias do Turbo Pascal, o que torna o Delphi uma linguagem extremamente prática e clara.
Todas as regras para a estruturação do código dos programas foram recriadas à semelhança do Turbo Pascal, tornando os
programas muito organizados e fáceis de ler e entender. Podemos arriscar a dizer que ao mesmo tempo em que o Delphi marca o
retorno da Borland ao segmento das linguagens de programação , representando de certa forma a retomada e evolução do
excelente Turbo Pascal.

O Delphi é uma linguagem de programação que permite compilação e linkedição de suas aplicações, gerando um
arquivo executável (EXE) real, dispensando o uso de RunTime.