Różnice między DelphiScript a Delphi

Różnice między DelphiScript a Delphi

Ta sekcja omawia kluczowe różnice między językiem skryptowym DelphiScript a językiem programowania Delphi firmy Embarcadero oraz to, jak przekłada się to na API Altium Designer.

System skryptów Altium Designer używa nietypowanego języka DelphiScript, więc w skryptach nie ma typów danych. Chociaż można deklarować zmienne i ich typy oraz określać typy dla funkcji/procedur lub parametrów metod dla czytelności, DelphiScript konwertuje niezadeklarowane zmienne podczas wykonywania skryptu. Dlatego na przykład nie można definiować rekordów ani klas.

Zmienne w Delphi Script

Wszystkie zmienne w skrypcie są typu Variant, a typy w deklaracji zmiennej są ignorowane i można je pominąć. Zatem te trzy deklaracje są poprawne:

Var
a : Integer;
 
Var
b : Integer;
 
Var
  c, d;

Typy parametrów w deklaracji procedury/funkcji również są ignorowane i można je pominąć. Na przykład ten kod jest poprawny:

Function Sum(a, b) : Integer;
Begin
  Result := a + b;
End;

Ogólnie rzecz biorąc, warianty (variants) mogą służyć do przechowywania dowolnego typu danych oraz wykonywania licznych operacji i konwersji typów. Wariant jest sprawdzany typowo i obliczany w czasie wykonania. Kompilator nie wyświetli ostrzeżenia o możliwych błędach w kodzie, które można wychwycić jedynie poprzez rozbudowane testy. Zasadniczo fragmenty kodu używające wariantów można traktować jako kod interpretowany, ponieważ wiele operacji nie może zostać rozstrzygniętych aż do czasu wykonania. Może to wpływać na szybkość działania kodu.

W efekcie, gdy zmienna typu variant zostanie zadeklarowana i otrzyma wartość wariantową, można ją skopiować do dowolnego kompatybilnego lub niekompatybilnego typu danych:

Var
V;
Begin
  // variable V can be assigned values of several different types:
  V := 10;
  V := 'Hello, World';
  V := 45.55;
End;

Jeśli do zmiennej przypisano niekompatybilny typ danych, interpreter DelphiScript wykonuje konwersję, o ile jest to możliwe. W przeciwnym razie zgłaszany jest błąd w czasie wykonania. W praktyce wariant przechowuje informację o typie wraz z danymi, więc DelphiScript jest wolniejszy niż równoważny skompilowany kod Embarcadero Delphi.

Zbiory w skryptach

DelphiScript nie ma typów Set i nie obsługuje operatorów Set, w przeciwieństwie do języka Delphi, który posiada typy Set i obsługuje operatory Set.

Aby używać zbiorów (Sets) w skryptach DelphiScript, należy korzystać z wbudowanych funkcji manipulujących zbiorami w skrypcie.

Zobacz wpis Using Sets in DelphiScript, aby uzyskać więcej informacji

Funkcje lub procedury wewnętrzne

Rozważając użycie funkcji i procedur inside a Function or Procedure, zalecanym podejściem jest pisanie samodzielnych (standalone) funkcji/procedur — chociaż procedury/funkcje rekurencyjne są dozwolone.

Poniższy fragment funkcji nie jest zalecany:

Function A
Function B
Begin
// blah
End;
Begin
B;
End;

Zalecana struktura funkcji:

Function B
Begin
// blah
End;

Function A
Begin
B;
End;

Słowo kluczowe Result

Użyj słowa kluczowego Result, aby ustawić wartość zwracaną wewnątrz bloku funkcji. Na przykład:

Function Foo : String;
Begin
Result := 'Foo Foo';
End;

Zagnieżdżone procedury/funkcje

Zagnieżdżone procedury/funkcje są obsługiwane, ale zmienne funkcji najwyższego poziomu nie mogą być używane w zagnieżdżonej.

Elementy tablicy

Typ elementów tablicy jest ignorowany i można go pominąć, więc te dwie deklaracje są równoważne:

Var
x : array [1..2] of double;

Var
x : array [1..2];

Zwróć uwagę, że nie można deklarować typów tablic, ale można deklarować tablice jako zmienne.

Illegal example:

Type
TVertices = Array [1..50] Of TLocation;
Var
NewVertices : TVertices;

Legal example:

Var
NewVertices : Array [1..50] of TLocation;

Deklaracja tablicy otwartej (Open Array)

Deklaracja Open Array nie jest obsługiwana.

Słowo kluczowe Case

Słowo kluczowe Case może być używane dla dowolnego typu. Zatem poniższe jest poprawne:


Case UserName of
'Alex', 'John' : IsAdministrator := true;
'Peter' : IsAdministrator := false;
Else
Raise('Unknown user');
End;

Deklaracje klas

W DelphiScript nie można definiować nowych klas, ale można używać istniejących klas DelphiScript i tworzyć ich instancje. Na przykład klasy TList i TStringList mogą być tworzone i używane w skryptach.
See also
TList
TStringList

Funkcja CreateObject

Funkcja CreateObject może być używana do tworzenia obiektów, które zostaną zwolnione niejawnie, gdy przestaną być używane.

Zatem zamiast:

Procedure Proc;
Var
  l;
Begin
    l := TList.Create;
  Try
    // do something with l
  Finally
  L.Free;
End;

...możesz napisać:

Procedure Proc;
Var
  l;
Begin
  l := CreateObject(TList);
  // Do something with l
End;

See also
Funkcja CreateObject.

Zgłaszanie wyjątków

