# Delphi

Capítulo destinado aos padrões como nomenclatura, indentação entre outros, usados em Delphi.

# Nomenclatura Geral

### **Nomenclatura**

##### **Componentes**

<span style="font-weight: 400;">Os componentes possuem seus prefixos utilizando letras que remetem ao nome completo da classe do componente. </span><span style="font-weight: 400;">Componentes herdados dos componentes listados e sem conexão ao banco de dados devem possuir o mesmo prefixo do componente principal, com exceção dos componentes visuais com conexão ao banco de dados, que utilizam o prefixo “DB“ seguido do padrão identificado logo abaixo. Exemplo: DBED\_Nome é um componente da classe TDBEdit, responsável pela representação de um nome.</span>

<span style="font-weight: 400;">Seguem alguns exemplos de prefixos padrões utilizados:</span>

<table border="1" id="bkmrk-ed_%3A-tedit%3B%E2%A0-ts_%3A-tta" style="border-collapse: collapse; width: 53.7037%; height: 377px;"><tbody><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">ED\_: TEdit; </span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">TS\_: TTabSheet;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">PN\_: TPanel;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">RB\_: TRadioButton;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">GB\_: TGroupBox;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">OD\_: TOpenDialog;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">LB\_: TLabel;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">SD\_: TSaveDialog;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">MM\_: TMemo;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">Q\_: TQuery, TFDQuery;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">BT\_: TButton (Botões num geral);</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">DS\_: TDataSource;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">CK\_: TCheckBox;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">CDS\_: TClientDataSet;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">CB\_: TComboBox;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">DSP\_: TDataSetProvider;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">LT\_: TListBox;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">T\_: TTable;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">RG\_: TRadioGroup;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">FR\_: TFrxReport;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">PC\_: TPageControl;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">FDS\_: TFrxDBDataSet;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">TB\_: TToolBar;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">RV\_: TRvProject;</span></td></tr><tr style="height: 29px;"><td style="width: 27.1031%; height: 29px;"><span style="font-weight: 400;">GD\_: TGrid;</span></td><td style="width: 26.6006%; height: 29px;"><span style="font-weight: 400;">DSC\_: TRvDataSetConnection;</span></td></tr><tr><td style="width: 27.1031%;"><span style="font-weight: 400;">MI\_: TMenuItem;</span></td><td style="width: 26.6006%;"><span style="font-weight: 400;">SH\_: TShape</span></td></tr><tr><td style="width: 27.1031%;"><span style="font-weight: 400;">IM\_: TImage</span></td><td style="width: 26.6006%;"><span style="font-weight: 400;">TM\_: TTimer </span></td></tr></tbody></table>

<span style="font-weight: 400;">Exemplo de componentes visuais com conexão ao banco de dados:  
</span>

<table border="1" id="bkmrk-dbed_%3A-tdbedit%3B-dbgd" style="border-collapse: collapse; width: 39.5062%; height: 58px;"><tbody><tr style="height: 29px;"><td style="width: 19.5062%; height: 29px;"><span style="font-weight: 400;">DBED\_: TDBEdit;</span></td><td style="width: 20%; height: 29px;"><span style="font-weight: 400;">DBGD\_: TDBGrid;</span></td></tr><tr style="height: 29px;"><td style="width: 19.5062%; height: 29px;"><span style="font-weight: 400;">DBCK\_: TDBCheckBox;</span></td><td style="width: 20%; height: 29px;"><span style="font-weight: 400;">DBRG\_: TDRadioGroup;</span></td></tr></tbody></table>

##### **Variáveis**

O nome da variável deve descrever de maneira clara e sem abreviações a função da variável. Utilizar a notação PascalCase para o nome da variável.  
As variáveis podem ter ainda um prefixo para adicionar mais informações sobre sua origem.  
Para **variáveis locais** utiliza-se o prefixo **‘L’**, para **argumentos (Parâmetros) de métodos** utiliza-se o **'A’**. Para **atributos (Field)** de classes utiliza-se o **‘F’**.

```PASCAL
type
  TPessoa = class
    protected
      FNome: String; // Campo nome da classe Pessoa. Prefixo F
    public
      constructor Create(ANome: String); // Argumento do método. Prefixo A.
  end;
  
implementation

constructor TPessoa.Create(ANome: String);
var
  LNome: String; // Variável local. Prefixo L
begin

end;
```

##### **Constantes** 

Para nomes de constantes, o padrão utilizado é:

