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#
Delphi Fenner Sem distinção de maiúsculas Sensí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 string Quatro 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 bits Até 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#
Delphi Fenner 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 classes Visibilidade 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 aninha O comentário com chaves aninha , como no Free Pascal. Léxico Literais 123, $FF També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#
Delphi Fenner 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 object Mais a chamada guardada Evento!(args) e o Delegate(T), que se desliga sozinho. Lambdas Genéricos em tipos e em métodos de classe També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ção Atributos gravados no RTTI externo (.rtti.json), lidos em compilação por meta modules.
Comandos e expressões#
Delphi Fenner Variáveis só no bloco var També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#
Delphi Fenner Compilador próprio, .dcu Código nativo via LLVM , ligação com lld embutido, nada de .dcu. Como funciona .bpl + .dcppackage → .dll + .fxd. Packages Opções no .dproj fc.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 erro O compilador ensina : um nome do Delphi vira uma mensagem que aponta o nome novo.
Biblioteca e ferramentas#
Delphi Fenner VCL WCL , com a mesma forma (TForm, Parent, Owner, OnClick)DFM lido em execução O desenho vira código (LoadComponents); o .fxf do RAD é a fonte da verdade. IDE RAD , escrito em FennerPascalScript FennerScript
Diferença do Delphi
Um bom roteiro para quem migra: 1) troque os tipos pelos de largura explícita (o compilador diz um a um); 2) escolha a cadeia de cada variável de texto (UString é o caminho do dia a dia); 3) deixe de chamar Free onde a contagem de referências já resolve; 4) use weak onde houver ciclo.