Słowo kluczowe Raise może być użyte bez parametrów, aby ponownie zgłosić ostatni wyjątek. Raise może być również użyte z parametrem typu string, aby zgłosić wyjątek z określonym komunikatem. Obiekty Exception nie są obsługiwane w DelphiScript, ponieważ słowo kluczowe On nie jest obsługiwane.

Example:

Raise(Format('Invalid value : %d', [Height]));

See also
Słowa kluczowe Try, Finally i Raise.

ThreadVar

W Delphiscript słowo kluczowe Threadvar jest traktowane jako Var. Zwróć uwagę, że w Embarcadero Delphi zmienne zadeklarowane przy użyciu słowa kluczowego Threadvar mają odrębne wartości w każdym wątku.

Operatory zbiorów (Set)

Operator Set In nie jest obsługiwany. Operator InSet może być użyty do sprawdzenia, czy wartość jest elementem zbioru. Na przykład:

If InSet(fsBold, Font.Style) then
ShowMessage('Bold');

Zwróć uwagę, że operatory zbiorów Delphi +, -, *, <=, >= nie działają poprawnie. Zamiast tego używa się wbudowanych funkcji Delphiscript MkSet, MkSetRange, SetUnion, SetDifference, SetIntersection, SubSet and InSet:

ASet := BSet + CSet; \\ should be changed to
ASet := SetUnion(BSet, CSet);

Konstruktory zbiorów [...] nie są obsługiwane — użyj funkcji MkSet, aby utworzyć Set:

Font.Style := MkSet(fsBold, fsItalic); 

See also
MkSet keyword
MkSetRange keyword
InSet keyword
SetDifference keyword
SetIntersection keyword
SetUnion keyword
SubSet keyword
InSet keyword

Operatory

Operatory ^ i @ nie są obsługiwane.

Dyrektywy

Następujące dyrektywy nie są obsługiwane (zwróć uwagę, że niektóre są przestarzałe i nie są również obsługiwane przez 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.

Ponadto zwróć uwagę, że dyrektywa in w klauzuli Uses jest ignorowana.

Ignorowane słowa kluczowe

Słowa kluczowe interface, implementation, program i unit są ignorowane w DelphiScript. Skrypty mogą je zawierać, ale nie mają one żadnego efektu — jednak mogą poprawiać czytelność skryptów.

Nieobsługiwane słowa kluczowe

Następujące słowa kluczowe nie są obsługiwane w DelphiScript:

  • as, asm, class, dispinterface, exports, finalization, inherited, initialization, inline, interface, is, library, object, out, property, record, resourcestring, set, supports, type.

Następujące funkcje Delphi RTL nie są obsługiwane w DelphiScript:

  • Abort, Addr, Assert, Dec, FillChar, Finalize, Hi, High, Inc, Initialize, Lo, Low, New, Ptr, SetString, SizeOf, Str, UniqueString, VarArrayRedim, VarArrayRef, VarCast, VarClear, VarCopy.

Funkcje z jednostki Windows Delphi (plik windows.pas) nie są obsługiwane (na przykład funkcja RGB nie jest obsługiwana).

Używanie API Altium Designer w skryptach

Nie można tworzyć własnych typów rekordów ani klas przy użyciu DelphiScript i tworzyć ich instancji w skrypcie, jednak można używać niektórych klas z API Altium Designer. Na przykład klasy TStringList i TList mogą być tworzone i używane jako kontenery do przechowywania danych (zwykle tego samego typu), aby spełnić potrzeby skryptu.

Interfejsy obiektów API, które reprezentują obiekty Altium Designer, są dostępne do użycia w skryptach. Na przykład masz możliwość aktualizowania obiektów projektu w dokumentach schematu i PCB poprzez użycie interfejsów obiektów schematu oraz interfejsów obiektów PCB.

Zgodnie z konwencją nazwy interfejsów mają dodaną literę „I” na początku nazwy. Na przykład IPCB_Board reprezentuje interfejs dla istniejącego dokumentu PCB.

Przykład interfejsów PCB w skrypcie:

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;

Następujące API mogą być używane w skryptach:

  • Niektóre funkcje i klasy Embarcadero Delphi™ oraz rozszerzenia DelphiScript
  • Client API
  • PCB Server API
  • Schematic Server API
  • Workspace Manager Server API
  • Integrated Library API
  • Funkcje API Altium Designer
  • Procesy parametryczne

Więcej informacji

Sprawdź skrypty w downloadable kolekcji skryptów, aby zobaczyć interfejsy obiektów i funkcje Altium Designer, a także obiekty i funkcje Delphi używane w skryptach.

Zapoznaj się z główną dokumentacją Scripting, aby uzyskać informacje o pisaniu skryptów dla Altium Designer.

Zapoznaj się z przewodnikiem Using the Altium Designer API, aby poznać szczegóły dotyczące używania obiektów projektu i ich interfejsów w skryptach.

Zapoznaj się z Altium Designer API Reference, aby uzyskać informacje o zakresie API Altium Designer i jego obiektach interfejsów dla skryptów.

AI-LocalizedTłumaczenie SI
Jeśli znajdziesz błąd, zaznacz tekst/obraz i naciśnij Ctrl + Enter aby wysłać nam wiadomość.
Feature Availability

The features available to you depend on which Altium solution you have – Altium Develop, an edition of Altium Agile (Agile Teams or Agile Enterprise), or Altium Designer (on active term).

If you don’t see a discussed feature in your software, contact Altium Sales to find out more.

Legacy Documentation

Altium Designer documentation is no longer versioned. If you need to access documentation for older versions of Altium Designer, visit the Legacy Documentation section of the Other Installers page.

Content