Fenner
Referência

Diferenças do Delphi

O que muda para quem vem do Delphi ou do Pascal — e por que.

A sintaxe é a do Object Pascal, e muito código Delphi se lê sem esforço. Esta página reúne o que muda, agrupado por assunto. Cada item aponta para a página que o explica.

Nomes e tipos#

DelphiFenner
Sem distinção de maiúsculasSensível a maiúsculas. Nome ≠ nome; cada palavra reservada tem uma única grafia, e Exit, Break, Continue, True, False levam maiúscula inicial. Léxico
Integer, Cardinal, Byte, Word, Boolean, Double…O nome diz a largura: Int32, UInt32, UInt8, UInt16, Bool8, Float64… O nome antigo é um erro. Tipos, Do Delphi para o Fenner
Um tipo stringQuatro cadeias (LString, U8String, UString, WString); string não existe. Tipos
IntToStr, StrToIntDizem a cadeia: IntToUStr, IntToLStr, IntToU8Str, UStrToInt32…
Currency com 4 casasUma família Currency8 … Currency4096, de ponto fixo exato; o literal não passa por Float64.
Inteiros até 64 bitsAté 4096 bits, com aritmética nativa.
Enumerado sem escopo (Red)Escopo obrigatório (TColor.Red), exceto no rótulo de um case.

Estrutura de código#

DelphiFenner
unit com interface e implementationmodule sem as duas seções: cada declaração é public ou private (omissão: private). A unit clássica segue aceita. Módulos
Visibilidade só em classesVisibilidade também em módulos (public/protected/private) e em region.
end;Fechos qualificados opcionais (end class;, end function;), que o compilador confere.
Comentário { } não aninhaO comentário com chaves aninha, como no Free Pascal. Léxico
Literais 123, $FFTambém 1_000, 0b1010, 0o17, 0x1F.
Cadeia de várias linhas (Delphi 12)A mesma regra do recuo, e uma forma crua com crase.

Orientação a objetos#

DelphiFenner
Objetos liberados à mão (Free)Contagem de referências: o objeto morre quando a última referência some. weak, Ref e ChainRoot tratam ciclos e ligações. Memória
class helper for e record helper forhelper for para tudo; o helper ganha do tipo quando os dois declaram o mesmo nome (o contrário do Delphi). Classes
inherited chega ao ancestral imediatoTambém inherited TClasseA.Nome, que escolhe o degrau.
Eventos of objectMais a chamada guardada Evento!(args) e o Delegate(T), que se desliga sozinho. Lambdas
Genéricos em tipos e em métodos de classeTambém rotinas genéricas avulsas (function Larger<T>), com restrições; implementados por monomorfização. Genéricos
TTask.Run (PPL)async/await como forma da linguagem, sobre TTask<T> (hoje na RTL do compilador).
Atributos lidos por RTTI em execuçãoAtributos gravados no RTTI externo (.rtti.json), lidos em compilação por meta modules.

Comandos e expressões#

DelphiFenner
Variáveis só no bloco varTambém var X := V; e for var I := … no meio do bloco, e C: TCounter(10) (declarada e construída). Declarações
Break só do laço correnteBreak(nome) e Break(N) saem de laços de fora, com rótulo (for [outer] …).
withwith F() as W do, com apelido.
—Q, R := A divmod B;, for X downin …, if como valor, scase/icase para cadeias.
nil e AssignedO valor que pode não existir é um tipo: ?T, ??, ?., !, ?X. Nulos
raise Exception.Create('x')Também o atalho raise 'x'.

Compilação#

DelphiFenner
Compilador próprio, .dcuCódigo nativo via LLVM, ligação com lld embutido, nada de .dcu. Como funciona
.bpl + .dcppackage → .dll + .fxd. Packages
Opções no .dprojfc.config, <projeto>.config e .config.local, com escopo por plataforma e modo. Configuração
{$IFDEF}Também {$if} sobre tipos (Is(T, X), SizeOf(T)), {$macro}, late modules e meta modules. Diretivas, Metaprogramação
Mensagens de erroO compilador ensina: um nome do Delphi vira uma mensagem que aponta o nome novo.

Biblioteca e ferramentas#

DelphiFenner
VCLWCL, com a mesma forma (TForm, Parent, Owner, OnClick)
DFM lido em execuçãoO desenho vira código (LoadComponents); o .fxf do RAD é a fonte da verdade.
IDERAD, escrito em Fenner
PascalScriptFennerScript