# Exemple de script

Aquesta pàgina dóna consells i exemples de funcions de scripting..
També podeu mirar en el codi de les tres caixa d'eines estàndard des de dins del programa. Per a més detalls sobre una funció específica vegeu la pàgina Referència d'scripts.

## Generalitats

Primer mirem amb detall al codi de la funció Goto (Vés a) de la eina “Eines de l'Observador de la caixa d'eines estàndard.
Això cobreix moltes bases de programació.

El codi de l'script complet es veu així:

    // Slew telescope
      var ra,de: double;
          a,b,r: string;
          c: Tstringlist;
      begin
      memo_1.clear;
      if MenuTelescopeConnect.checked then begin
        if not StrToAR(Edit_1.text,ra) then begin memo_1.lines.add(rserror+' RA!');exit;end;
        if not StrToDE(Edit_2.text,de) then begin memo_1.lines.add(rserror+' DE!');exit;end;
        a:=floattostr(ra);
        b:=floattostr(de);
        GetSL('STRL1',c);
        c.clear;
        c.add('SLEW');
        c.add(a);
        c.add(b);
        r:=cmd('',c);
        c.clear;
        memo_1.lines.add(r);
      end
      else memo_1.lines.add(rsTelescopeNot);
      end.

Doneu una mirada a cada part amb detall:

    // Slew telescope

És un comentari, podeu usar // {..} (*..*) per incloure els vostres comentaris.

      var ra,de: double;
          a,b,r: string;
          c: Tstringlist;

Definim la variable que usarem més endavant en l'script.
Tipus importants de variables són: integer, double, string.
El tipus Tstringlist s'usa aquí per enviar una ordre a Skychart.

      begin

El començament del nostre programa.The start of our program.

    memo_1.clear;

Netejar la caixa de text ho usem per mostrar missatges. Això assegura que la caixa de textos no estigui plena de missatges anteriors.

      if MenuTelescopeConnect.checked then begin

Comprovem la propietat Checked de l'ítem del menú MenuTelescopeConnect. Això ens indica que hem connectat el telescopi al programa.
Si el resultat és veritat (true) executem el bloc de codi que comença a “begin” fins el corresponent “end”.

        if not StrToAR(Edit_1.text,ra) then begin memo_1.lines.add(rserror+' RA!');exit;end;

Provem de convertir la AR en format HMS des del text en Edit_1 en la caixa de text a un valor numèric. Si la conversió falla (per haver teclejat un error en la caixa de text) veiem un missatge d'error i se surt.

       a:=floattostr(ra);

Convertim de nou la AR a representació en text, però en el format decimal que demana l'ordre.

    GetSL('STRL1',c);
    c.clear;

Creem una instància de l'objecte TStringList identificada per STRL1. Netegem que podrien romandre en l'objecte.

        c.add('SLEW');
        c.add(a);
        c.add(b);

Afegim l'ordre i els paràmetres que calen ( en aquest cas AR i DEC) a la llista de cadena (stringlist).

       r:=cmd('',c);

Executa l'ordre i desa el resultat en la variable r.

    memo_1.lines.add(r);

Mostra el resultat del comandament a la caixa de text.

    else memo_1.lines.add(rsTelescopeNot);

En el cas que la prova MenuTelescopeConnect.checked doni fals s'executa aquesta línia.
Mostra en la caixa de text una traducció en l'idioma local de 'Telescopi no connectat'.

     end.

El final del programa.

## Cridar una llibreria externa

Podeu definir una funció en una llibreria externa per usar-la en l'script com una altra funció local.

Aquest exemple implementa un cronòmetre senzill utilitzant la funció GetTickCount de les API del Windows.
Hi ha dos botons Inici i Parada i dues caixes de text. S'usa una variable entera global (global integer) per desar l'hora inicial.

Script per al botó Inici:

     function GetTickCount: Longint; external 'GetTickCount@kernel32.dll stdcall';
     var
       tick: Longint;
     begin
       tick:=GetTickCount;
       setI('Int1',tick);
       edit_1.text:='Started';
     end.

Script per al botó Parada:

    function GetTickCount: Longint; external 'GetTickCount@kernel32.dll stdcall';
    var
      t: double;
      t1,tick: Longint;
    begin
      tick:=GetTickCount;
      getI('Int1',t1);
      t:=double(tick-t1)/1000;
      edit_1.text:='';
      edit_2.text:=formatdatetime('HH:MM:SS.ZZZ',t/24/3600);
    end.

