# Script voorbeelden

Deze pagina verschaft je tips en voorbeelden voor script-fucnties.
You can also look at the three gereedschapvenster code from within the program.

## Algemeen

Laten we eerst in detail kijken naar de code voor de Goto-knop van de observatie gereedschappen.
Dit omvat veel van de basis van het programmeren.

De volledige script code ziet er uit als volgt:

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

Laten we ieder deel in detail bekijken:

    // Slew telescope

Dit is commentaar, je kun // {..} (*..*) gebruiken op je opmerkingen en commentaar te markeren.

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

Definieer de variabele die we later in het script gebruiken.
Belangrijke types van variabelen zijn: integer, double, string.
Het Tstringlist type wordt hier gebruikt om een commando te versturen naar Skychart.

      begin

Het begin van ons programma.

    memo_1.clear;

Maak het tekstvenster leeg waarin we onze berichten willen tonen. Dit is om er zeker van te zijn dat deze niet gevuld is met eerdere berichten.

      if MenuTelescopeConnect.checked then begin

We testen of het menu item MenuTelescopeConnect aangevinkt (“Checked”) is. Dat geeft aan dat de telescoopmontering verbonden is met het programma.
Als het resultaat “waar” is, dan voeren we het blok code uit vanaf “begin” tot het corresponderende “end”.

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

We proberen de RA in HMS formaat om te zetten van de tekst in Edit_1 tekstvenster naar een numerieke waarde. Als de omzetting niet lukt (bijvoorbeeld omdat we onzin getypt hebben in de tekstvenster), toon dan een foutbericht en beëindig uitvoering.

       a:=floattostr(ra);

Converteer de RA terug naar een string-weergave maar met het decimale formaat zoals vereist voor het commando.

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

Vraag een TStringList object op geïdentificeerd via STRL1. We wissen alle gegevens die in het object aanwezig zouden kunnen zijn.

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

Voeg het commando en de vereiste parameters toe (in dit geval RA en DEC) aan de stringlijst.

       r:=cmd('',c);

Voer het commando uit en sla het resultaat op in de variabele r.

    memo_1.lines.add(r);

Toon het resultaat van het commando in het tekstvenster.

    else memo_1.lines.add(rsTelescopeNot);

Als MenuTelescopeConnect.checked “onwaar” was, dan voeren we deze regel uit.
Het toont in het tekstvenster een vertaling op basis van de ingestelde taal van het bericht 'Telescoop niet verbonden'.

     end.

Het einde van het programma.

## Aanroepen van een externe bibliotheek (library)

Je kunt een functie definiëren in een externe library voor gebruik binnen je script alsof het een lokale functie is.

Dit voorbeeld implementeert een eenvoudige chronometer door gebruik te maken van de GetTickCount functie van de Windows API.
Er zijn twee knoppen, Start en Stop en er zijn twee tekstvensters. Een globale integer variabele is gebruikt om de starttijd op te slaan.

Script voor de Start knop:

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

Script voor de Stop knop:

    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.

Op deze manier kun je iedere library functie aanroepen, maar houdt er wel rekening mee dat dit systeem-afhankelijk is. De kernel32.dll library is niet beschikbaar op Mac of Linux.

Een andere beperking is dat veel library functies een pointer verwachten naar een parameter structuur. Wanneer de script-taal intern een byte-code gebruikt (zoals Java) dan kan het geen pointer gebruiken naar de gegeven parameters. Een oplossing is om een C-library wrapper te schrijven die de functie exporteert met een platte parameter-lijst.

## Direct gebruik maken van ASCOM

Dit beschrijft hoe je een ASCOM apparaat direct kunt gebruiken zonder gebruik te maken van de Skychart interne ASCOM telescoop.

Dit kan gebruikt worden voor toegang tot andere klassen van apparaten, zoals in het voorbeeld hier een koepel (dome). Je kunt het ook gebruiken voor toegevoegde eigenschappen van je telescoop.
In het laatste geval moet je voorzichtig zijn omdat je script gelijktijdig werkt met het Skychart hoofdprogramma voor toegang tot de apparatuur.

### Gebruik van de ASCOM kiezer

De volgende code stelt op een knop in welke ASCOM koepel driver we willen selecteren voor gebruik. De naam van de driver slaan we op en het tekstveld 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.

Vervang w:='Dome'; voor Telescope, Focuser, Rotator, Camera, Filter om een andere klasse van drivers te selecteren.

### Verbind met de ASCOM driver

De volgende code is voor de “Connect” knop. Het verbindt de ASCOM Dome driver die we eerder hebben geselecteerd. We gebruiken de globale variabele Dome1 om het ASCOM object op te slaan.

    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.

### Gebruik van de ASCOM driver

Nu willen we een knop toevoegen om het luik van de koepel te openen. Dit is slechts een voorbeeld, je zou hier iedere ASCOM-eigenschap kunnen gebruiken.
De eerste test beschermt ons tegen het vastlopen van het programma wanneer we een geïnitialiseerde variant zouden proberen te gebruiken.
De tweede test beschermt ons opnieuw tegen een ASCOM-fout wanneer de koepel niet verbonden is.

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

### Disconnect the ASCOM driver

Add a button to disconnect the driver and release the resources.

    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.

## Open a document

The following code open the Skychart documentation page in the default web browser.
You can use any document type with this function, the document open with the default application the same way as if you double click the document in the file explorer.

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

## Voer een commando uit

Er zijn twee verschillende manieren om een extern commando of programma uit te voeren, afhankelijk of je op een resultaat wilt wachten of niet.

### Wacht op een resultaat

Het volgende commando voert het DIR commando uit in de huidige directory. Het resultaat is opgeslagen in een string-lijst en wordt later getoond in een tekst memo. Het bevat de lijst van bestanden in de directory.

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

### Niet wachten op het resultaat

Wanneer het commando uitgevoerd kan worden voor een onbepaalde tijd of geen output zal produceren, dan heb je de volgende vorm nodig.
Dit voorbeeld voert het Variabele ster observator programma uit en stopt daarna direct.

    begin
      Run('varobs');
    end.