```PASCAL
const
  NOME_DA_CONSTANTE_1 = 0;
  NOME_DA_CONSTANTE_2 = False;
  NOME_DA_CONSTANTE_3 = ‘Teste’;
```

O tipo da constante é deduzido através do valor dessa constante no momento da declaração. Porém, é possível declarar explicitamente um tipo para as constantes, e em alguns casos, como o de arrays, é necessário que esse tipo seja declarado.

```PASCAL
const
  NOME_DA_CONSTANTE_4: Double = 10;
  NOME_DA_CONSTANTE_5: array [1..2] of String = (‘a’, ‘b’);
```

##### **Métodos** 

Assim como o nome das variáveis, o nome do método deve seguir o mesmo modelo, com nomes que descrevem a função do método, utilizando também a notação PascalCase.  
Ao editar um método, é importante manter sua função original, caso sua funcionalidade seja alterada, deve-se refatorar o seu nome para que permaneça fiel ao seu comportamento.

**Exemplo 1: Criar um método que faça a confirmação de um rotina de gravação. Sem retorno e sem argumentos.**

```PASCAL
procedure ConfirmarGravacao();
```

**Exemplo 2: Criar um método que faça o cálculo da área de um retângulo. Seu retorno será um inteiro, esse método terá ainda dois argumentos, altura e largura.**

```PASCAL
function CalcularArea(AAltura, ALargura: Integer): Integer;
```

##### **Units**

As units padrões utilizadas anteriormente para as entidades eram nomeadas acrescentando 1, 2, 3 ou 4. Para facilitar o entendimento na leitura do nome da unit, elas passam a ser utilizadas no singular, seguido do nome de sua funcionalidade. Por exemplo, a entidade “Empresa” passa a ser utilizada como:  
● Empresas1: Empresa.Manutencao;  
● Empresas2: Empresa.Cadastro;  
● Empresas3: Empresa.Pesquisa;  
● Empresas4: Empresa.DataModule;  
Para units que tenham outra função que não se enquadrem nessas descritas anteriormente, o padrão é utilizar o nome da entidade seguido da descrição de sua função.  
Exemplo: Empresa.Copiar.

##### **Classes**

O padrão Delphi para nome de classes aconselha que ela inicie com o prefixo T (*Type*). É aconselhável que o nome dessas classes sejam descritivos quanto à sua entidade, função e/ou tipo. Por exemplo, uma classe que define a entidade produtos poderia ter o nome *TProdutoModelo*, enquanto o formulário para importação desses produtos poderia ser *TProdutoImportacaoFormulario.*

# Espaçamento

##### **Regras para Formatação Horizontal** 

**Tabulação**: Utilizar 2 caracteres (espaços) ao invés da tabulação.

Para manter a estrutura do código de modo que sua leitura seja fácil, o número máximo de caracteres por linha é **130**. Caso a expressão ultrapasse esse comprimento, a linha deve ser quebrada segundo essas regras:

1. A linha tem comparações? `('a = b', 'a <> b', 'a <= b', 'a >= b', 'a < b' ou 'a > b')`
    1. Envolver cada comparação com parênteses.
2. A linha contem negação? `('not')`
    1. Envolver cada negação com um parênteses.
3. A linha contém operadores lógicos? `('and' e 'or')`
    1. Envolver cada sequência de `'and'` com um parênteses;
    2. Envolver cada sequência de `'or'` com um parênteses.
4. A linha é uma atribuição? `(':=')`
    1. Adicionar uma quebra de linha após o sinal de atribuição `(':=')`, alinhar a nova linha com a linha original e indentar em um nível (2 espaços);
    2. Caso o código resultante não tenha ultrapassado a linha das 130 colunas, processo pode ser interrompido;
    3. Caso a atribuição seja uma String, ela pode ser quebrada em uma ou mais concatenações. Essas podem ser quebradas e alinhadas com a linha original, adicionando um nível de indentação;
    4. Caso a atribuição seja uma comparação (Não considerar comparações dentro de métodos aninhados), adicionar uma quebra de linha após o sinal de comparação `('=', '<>', '<=', '>=', '<' ou '>')`, e alinhar a nova linha com o primeiro operando.
