segunda-feira, 10 de março de 2008

Quem são, para que servem e como se relacionam os arquivos de um programa em Delphi.

Neste artigo pretendo explicar um pouco sobre quem são, para que servem e como se relacionam os arquivos de um programa em Delphi. Devemos entender um programa em Delphi como um projeto, pois é desta forma que IDE aborda. Um projeto Delphi é subdividido em arquivos, inicialmente falaremos da configuração mais básica para contruirmos um progrma/projetos. Portanto, partindo dessa premissa consideraremos a divisão de um projeto em duas partes:

  • Primeira Parte – Unidades: São arquivois nomeados por “unit” a onde são definidos funções, procedimentos, constantes, tipos e classes. A extenção do arquivo que o compilador entende como uma unidade é “.pas”. Quando você esta trabalhando com um form não perca de vista que existe uma unit associada a esse form, um arquivo “.pas”. Contudo, como trata-se de um componente visual, as definições quanto a essa caracteristicas ficam guardadas num outro arquivo de extenção “.dfm”.
  • Segunda Parte – O Projeto: Uma uidade que define o projeto. Essa unidade gerencia todas as units da aplicação. Sejam elas referentes a forms ou não. Quando você abre um projeto no Delphi, imediatamnente você pode ver uma “unit” (um arquivo que representa uma unidade para codificação) com várias linhas de código. Portanto, quando estamos trabalhando num projeto em Delphi temos: o Project (.dpr) e as Units (.pas, caso algumas delas sejam referentes a formulários, existirão também para cada uma, respectivamente, um arquivo “.dfm”).

Veja na imagem abaixo um modelo exemplificando os arquivos de uma aplicação em Delphi.




Arquivos que Compõem um Aplicação

Arquivos usados no desenvolvimento

.dpr – Significa Delphi Project, este aruivo centraliza todas as demais units do programa.

.dsk – Remete a desktop, é um arquivo que armazena as informações da área de trabalho do Delphi, exemplo: Posição Janelas, units abertas no editor, além de outras configurações.

.pas – Arquivo Pascal: Nele encontra-se o código fonte de uma unidade pascal. Ou seja, declarações e implementações. Caso uma unit .pas o código contido nela defina um classe TForm (de formulário) ela trabalhará conjuntamente com o arquivo homônimo de extensão “.dfm.”

.res – Arquivo de Recurso: O arquivo binário associado ao projeto e que geralmente armazena o ícone. Você pode incluir outros arquivos desse tipo num projeto. O arquivo .res, principal de um aplicativo é reconstruido pelo Delphi de acordo com as informações definidas na página “Application” da caixa de diálogo do “Project Options”.

.dfm – Significa “Delphi Form File” (seria algo como: Arquivo Delphi de formulário)

.~df – Este arquivo só é gerado quando você salva uma edição qualquer que tenha efetuado no form. Treata-se de um arquivo temporário que pode ser usado para o desenvolvedor resgatar a última versão sava anteriormente.

.~pa - Este arquivo só é gerado quando você salva uma edição qualquer que tenha efetuado na unidade de código. Treata-se de um arquivo temporário que pode ser usado para o desenvolvedor resgatar a última versão sava anteriormente.

Obs: .~DF, .~PA , .~DP são arquivos temporários para backup ( Menu Options, Enviroment, Guia Editor Display, Caixa de Grupo Display and file options, opção Create Backup Files, desativa o seu salvamento).
Como você pode notar, num programa Delphi existe uma quantidade enorme de arquivos, por isso devemos organizá-los em diretórios separados. Podemos definir na IDE onde (path/caminho) serão gerados os pré-compilados e o executável separados dos “.pas”, “.dfm” e “.dpr”. Não preciso nem comentar que cada projeto deve estar num diretório específico.


Arquivos Gerados pela Compilação