Podeu invocar qualsevol funció de llibreria d'aquesta manera, però compte que això és dependent del sistema: la llibreria kernel32.dll library no exiteix en Mac o Linux.

Una altra limitació és que moltes funcions de llibreria esperen un punter a una estructura de paràmetres. Ja que el llenguatge de l'script usa internament codi en bytes (com Java), llavors no pot usar un punter per donar els paràmetres. Una solució és escriure una llibreria de dipòsit en C que exporti la funció om una llista paramètrica plana.

## Usant ASCOM directament

Aquí es descriu com usar un aparell ASCOM directament des del vostre script sense fer ús del telescopi ASCOM intern de Skychart.

Això pot ser usat per accedir a una altra classe d'aparell. Aquest exemple connecta a una cúpula, o accedeix a propietats addicionals per al vostre telescopi.
En el darrer cas heu de tenir cura que l'script treballi com a un concurrent a Skychart per accedir a l'aparell.

### Ús del selector ASCOM

El codi següent assignat a un botó permet seleccionar el controlador de cúpula ASCOM que volem utilitzar. El nom del controlador es desa en el camp de text Edit_1.

     var
       V: variant;
       w,s: widestring;
     begin
       V := CreateOleObject('ASCOM.Utilities.Chooser');
       w:='Dome';
       V.DeviceType:=w;
       s:=edit_1.text;
       s:=V.Choose(s);
       edit_1.text:=s;
       V:=Unassigned;
     end.

Remplaceu w:='Dome'; per Telescope, Focuser, Rotator, Camera, Filter per seleccionar una altra classe de controlador.

### Connectar al controlador ASCOM

El codi següent és per al botó “Connecta”. Connectarà al controlador ASCOM de cúpula que havíem triat abans. Usem la variable global Dome1 per desar l'objecte ASCOM.

    var
      D: variant;
      s: widestring;
    begin
      s:=edit_1.text;
      getV('Dome1',D);
      if VarIsEmpty(D) then
        D := CreateOleObject(s);
      D.connected:=true;
      setV('Dome1',D);
    end.

### Usar el controlador ASCOM

Ara volem afegir un botó per obrir l'interruptor de la cúpula. Això és sols un exemple, en aquest punt qualsevol propietat ASCOM pot ser usada.
La primera prova protegeix contra una caiguda del programa si provem d'usar una variant inicialitzada.
La segona prova protegeix un altre cop un error ASCOM si la cúpula no estes connectada.

    var
      D: variant;
    begin
      getV('Dome1',D);
      if (not VarIsEmpty(D)) then
        if D.Connected then
           D.OpenShutter;
    end.

### Desconnectar el controlador ASCOM

Afegir un botó per desconnectar el controlador i alliberar recursos.

    var
      D: variant;
    begin
      getV('Dome1',D);
      if (not VarIsEmpty(D)) then
        if D.Connected then
           D.connected:=false;
      D:=Unassigned;
      setV('Dome1',D);
    end.

## Obrir un document

El codi que segueix obre la pàgina de documentació de Cartes del Cel en el navegador web per defecte.
Podeu usar qualsevol tipus de document amb aquesta funció. El document s'obrirà amb el navegador de la mateixa manera que si hi féssiu doble clic amb l'explorador.

    begin
      OpenFile('doc\wiki_doc\en\documentation\start.html');
    end.
    <code>

    ===== Donar una ordre =====

    Hi ha dues maneres d'activar una ordre externa o un programa, depenent de si espereu veure el resultat o no.

    ==== Esperar el resultat ====

    El següent comandament dóna l'ordre DIR en el directori actual. El resultat es guarda en una llista de cadena i més tard es mostra com un text. Conté el llistat de fitxers del directori.

    <code>
    var r:TstringList;
    begin
      GetSL('STRL1',r);
      r.clear;
      RunOutput('dir',r);
      Memo_1.lines.assign(r);
    end.

### No esperar

Si l'ordre pot rutllar per un temps indeterminat o no produeix cap info, llavors necessiteu usar la següent forma.
Aquest exemple fa anar el programa de l'observador d'estels variables i en surt immediatament.

    begin
      Run('varobs');
    end.