5. A linha tem um 'if'? 
    1. Caso a condição do if não tenha um parênteses envolvendo a condição inteira, envolvê-la com um;
    2. Adicionar uma quebra de linha após cada operador `'and'` ou `'or'`;
    3. Após cada quebra de linha, alinhar a nova linha com o parênteses onde ela está contida e adicionar um espaço;
    4. Caso o código resultante não tenha ultrapassado a linha das 1 colunas, processo pode ser interrompido;
    5. Caso alguma das condições do if tenha uma comparação (Não considerar comparações dentro de métodos aninhados), adicionar uma quebra de linha após o sinal de comparação `('=', '<>', '<=', '>=', '<'` ou `'>')`, e alinhar a nova linha com o primeiro operando.
    6. Caso o código resultante não tenha ultrapassado a linha das 130 colunas, processo pode ser interrompido.
6. A linha contém métodos aninhados? 
    1. Aplicar essa regra do métodos mais externo para o mais interno;
    2. Adicionar uma quebra de linha exatamente antes do início do método aninhado;
    3. Alinhar a nova linha com o método onde ela está contida (Caso o método tenha uma negação (not), alinhar com o início dessa negação), adicionar ainda um nível de indentação (2 espaços);
    4. Caso o código resultante não tenha ultrapassado a linha das 130 colunas, processo pode ser interrompido.
7. A linha contém parâmetros? 
    1. Ao realizar a quebra de linha de um parâmetro, ele deve estar indentado um nível (2 espaços) em relação ao nível do método proprietário do parâmetro (caso o método proprietário tenha uma negação (not), alinhar com o início dessa negação);
    2. Caso o código resultante não tenha ultrapassado a linha das 130 colunas, processo pode ser interrompido.
8. Após todas essas etapas a linha ainda ultrapassa a marca de 130 colunas? 
    1. Caso ainda assim, a linha ultrapasse a marca de 130 colunas então deve-se verificar a existência de pontos na expressão (“.”), sendo que, ao realizar esse tipo de quebra de linha, o ponto deve ficar com a expressão na linha inferior, indentado em um nível em relação ao início da expressão.

Observação: Algumas vezes, quando uma linha ultrapassa as 130 colunas, é um sinal de que esse trecho pode ser refatorado. O programador pode então refatorar, se julgar que é necessário ou melhor.

##### **Declaração de variáveis** 

<p class="callout success">**Correto**</p>

```PASCAL
var
  LTeste: Integer;
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
var
  LTeste : Integer;
  LTeste :Integer;
```

##### **Atribuições**

<p class="callout success">**Correto**</p>

```PASCAL
LTeste := 15;
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
LTeste:=15; 
LTeste:= 15; 
LTeste :=15; 
```

##### **Métodos**

<p class="callout success">**Correto**</p>

```PASCAL
procedure Ex(AParametro: Integer); 
procedure Ex(AParametro1, AParametro2: Integer); 
procedure Ex(AParametro: Integer; AParametro2: String); 
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
procedure Ex (AParametro1: Integer); 
procedure Ex( AParametro: Integer); 
procedure Ex(AParametro: Integer ); 
procedure Ex(AParametro1,AParametro2: Integer); 
procedure Ex(AParametro1 , AParametro2: Integer); 
procedure Ex(AParametro: Integer;AParametro2: String); 
procedure Ex(AParametro: Integer ; AParametro2: String); 
```

##### **Matrizes**

<p class="callout success">**Correto**</p>

```PASCAL
LTeste := LMatriz[0];
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
LTeste := LMatriz[ 0]; 
LTeste := LMatriz[0 ]; 
LTeste := LMatriz[ 0 ];
```

##### **Operadores binários**

<p class="callout success">**Correto**</p>

```PASCAL
LTeste := 1 + 1;
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
LTeste := 1+1; 
LTeste := 1 +1; 
LTeste := 1+ 1; 
```

##### **Operadores unários**

<p class="callout success">**Correto**</p>

```PASCAL
LTeste := -1;
```

<p class="callout danger">**Incorreto**</p>

```PASCAL
LTeste := - 1; 
LTeste :=-1; 
```

##### **Subrotinas**

<p class="callout success">**Correto**</p>

```PASCAL
function MeuMetodo: String;

    procedure SubMetodo;
    begin
      //Código SubMetodo
    end;
    
begin
  //Código MeuMetodo
end;
```

<p class="callout danger">Incorreto</p>

```PASCAL
function MeuMetodo: String;

procedure SubMetodo;
begin
  //Código SubMetodo
end;
begin
  //Código MeuMetodo
end;
```

```PASCAL
function MeuMetodo: String;

  procedure SubMetodo;
  begin
    //Código SubMetodo
  end;
  
begin
  //Código MeuMetodo
end;
```