.dcu – Delphi Compiled Unit: O processo de compilação gera um “.dcu” para cada “.pas” do projeto. O objetivo desses arquivos é tornar o processo de compilação mais rápido. Quando você edita uma unit de um projeto de 200 units, o compilador não recompila todas a partir do zero. As units que não foram editas cujo o “.dcu” foi gerado não são compiladas novamente, exceto de você der um “Build” (Alt + p + b - sucessivamente) no projeto ao invés de compilar simplesmente (Ctrl + F9). O Compilador aproveita os “.dcu” pré-compilados, recompilando apenas a unit “.pas” a qual foi editada desde a última compilação.
Obs: Estes possuem um tamanho arquivos significativo e devem ser apagados, de tempos em tempos, para economizar espaço em disco.

.exe – Arquivo compilado. No processo de compilkação o Delphi gera os arquivos “pré-compilados” “.dcu” a partir das units por você codificadase das bibliotecas nelas declaradas. Então, a partir desses arquivos “.dcu” é gerado o produto final que é o executável. Este por sua vez é distribuido para seus clientes/usuários.

Entendendo o arquivo que gerencia o projeto em Delphi “.DPR”.

Quando você inicia um programa em Delphi, os arquivos onde você codifica não são o programa. O Delphi trata o programa, própriamente dito, de forma relativamente transparente para o programador. O que você codifica são unidades, arquivos nomedos por “unit”, sejam referentes a formulários (Form), ou a uma outra classe, ou apenas a funções, procedimentos, declarações de constantes e tipos. Tanto que se você iniciar o Delphi, sem nenhum projeto aberto, for no menu “File ► New ► Unit” abrir somente esta unit, nada será compilado mesmo que seja codificado nela um milhão de linas. O arquivo cujo a estenção é “dpr”, ou seja “.dpr”, é o arquivo onde de fato esta o código do programa. Neste arquivo está escrito o código de criação da aplicação e seus formulários. O arquivo Project tem apenas uma seção.

Analisando o código e as seções de um arquivo “.dpr”:

PROGRAM – Palavra resrvada nativa da liguagems Pascal. Indica ao compilador que o conteúdo desse arquivo é um programa .

USES – Palavra resrvada nativa da liguagems Pascal. Seção onde é declarado as bibliotecas. Arquivos necessários para compilação.

Forms = Bilbioteca. É a unidade do Delphi onde eestão defindas as classes responsáveis pelas janelas. As quais também chamamos de formulários (windows/forms).

In = Palavra resrvada nativa da liguagems Pascal que indica ao compilador onde encontrar o arquivo referente a uma Unit.

Unit1 = A unidade que você criou

{$R *.RES} - Diretiva de compilação que inclui o arquivo de recursos. Por exemplo, os “.dfm” de cada arquivo “.pas” onde esta definos um form.


Abaixo veja como fica o ".dpr" quando você abre um projeto novo:

program Project1;

uses
Forms,
Unit1 in 'UNIT1.PAS' {Form1};

{$R *.RES}

begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Entendendo o Código fonte do arquivo Unit (.PAS).

Numa unit “.pas”, conforme mencionado anteriormente, são definidos funções, procedimentos, constantes, resource strings, tipos e classes. Esse arquivo remete a era do Pascal, ou seja é uma unit do antigo Pascal.

Seção Unit - Declara o nome da unit. Exemplo:

{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1995-2002 Borland Software Corporation }
{ }
{*******************************************************}

unit Forms;

{$P+,S-,W-,R-,T-,H+,X+}
{$C PRELOAD}
{$WARN SYMBOL_PLATFORM OFF}

interface


Seção Interface


Nesta seção estão as declarações de constantes, tipos de variáveis, funções e procedures gerais da Unit/Form. As declarações desta seção são visíveis por qualquer Unit. Analizando exemplo de código comunmente encointrado nesta seção:

INTERFACE
- Palavra que inicia a seção;
USES
– seção para declaração de bibliotecas que seraõ usadas para implementação do programa:
SysUtils = biblioteca de utilitários do sistema (strings, data/hora, gerar arquivos).
WinProcs = biblioteca. Unite onde encontramos codificação para acesso a GDI, USER e KERNEL do Windows.
Wintypes = Biblioteca, tipos de dados e valores constantes.
Messages = Biblioteca de constantes com os números das mensagens do Windows e tipos de dados das Mensagens.



