Dit is een oude revisie van het document!
Inhoud
This page is not fully translated, yet. Please help completing the translation.
(remove this paragraph once the translation is finished)
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.
Run a command
There is two different way to run an external command or program, depending if you want to wait for a result or not.
Wait for a result
The following command run the DIR command in the current directory. The result is stored in a stringlist and later show in a text memo. It contain the list of files in the directory.
var r:TstringList;
begin
GetSL('STRL1',r);
r.clear;
RunOutput('dir',r);
Memo_1.lines.assign(r);
end.
No wait
If the command can run for an undetermined time or do not produce an output you need to use the following form.
This example run the Variable star observer program and exit immediately.
begin
Run('varobs');
end.
