Diferenças entre o DelphiScript e o Delphi
Diferenças entre o DelphiScript e o Delphi
Esta secção aborda as diferenças essenciais entre a linguagem de script DelphiScript e a linguagem de programação Delphi da Embarcadero, e como isso se aplica à API do Altium Designer.
O sistema de scripts do Altium Designer utiliza a linguagem DelphiScript sem tipos, pelo que não existem tipos de dados nos scripts. Embora seja possível declarar variáveis e os seus tipos, bem como especificar os tipos para funções/procedimentos ou parâmetros de métodos para facilitar a legibilidade, o DelphiScript converterá as variáveis não declaradas quando um script estiver a ser executado. Assim, por exemplo, não é possível definir registos ou classes.
Variáveis do DelphiScript
Todas as variáveis num script são do tipo Variant, e os tipos na declaração de uma variável são ignorados e podem ser omitidos. Assim, estas três declarações estão corretas:
Var a : Integer; Var b : Integer; Var c, d;
Os tipos dos parâmetros numa declaração de procedimento/função também são ignorados e podem ser omitidos. Por exemplo, este código está correto:
Function Sum(a, b) : Integer; Begin Result := a + b; End;
Em geral, os Variant podem ser utilizados para armazenar qualquer tipo de dados e realizar inúmeras operações e conversões de tipos. Um Variant é verificado quanto ao tipo e calculado em tempo de execução. O compilador não emite um aviso sobre possíveis erros no código, que só podem ser detetados através de testes exaustivos. Em geral, as partes do código que utilizam Variants podem ser consideradas código interpretado, uma vez que muitas operações só podem ser resolvidas em tempo de execução. Isto pode afetar a velocidade do código.
O resultado disto é que, uma vez que uma variável variante tenha sido declarada e tenha obtido um valor variante, pode ser copiada para qualquer tipo de dados compatível ou incompatível:
Var V; Begin // variable V can be assigned values of several different types: V := 10; V := 'Hello, World'; V := 45.55; End;
Se for atribuído um tipo de dados incompatível a uma variável, o interpretador do DelphiScript efetua uma conversão sempre que possível. Caso contrário, é emitido um erro em tempo de execução. Na prática, uma variante armazena informações de tipo juntamente com os dados, pelo que o DelphiScript é mais lento do que o código compilado equivalente do Embarcadero Delphi.
Conjuntos em scripts
O DelphiScript não possui tipos de conjunto nem suporta operadores de conjunto, ao contrário da linguagem Delphi, que possui tipos de conjunto e suporta operadores de conjunto.
Para utilizar conjuntos em scripts do DelphiScript, utilize as funções integradas que manipulam conjuntos num script.
Consulte a entrada «Utilizar conjuntos no DelphiScript» para obter mais informações
Funções ou procedimentos internos
Ao considerar a utilização de funções e procedimentos
O seguinte fragmento de função não é recomendado:
Function A Function B Begin // blah End; Begin B; End;
Estrutura de função recomendada:
Function B Begin // blah End; Function A Begin B; End;
Palavra-chave Result
Utilize a Result
Function Foo : String; Begin Result := 'Foo Foo'; End;
Rotinas aninhadas
As rotinas aninhadas são suportadas, mas as variáveis da função de nível superior não podem ser utilizadas a partir da rotina aninhada.
Elementos de matriz
O tipo dos elementos da matriz é ignorado e pode ser omitido, pelo que estas duas declarações são equivalentes:
Var x : array [1..2] of double; Var x : array [1..2];
Note que não é possível declarar tipos de matriz, mas pode-se declarar matrizes para variáveis.
Type TVertices = Array [1..50] Of TLocation; Var NewVertices : TVertices;
Var NewVertices : Array [1..50] of TLocation;
Declaração de varriga aberta
A Open Array
Palavra-chave «Case»
A Case
Case UserName of 'Alex', 'John' : IsAdministrator := true; 'Peter' : IsAdministrator := false; Else Raise('Unknown user'); End;
Declarações de classes
Não é possível definir novas classes no DelphiScript, mas pode utilizar classes existentes do DelphiScript e instanciá-las. Por exemplo, a TListTStringList
TList
TStringList
Função CreateObject
A CreateObject
Assim, em vez de:
Procedure Proc; Var l; Begin l := TList.Create; Try // do something with l Finally L.Free; End;
...pode escrever:
Procedure Proc; Var l; Begin l := CreateObject(TList); // Do something with l End;
FunçãoCreateObject.
Lançar exceções
A RaiseOn
Raise(Format('Invalid value : %d', [Height]));
Palavras-chave Try, Finally e Raise.
ThreadVar
No DelphiScript, a ThreadvarVarThreadvar
Operadores Set
O operador Set InInSet
If InSet(fsBold, Font.Style) then ShowMessage('Bold');
Note-se que os operadores de conjunto do Delphi +, -, *, =, >=MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet
ASet := BSet + CSet; \\ should be changed to ASet := SetUnion(BSet, CSet);
Os [...]MkSet
Font.Style := MkSet(fsBold, fsItalic);
Palavra-chave MkSet
Palavra-chave MkSetRange
Palavra-chave InSet
Palavra-chave SetDifference
Palavra-chave SetIntersection
Palavra-chave SetUnion
Palavra-chave SubSet
Palavra-chave InSet
Operadores
A ^@
Diretivas
As seguintes diretivas não são suportadas (note-se que algumas estão obsoletas e também não são suportadas pelo Embarcadero Delphi): absolute, abstract, assembler, automated, cdecl, contains, default, dispid, dynamic, export, external, far, implements, index, message, name, near, nodefault, overload, override, package, pascal, private protected, public, published, read, readonly, register, reintroduce, requires, resident, safecall, stdcall, stored, virtual, write, writeonly.
Além disso, note que a inUses
Palavras-chave ignoradas
A interfaceimplementationprogramunit
Palavras-chave não suportadas
As seguintes palavras-chave não são suportadas no DelphiScript:
-
as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline, interface, is, library, object, out, property, record, resourcestring, set, supports, type.
As seguintes funções RTL do Delphi não são suportadas no DelphiScript:
-
Abort, Addr, Assert, Dec, FillChar, Finalize, Hi, High, Inc, Initialize, Lo, Low, New, Ptr, SetString, SizeOf, Str, UniqueString, VarArrayRedim, VarArrayRef, VarCast, VarClear, VarCopy.
As funções da unidade Windows do Delphi (o windows.pasRGB
Utilização da API do Altium Designer em scripts
Não é possível criar os seus próprios tipos de registos ou classes utilizando o DelphiScript e instanciá-los num script; no entanto, pode utilizar determinadas classes da API do Altium Designer. Por exemplo, a TStringListTList
As interfaces de objeto da API que representam objetos do Altium Designer estão disponíveis para utilização em scripts. Por exemplo, é possível atualizar objetos de projeto em documentos de esquemático e PCB através da utilização das interfaces de objetos de esquemático e das interfaces de objetos de PCB.
Por convenção, os nomes das interfaces têm um «I» adicionado à frente do nome. Por exemplo, IPCB_Board
Exemplo de interfaces PCB num script:
Procedure ViaCreation; Var Board : IPCB_Board; Via : IPCB_Via; Begin Board := PCBServer.GetCurrentPCBBoard; If Board = Nil Then Exit; (\* Create a Via object\* ) Via := PCBServer.PCBObjectFactory(eViaObject, eNoDimension, eCreate_Default); Via.X := MilsToCoord(7500); Via.Y := MilsToCoord(7500); Via.Size := MilsToCoord(50); Via.HoleSize := MilsToCoord(20); Via.LowLayer := eTopLayer; Via.HighLayer := eBottomLayer; (* Put this via in the Board object*) Board.AddPCBObject(Via); End;
As seguintes APIs podem ser utilizadas em scripts:
- Certas funções e classes do Embarcadero Delphi™, bem como extensões do DelphiScript
- API do cliente
- API do servidor PCB
- API do servidor de esquemas
- API do servidor do Gestor de Espaço de Trabalho
- API da biblioteca integrada
- Funções da API do Altium Designer
- Processos paramétricos
Mais informações
Consulte os scripts na coleção de scripts para download para ver as interfaces e funções de objetos do Altium Designer, bem como os objetos e funções do Delphi utilizados nos scripts.
Consulte a documentação principal sobre scripts para obter informações sobre como escrever scripts para o Altium Designer.
Consulte o guia «Utilização da API do Altium Designer » para obter detalhes sobre como utilizar objetos de projeto e as suas interfaces nos seus scripts.
Consulte a «Referência da API do Altium Designer » para obter informações sobre o leque de APIs do Altium Designer e os seus objetos de interface para scripts.