Seção Uses- Declaração de bibliotecas, as units acessadas por este arquivo. Para que você possa usar qualquer coisa (constante, funções, procvedimentos, classes) definida em outra unidade, esta deverá ser declarada aqui. A visibilidade das bibliotecas declaradas aqui sofrerão o reflexo das seções “interface” ou “implementation” dependendo de onde a seção uses for subordinada.


Seção Type
- Declaração dos tipos definidos pelo usuário.

Seção Var - Declaração das variáveis, a visibilidade delas será dependente das seções “interface” ou “implementation” que definirá se elas serão privadas ou não (mais detalhes veja em “Escopo de Visibilidade”).

Seção Implementation- Como o próprio no indica, seção específica para implementação. Resumidamente, quando programamos estamos declarando e implmentando. Declamos estruturas de dados e constantes, implementamos procedimentos e funções. Numa unit Delphi/Pascal podemos declarar coisas na seção “implementation”, contudo no que diz respeito a implementação, somente nesta seção podemos codificar. Ela também reflete no grau de visibilidade do que for declarado dentro dela. Toda e qualquer declarção definda dentro do seu escopo não é visível a nenhuma outra unit doi projeto. Ela serve de complemento da seção “interface”, embora sua função não se restrinja somente a isto, na medida que não é possível implementarmos nada na interface. Ou seja, nela estarão os corpos das funções e procedures declaradas nas seções “interface”. Nesta seção , quando trabalhamos com formulários, também estão definidos todos os procedimentos dos componentes que estão incluídos no Form. O mesmo acontece para a implementação dos métodos de qualquer classe definida na seção interface. As declarações codificadas neste seção são visíveis apenas nesta unit. Esta seção é formada pelo seguinte código:

{$R*.DFM} - Diretiva de compilação que indica a utilização de um arquivo de recurso. Neste caso, trastando-se de um form é necessário compilar junto o arquivo que contem as informações visuais do mesmo. Elas estão defindas no *.DFM, homonimo a unit.

{$S+} - Diretiva de compilação que ativa verificação de pilha.

Seção Inicialization - Inicia com a palvra reserva “initialization”. Nesta seção, que é opcional, pode ser definido um código para efetuar tarefas de inicialização da Unit quando o programa começa. Sintaxe: Após a palavra reservada “inicialization”, de preferência indentado, segue uma ou mais declarações para serem executadas em ordem.

Seção Finalization - Opcional, palavra reservada que somente pode ser usada somente se anteriormente houver uma seção “Inicialization”. Esta seção inicia-se com a palavra reservada “finalization” e continua, contendendo comandos que serão executados em ordem até o final da unit. Nela declaramos comandos que deverão ser executados quando o programa for finalizado. Preferencialmente, devemos neste momento liberar recursos alocados na seção “Inicialization”.

Exemplo: Abaixo veja como cada declaração aparece em cada uma das seções as quais nos referimos acima:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure LoadLstBoxZN;
end;

(*
function somar: Double;
begin
Result := 2;
end;
*)

var
Form1: TForm1;
ZnLst: TStringList;

implementation

uses StrUtils, Math;

{$R *.dfm}

{ TForm1 }

procedure TForm1.LoadLstBoxZn;
const
AMsg = 'Dado Estação ZN %d°';
var
i: Integer;
AuxNum: Integer;

begin
ZnLst := TStringList.Create;
for i := 0 to 10 do
begin
Randomize;
AuxNum := RandomRange(100, 200);
ZnLst.Add(Format(AMsg, [AuxNUm]));
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.Assign(ZnLst);
end;

initialization
Form1.LoadLstBoxZn;

finalization
ZnLst.Free;
Sleep(1000);
end.

Nenhum comentário:

Postar um comentário