##### **Uses**

<p class="callout info">**Dica:** Para identificar se uma unit deve ser declarada na uses superior ou inferior, realize o seguinte teste: Copie a unit para a uses inferior e compile o programa, caso o processo de compilação não apresente erros, a unit deve permanecer na uses inferior. Caso contrário, mova a unit para a uses superior.</p>

**<span style="font-weight: 400;">No primeiro “uses“ (logo abaixo de “interface”) declarar as units no .dfm e nas assinaturas dos métodos.</span>**

```Pascal
interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs;
```

<span style="font-weight: 400;">No segundo “uses“ (logo abaixo de “implementation”) declarar as units usadas na implementação do código.</span>

```Pascal
implementation

uses
  uExisteTabela,
  uProcuraRegistro,
  uGravaSistema;
```

<span style="font-weight: 400;">A fim de evitar conflito em Merge devido a alterações em mesma linha, cada Unit deve ser declarada em linha diferente. Esse erro costuma acontecer principalmente quando há refatoração ou exclusão de algum componente visual.</span>

<p class="callout success"><span style="font-weight: 400;">Correto</span></p>

```Pascal
implementation

uses
  uExisteTabela,
  uProcuraRegistro,
  uGravaSistema;
```

<p class="callout danger">Incorreto</p>

```Pascal
implementation

uses
  uExisteTabela, uProcuraRegistro, uGravaSistema;
```

##### **Arrays** 

Ao indentar elementos de um array, eles devem seguir a lógica de ordenação de parênteses. Por não estarem em níveis diferentes de indentação, devem ser indentados da seguinte forma

<p class="callout success">Correto</p>

```Pascal
TClasse.Metodo(
  Parametro1,
  Parametro2,
  [Item1, Item2, Item3
   Item4, Item5, Item6]);
```

<p class="callout danger">Incorreto</p>

```Pascal
TClasse.Metodo(
  Parametro1,
  Parametro2,
  [Item1, Item2, Item3
     Item4, Item5, Item6]);
```

```
TClasse.Metodo(
  Parametro1,
  Parametro2,
  [Item1, Item2, Item3
  Item4, Item5, Item6]);
```

##### **IN em tratamento de condições**

<p class="callout success">Correto</p>

```PASCAL
Result :=
  (Self in 
     [cdfIncidenciadecisaojudicial,
      cdfIncidenciaDecisaoJudicial13Sal,
      cdfIncidenciaDecisaoJudicialAvisoPrevioIndenizado]);
```

<p class="callout danger">Incorreto</p>

```PASCAL
Result :=
  Self in [cdfIncidenciadecisaojudicial,
           cdfIncidenciaDecisaoJudicial13Sal,
           cdfIncidenciaDecisaoJudicialAvisoPrevioIndenizado];
```

```PASCAL
Result := (Self in [cdfIncidenciadecisaojudicial,
                    cdfIncidenciaDecisaoJudicial13Sal,
                    cdfIncidenciaDecisaoJudicialAvisoPrevioIndenizado]);
```

# Palavras reservadas

As palavras reservadas da linguagem Delphi devem ser escritas com todas as letras minúsculas, a única exceção é a palavra String, pois segue o padrão dos tipos, os quais iniciam com letra maiúscula. As palavras reservadas do Delphi são:

