# Exemple de script

Cette page donne des conseils et des exemples de script.
Vous pouvez également regarder le code des boîte à outils standard à partir du programme.
Pour plus de détails sur une fonction spécifique, voir la page de référence des script.

## Généralités

Nous examinons d'abord en détail le code du bouton Goto de la boîte à outils standard pour l'observation.
Cela couvre de nombreuses bases de programmation.

Le code complet du script ressemble à ceci:

    // 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.

Regardons chaque partie en détail:

    // Slew telescope

C'est un commentaire, vous pouvez utiliser // {..} (*..*) pour marquer les commentaires.

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

Définit les variables que nous utiliserons plus loin dans le script.
Les types de variable important sont: integer, double, string.
Le type Tstringlist est utilisé pour envoyer des commandes à Cartes du Ciel.

      begin

Le début de notre programme.

    memo_1.clear;

Efface la zone de texte que nous utilisons pour afficher les messages. Cela garantit que la zone de texte n'est pas remplie par les messages précédents.

      if MenuTelescopeConnect.checked then begin

Nous testons la propriété Checked de l'élément de menu MenuTelescopeConnect. Ceci indique que nous avons connecté le télescope.
Si le résultat est vrai, nous exécutons le bloc de code commençant par “begin” jusqu'à “end” correspondant.

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

Nous essayons de convertir RA du format HMS de la zone de texte Edit_1 dans une valeur numérique. Si la conversion échoue (parce que nous tapons n'importe quoi dans la zone de texte) nous affichons un message d'erreur et nous quittons.

       a:=floattostr(ra);

Conversion de RA à nouveau en chaîne de caractères mais avec le format décimal requis par la commande.

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

Demande un objet TStringList identifié par STRL1. Nous effaçons toutes les données qui peuvent rester dans l'objet.

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

Ajoutez la commande et les paramètres requis (dans ce cas, RA et DEC) à la liste de chaînes.

       r:=cmd('',c);

Exécute la commande et stocke le résultat dans la variable r.

    memo_1.lines.add(r);

Affiche le résultat de la commande dans la zone de texte.

    else memo_1.lines.add(rsTelescopeNot);

Dans le cas où le test MenuTelescopeConnect.checked est faux, nous exécutons cette ligne.
Il affiche dans la zone de texte une traduction dans la langue locale de 'Télescope non connecté'.

     end.

La fin du programme.

## Appel d'une librairie externe

Vous pouvez définir une fonction dans une librairie externe à utiliser dans votre script comme une autre fonction locale.

Cet exemple implémente un chronomètre simple en utilisant la fonction GetTickCount de l'API Windows.
Il y a deux boutons Start et Stop et deux zone de texte. Une variable globale integer est utilisée pour stocker l'heure de début.

Script du bouton Start:

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

Script du bouton Stop:

    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.

Vous pouvez appeler n'importe quelle fonction d'un librairie de cette façon, mais méfiez-vous que cela dépend du système, la librairie kernel32.dll n'est pas disponible sur Mac ou Linux.

Une autre limitation est que beaucoup de fonctions de librairie attendent un pointeur vers une structure de paramètre. Comme le langage de script utilise un byte code en interne (comme Java), il ne peut pas utiliser un pointeur pour donner les paramètres. Une solution est d'écrire un wrapper en C qui exporte la fonction avec une liste de paramètres à plat.

## Utiliser ASCOM directement

Cela décrit comment utiliser un périphérique ASCOM directement à partir de votre script sans utiliser le télescope ASCOM de Cartes du Ciel.

Il peut être utilisé pour accéder à une autre classe de périphérique, l'exemple se connecte à un dôme, ou pour accéder à des propriétés supplémentaires de votre télescope.
Dans ce dernier cas, vous devez faire attention que votre script fonctionne en concurrent du programme principal pour l'accès au périphérique.

### Choisir un périphérique ASCOM

Le code suivant assigné à un bouton permet de sélectionner le pilote ASCOM Dome que nous voulons utiliser. Le nom du pilote est enregistré dans le champ de texte 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.

Remplacer w:='Dome'; par Telescope, Focuser, Rotator, Camera, Filter pour choisir un autre type de périphérique.

### Connecter le pilote ASCOM

Le code suivant est pour le bouton “Connecter”. Il se connecte au pilote ASCOM Dome que nous avons sélectionné précédemment. Nous utilisons la variable globale Dome1 pour stocker l'objet 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.

### Utilisation du pilote ASCOM

Maintenant, nous voulons ajouter un bouton pour ouvrir le volet du dôme. C'est juste un exemple, à ce stade, n'importe quelle propriété ASCOM peut être utilisée.
Le premier test protège d'un blocage du programme si nous essayons d'utiliser une variante non initialisée.
Le deuxième test protège d'une erreur ASCOM si le dôme n'est pas connecté.

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

### Déconnexion du pilote ASCOM

Ajout d'un bouton pour déconnecter le pilote et libérer les ressources.

    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.

## Ouvrir un document

Le code suivant ouvre la documentation de Cartes du Ciel dans le navigateur Web par défaut.
Vous pouvez utiliser n'importe quel type de document avec cette fonction, le document sera ouvert avec l'application par défaut de la même manière que si vous double-cliquez sur le document dans l'explorateur de fichiers.

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

## Exécuter une commande

Il existe deux façons différentes d'exécuter une commande externe ou un programme, selon si vous voulez attendre un résultat ou non.

### Avec attente du résultat

Le code suivant exécute la commande DIR dans le répertoire courant. Le résultat est stocké dans une liste de chaînes et affiché plus tard dans un mémo texte. Il contient la liste des fichiers du répertoire.

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

### Sans attente

Si la commande peut s'exécuter pendant un temps indéterminé ou ne produit pas un résultat, vous devez utiliser le code suivant.
Cet exemple exécute le programme “Variable star observer” et quitte immédiatement.

    begin
      Run('varobs');
    end.