<table border="1" class="align-left" id="bkmrk-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-%E2%A0-" style="height: 945px; width: 60.1043%; border-collapse: collapse;"><tbody><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">absolute</td><td class="align-center" style="width: 33.3333%; height: 29px;">forward</td><td class="align-center" style="width: 33.3333%; height: 29px;">public</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">abstract</td><td class="align-center" style="width: 33.3333%; height: 29px;">function</td><td class="align-center" style="width: 33.3333%; height: 29px;">published</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">and</td><td class="align-center" style="width: 33.3333%; height: 29px;">goto</td><td class="align-center" style="width: 33.3333%; height: 29px;">raise</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">array</td><td class="align-center" style="width: 33.3333%; height: 29px;">if</td><td class="align-center" style="width: 33.3333%; height: 29px;">read</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">as</td><td class="align-center" style="width: 33.3333%; height: 29px;">implementation</td><td class="align-center" style="width: 33.3333%; height: 29px;">readonly</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">asm</td><td class="align-center" style="width: 33.3333%; height: 29px;">in</td><td class="align-center" style="width: 33.3333%; height: 29px;">record</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">assembler</td><td class="align-center" style="width: 33.3333%; height: 29px;">index</td><td class="align-center" style="width: 33.3333%; height: 29px;">register</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">automated</td><td class="align-center" style="width: 33.3333%; height: 29px;">inherited</td><td class="align-center" style="width: 33.3333%; height: 29px;">reintroduce</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">begin</td><td class="align-center" style="width: 33.3333%; height: 29px;">initialization</td><td class="align-center" style="width: 33.3333%; height: 29px;">repeat</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">case</td><td class="align-center" style="width: 33.3333%; height: 29px;">inline</td><td class="align-center" style="width: 33.3333%; height: 29px;">resourcestring</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">cdecl</td><td class="align-center" style="width: 33.3333%; height: 29px;">interface</td><td class="align-center" style="width: 33.3333%; height: 29px;">safecall</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">class</td><td class="align-center" style="width: 33.3333%; height: 29px;">is</td><td class="align-center" style="width: 33.3333%; height: 29px;">set</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">const</td><td class="align-center" style="width: 33.3333%; height: 29px;">label</td><td class="align-center" style="width: 33.3333%; height: 29px;">shl</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">constructor</td><td class="align-center" style="width: 33.3333%; height: 29px;">library</td><td class="align-center" style="width: 33.3333%; height: 29px;">shr</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">contains</td><td class="align-center" style="width: 33.3333%; height: 29px;">message</td><td class="align-center" style="width: 33.3333%; height: 29px;">stdcall</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">default</td><td class="align-center" style="width: 33.3333%; height: 29px;">mod</td><td class="align-center" style="width: 33.3333%; height: 29px;">stored</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">destructor</td><td class="align-center" style="width: 33.3333%; height: 29px;">name</td><td class="align-center" style="width: 33.3333%; height: 29px;">string</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">dispid</td><td class="align-center" style="width: 33.3333%; height: 29px;">near</td><td class="align-center" style="width: 33.3333%; height: 29px;">then</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">dispinterface</td><td class="align-center" style="width: 33.3333%; height: 29px;">nil</td><td class="align-center" style="width: 33.3333%; height: 29px;">threadvar</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">div</td><td class="align-center" style="width: 33.3333%; height: 29px;">not</td><td class="align-center" style="width: 33.3333%; height: 29px;">to</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">do</td><td class="align-center" style="width: 33.3333%; height: 29px;">object</td><td class="align-center" style="width: 33.3333%; height: 29px;">try</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">downto</td><td class="align-center" style="width: 33.3333%; height: 29px;">of</td><td class="align-center" style="width: 33.3333%; height: 29px;">type</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">dynamic</td><td class="align-center" style="width: 33.3333%; height: 29px;">operator</td><td class="align-center" style="width: 33.3333%; height: 29px;">unit</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">else</td><td class="align-center" style="width: 33.3333%; height: 29px;">or</td><td class="align-center" style="width: 33.3333%; height: 29px;">until</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">end</td><td class="align-center" style="width: 33.3333%; height: 29px;">out</td><td class="align-center" style="width: 33.3333%; height: 29px;">uses</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">except</td><td class="align-center" style="width: 33.3333%; height: 29px;">overload</td><td class="align-center" style="width: 33.3333%; height: 29px;">var</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">export</td><td class="align-center" style="width: 33.3333%; height: 29px;">override</td><td class="align-center" style="width: 33.3333%; height: 29px;">virtual</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">exports</td><td class="align-center" style="width: 33.3333%; height: 29px;">package</td><td class="align-center" style="width: 33.3333%; height: 29px;">while</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">external</td><td class="align-center" style="width: 33.3333%; height: 29px;">pascal</td><td class="align-center" style="width: 33.3333%; height: 29px;">write</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">far</td><td class="align-center" style="width: 33.3333%; height: 29px;">private</td><td class="align-center" style="width: 33.3333%; height: 29px;">writeonly</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">file</td><td class="align-center" style="width: 33.3333%; height: 29px;">procedure</td><td class="align-center" style="width: 33.3333%; height: 29px;">xor</td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">finally</td><td class="align-center" style="width: 33.3333%; height: 29px;">program</td><td class="align-center" style="width: 33.3333%; height: 29px;"> </td></tr><tr style="height: 29px;"><td class="align-center" style="width: 33.3333%; height: 29px;">for</td><td class="align-center" style="width: 33.3333%; height: 29px;">property</td><td class="align-center" style="width: 33.3333%; height: 29px;"> </td></tr></tbody></table>