Get it on Google Play Infinity-Profan

Infinity [Profan]

Programmiersprache für Android-APPs.



SCHNELLEINSTIEG - SO GEHT ES.[Diskussion]

1Lizenz erwerben (14,95 € inkl. MwSt., kein Versand):  [...]  , eventuell im Bundle mit dem Buch  [...]  .

2Infinity-Profan-Receiver starten (direkt erhältlich  [...]  oder Google-Play:  [...]  )  und das erworbene Entwicklerzertifikat (abrufbar in Mein-XProfan → Zertifikate  [...]  )  eingeben.

3IDE im Browser öffnen:  [...]  ; ein Projekt anlegen, öffnen und Shift+F5 betätigen (bzw. im Menü Kompilierer den Punkt Kompilieren, Linken & Ausführen wählen) , um das Programm zu kompilieren und an das/ die Handy/s mit verbundenem Infinity-Profan-Receiver zu übertragen für Installation und Starten der APP.

4Hello World mit Infinity-Profan:
print "Hello World"

SUPPORT & FAQ[Diskussion]

Dokumentation wird momentan überarbeitet!


Infinity-Profan ist eine Programmiersprache für Android, mit der man klassisch programmieren kann.

Sie funktioniert mit einen On-Demand Kompilierer und einer Online-IDE, etwa um auf jedem Gerät und überall programmieren zu können, also auch auf dem Smartphone selbst für Smartphones.

Wichtigste Fragen und Antworten haben wir bei den FAQ gelistet:  [...] 

Infinity-Profans Quelltext-Syntax ist einfach toll. Sie bietet einerseits die Vorteile aus Java/ C, aber auch aus PHP, JS und XProfan/ Basic und verfolgt dieses Konzept bis hin zu einer sinnvollen und optimierten Programmiersprache, die auch jeder einfach tippen und einfach erlernen kann.

Zudem besitzt Infinity-Profan einen völlig neuen Operator, den "Space-Operator"  [...]  was die ohnehin einfache Syntax nochmals deutlich vereinfacht.

Hinweise für Programmier-Einsteiger:

Die Auswertung der Argumente erfolgt nicht wie in Basic, sondern wie in Java/ PHP/ C, denn hier gilt eine Syntax etwas weg vom Basic hin zu höheren Sprachen:

Basic/ XProfan:
if a=b


Infinity-Profan:
if a==b


Das einfache Gleichheitszeichen ist immer ein Zuweiser, das Doppelte vergleicht die Werte (wie bei Basic das einfache Gleichheitszeichen).

XProfan/ Basic:
if a=b


Infinity-Profan:
if a==b


Bitte auch die Unterschiede zwischen den Operatoren & und && und = und == und === einsehen  [...] 


DATEIENDUNGEN[Diskussion]

§ 3 - Dateiendungen

Für Infinity-Profan gelten die folgenden Dateiendungen/ Typen:

APPAndroid/ Infinity-Profan ProgramQuelltext der Hauptprogrammdatei
APIAndroid/ Infinity-Profan IncludeQuelltext einer Include  [...] 
APKAndroid/ Infinity-Profan KompilatDas fertige und weitergabefähige Programmpaket.

DATENTYPEN[Diskussion]

§ 5 - Datentypen

nullkann nur null sein (Prozeduren-Parameter unterladener Prozeduren sind z.B. null)
boolboolean, kann true oder false sein
longganzzahliger Zahlenwert, -9223372036854775808 bis 9223372036854775807
floatFließkommazahl
stringZeichenkette
arrayDatenkette

Typenkonvertierung:

Der komplexere Typ bestimmt den Typ des Ergebnisses, damit meist ohne Datenverlust konvertiert werden kann. Als "komplexer" gilt in dieser Reihenfolge: Array, String, Float, Long, Bool, Null

Siehe auch:



Keywords: Datentypen, Variablen, Typen

OPERATOREN[Diskussion]

§ 7 - Operatoren

+Addition
++Increment
+=Increment um X
-Subtraktion
--Decrement
-=Decrement um X
*Multiplikation
/Division
\Division (ganzzahlig)
%Modulo (Divisionsrest)
^Potenz
|or (binär)
||or (logisch)
&and (binär)
&&and (logisch)
!NOT
<<bitshift left
>>bitshift right
<kleiner
<=kleiner gleich
>größer
>=größer gleich
<>ungleich
!=ungleich
=Wert-Zuweisung
==gleich (Vergleich)
===absolut gleich (Vergleich ob Wert und Typ übereinstimmen)
?:Ternärer Operator, a==b?10:20, wenn a gleich b ist, dann 10 sonst 20.
Space-Operator (Freizeichen), eigentlich kein Operator sondern eine Sprach/ Syntaxeigenschaft, näheres dazu unter:  [...] 

KONTROLLSTRUKTUREN[Diskussion]

§ 8 - Kontrollstrukturen
KompilierenMarkierenSeparieren
select, caseof, otherwise, endselect werden später unterstützt

VARIABLEN[Diskussion]

Variablen werden automatisch deklariert. Sie sind lokal und typen-dynamisch.

Der Wertetyp einer Variablen entspricht immer dem Werte-Type der letzten Zuweisung.
i=1// nun i Typ long
i="Hallo"//  nun i Typ string
i=1.1//  nun i Typ float

Es können auch in einem Rutsch komplexe Strukturen definiert werden:
myvar=[
"wald1"=[
"äpfel"=20
"birnen"=30
]
"stadt"=[
"autos"=20
"züge"=[

]
]

Das Selbe mit OOP-Schreibweise:

Möglichkeiten bei numerischen Schlüsseln:
a=[10,20,30]
a.3=40
print a.0

Jedoch:
b=5
print a.b//entspricht nicht a.5 sondern a["b"]
//
print a[b]//entspricht a[5]

Stringkonstanten können mit " sowie - was recht praktisch ist - mit ' umschlossen definiert werden.
s="Hallo"
s='Hallo'

Für Arrays einfach in eckiger Klammer kommagetrennte Werte: [10,20,30,...]  
a=[10,20,30]

Wird auf eine Stringvariable wie ein Array zugegriffen per eckicke Klammern so kann auf jedes einzelne Zeichen zurückgegriffen werden als wäre der String ein CharArray:
a="test"
print a[2]//gibt s aus
//auch Möglich:
print "test"[2]// gibt s aus

Hinweis: Assoziative Arrays mit OOP-Schreibweise nutzen:
a.groove.beat=10
// entspricht
a["groove"]["beat"]=10

Datentyp einer Variablen ermitteln:
a=5
case °a == "long" :

Siehe auch: § 5 - Datentypen

SYNTAX[Diskussion]

§10 - Syntax

Die Syntax ist bewusst auf Praktikabilität getrimmt.

Zeilen-Enden und Semikolon trennen Befehle, ausgenommen eine Klammerung oder String-Konstante ragt über weitere Zeilen.
//Beispiele für zeilenweises- und zeilenübergreifendes Schreiben:
print "Dies ist
ein Text mit einer
Stringkonstante mit
Zeilenumbrüchen"
print "Dies ist\nein Text mit einer \nStringkonstante mit\nZeilenumbrüchen."
print 10+20;print 30+40
print 10+20
print 30+40
print (10
+20
+30)
print (10+20+30)

Befehle und Funktionen können als Befehl oder Funktion formuliert werden, z.B. print 123 oder print(123).

Variablensyntax:
a=10
a=10,b=10
a=10 b=10

Arrays (und Assoziative):
a[0]=10
a.0=10
//
a["test"]["test"]=10
a.test.test=10
//
b=[10,20,30]
//
c=["Hallo"=10,"Welt"=["pt2"=20,"pt3"=30]]

DATEIFUNKTIONEN[Diskussion]

Dateifunktionen

Hinweise:

Das Dateisystem verlangt korrekte Groß/Kleinschreibung bei Datei- und Verzeichnisnamen.

Das Dateisystem kann nicht - wie Windows auch nicht - in einem Ordner einen Ordner und eine gleichnamige Datei erstellen/ beinhalten.

NETZWERKFUNKTIONEN[Diskussion]

Netzwerkfunktionen

TIMING & THREADS[Diskussion]

§23 - Timing & Threads

DATUM UND UHRZEIT[Diskussion]

§29 - Datum und Uhrzeit
KompilierenMarkierenSeparieren

STRING-FUNKTIONEN[Diskussion]

§35 - String-Funktionen

SENSOREN[Diskussion]

§40 - Sensoren

WERTETYPEN-UMWANDLUNGSFUNKTIONEN[Diskussion]

§47 - Wertetypen-Umwandlungsfunktionen

GUI, AUSGABEN, ZEICHNEN UND FARBEN[Diskussion]

§60 - GUI, Ausgaben, Zeichnen und Farben

GUI-Befehle, Funktionen und Erläuterungen zur Arbeitsweise von Infinity-Profan mit Fenstern und Controls.

FEHLERBEHANDLUNG[Diskussion]

§67 - Fehlerbehandlung

Im Fehlerfall wird die proc event asynchron aufgerufen mit id -1 und mit 2 Werten in Data: nr,msg: Eineindeutige Fehlernummer und Fehlerbeschreibung.

in der event-Proc:
case id==-1 : msg msg.box "ERROR #"+dta["nr"]+": "+dta["msg"]

KOMPILIERER DIREKTIVEN[Diskussion]

§68 - Kompilierer-Direktiven

$alias: Konstanten definieren
$launcher: APP mit Launcher/ Startseite-Fähigkeit

Kompilierer-Direktiven wirken nicht zur Laufzeit des Programms und steuern den Kompilierer. Sie stehen am Anfang einer Zeile und beginnen mit dem Dollar-Zeichen - sie werden in der Regel im Programmkopf angewiesen.

$launcherIst $launcher gesetzt, dann erhält die APP ein spezielles Flag, dass es erlaubt, dass die APP als Launcher (in den Einstellungen oft auch "Startseite" genannt) gelistet und ausgeführt werden kann. Damit kann man APPs herstellen, die den gesamten Desktop austauschen.

Beispiel:
// my Programm
 $launcher
cls
print "Mayn Launcher"

$aliasMit $alias kann man Konstanten definieren:
 $alias tue print
 $alias test 5*20
//
tue "Hallo Welt"// wird zu print "Hallo Welt"
tue test// wird zu print 5*20

KOMPILIERER FEHLERMELDUNGEN[Diskussion]

§69 - Kompilierer Fehlermeldungen

ERROR #1: 'include-in-include' recursion.
Meist eine Include die eine Ursprungs-Include inkludiert.

ERROR #2: include not found/ available: ...
Die per include-Anweisung angegebene Include konnte nicht im Projekt gefunden werden.

ERROR #3: invalid proc name: proc ...
Der Name der Prozedur entspricht nicht den Syntaxkriterien oder Name bereits durch Befehlssatz belegt.

ERROR #4: invalid parameter name ... at proc ..., parameter name match proc name ...
Der Name der Parameter-Variablen bereits durch Befehlssatz oder durch einen Proc-Namen belegt.

ERROR #5: invalid parameter name ... at proc ..., parameter name does not match syntax criteria.
Der Name der Parameter-Variablen entspricht nicht den Syntaxkriterien.

ERROR #6: invalid variable name or does not match syntax criteria: ...
Der Name der Variablen entspricht nicht den Syntaxkriterien.

ERROR #11: Variable name ... already used by keyword in ... .
Der Name der Variable wird bereits durch den Befehlssatz oder durch eine eigene Proc belegt.

ERROR #12: Syntax recursion error, call a syntax doctor.
Der Quelltext kann wegen einer Rekursion nicht aufgelöst werden.

ERROR #13: Wrong If/Case Syntax in line ...
Die Syntax für If oder Case ist nicht schlüssig.

ERROR #14: Proc declaration syntax error: ...
Die Syntax hinter proc ist nicht korrekt.

ERROR #15: If syntax error: ...
Die Syntax hinter If ist nicht korrekt.

ERROR #16: Undefined: ...
Schlüsselwort nicht bekannt.

ERROR #17: Syntaxerror: ...
Fehler in der Syntax, z.B. Klammerfehler etc.

ERSTE SCHRITTE, HALLO WELT[Diskussion]

Infinity-Profans "Hallo Welt":
Print "Hallo Welt"

mehr ist nicht notwendig.

Um das Programm zu beenden (beenden, nicht nur in den Hintergrund verbannen!) ist bei diesem Beispiel lediglich das Drücken der "Zurück-Taste" notwendig die entweder Hardwareseitig vorliegt oder als Softbutton am Bildschirm angezeigt wird.

Möchte man die Funktion der Zurück-Taste überschreiben ggf. um zu vermeiden dass das Programm beim Drücken beendet wird, dann kann man einfach in der Funktion event eine eigene Abarbeitung deklarieren die bei jedem Druck der Zurück-Taste aufgerufen wird.

TODO[Diskussion]

§99 - ToDo

Accel(erometer)
contacts
for
ide
libs
sms
opengl
pic(ture)
sound

//

open -> exec

//

auto-permissions

//

CO40/80/120...., siehe auch  [...] 

//

zeromq verstehen/ ggf. einbinden..., siehe auch:  [...] 

//

xprofan.api umbenennen zu profan.api

ARR[Diskussion]

Funktionsgruppe für Array-Funktionen:

arr: multifunktional je nach Parameter
arr.count: Anzahl der Einträge
arr.reverse: Einträgereiheinfolgeumkehr
arr.serialize: Array->String
arr.unserialize: String->Array
arr.sort: alphanumerische Einträgesortierung
arr.sortnum: numerische Einträgesortierung
arr.usort: benutzerdefinierte Einträgesortierung

array = arr( { array | string [, string Trennzeichen] | array, array } )Kopiert (byVal) ein Array:

Verbindet beide Arrays:

Wandelt einen String in ein Array um:

Wandelt einen String in ein Array um, string2 wird als Trennzeichenkette verwendet:

Keywords: arr,array, explode, sort, reverse, copyarray

ARR.COUNT[Diskussion]

string = arr.count ( array )

Rückgabewert: Anzahl der Einträge im Array.

Hinweis: arr.count ist etwas schneller als len(array) weil die Prüfung ob String wegfällt.

Beispiel:
print arr.count([10,20,30,"test"])// 4

Keywords: length, count

ARR.REVERSE[Diskussion]

array = arr.reverse ( array )

Umkehr der Reihenfolge der Einträge.

ARR.SERIALIZE[Diskussion]

string = arr.serialize ( array )

Liefert eine String-Repräsentation der Inhalte von array, kompatibel mit php unserialize.

arr.unserialize bietet entsprechenden Rückweg.

ARR.SORT[Diskussion]

array = arr.sort ( array )

Alphanumerische Sortierung.

ARR.SORTNUM[Diskussion]

array = arr.sortnum ( array )

Numerische Sortierung.

ARR.UNSERIALIZE[Diskussion]

array = arr.unserialize ( string )

Wandelt eine String-Repräsentation in ein Array.

arr.serialize bietet entsprechenden Rückweg.

ARR.USORT[Diskussion]

array = arr.usort ( array , proc )

Benutzerdefinierte Suche mit eigener Callback-Proc.

Beispiel:
proc mySort(a,b)

    return a>b

endproc

print arr.usort([50,20,0],@mySort)//gibt 0,20,50 aus

AUDIO[Diskussion]

Die Funktionsgruppe audio für Audio-Funktionen.

audio.beep

Keywords: Beep, Musik, Sound, Play

AUDIO.BEEP[Diskussion]

audio.beep

Erzeugt einen kurzen Piep-Ton.

Beispiel:

CHR[Diskussion]

string = chr ( long )

Liefert das Zeichen long als String zurück, 65 = A.

Keywords: chr

CLS[Diskussion]

cls ( [ long HintergrFarbe ] )

Löscht den Print-Bildschirm und - optional - setzt eine Hintergrundfarbe.

Keywords: clear,cls

DEV[Diskussion]

{...} = dev[.*] ( ...

Die Funktionsgruppe dev stellt die Funktionen geräteabhängig dar:

dev
dev.audio
dev.battery
dev.bluetooth
dev.cam
dev.file
dev.gps
dev.internet.http
dev.lights
dev.phone
dev.screen
dev.screen.gui
dev.screen.gui.msg
dev.thread

Keywords: device, kernel, region, language, cpu, ram, battery, Geräte-Eigenschaften

string = dev ( [ long modi ] )Liefert grundsätzliche Eigenschaften des Gerätes, Kernelversion etc.

Ohne Angabe von Parametern:

Liefert grundsätzliche Eigenschaften des Gerätes als assoziatives Array
mit folgenden Schlüsseln:

kernelversion //z.B. 3.4.67
osversion //z.B. 4.4.2
osbuildversion //z.B. eng.root.1409140825
userregion //z.B. DE
userlanguage //z.B. de
httpagent //z.B. Dalvik/ Linux, Android 4.4.2, ..
opensslversion //z.B. OpenSSL 1.0.1c
zlibversion //z.B. 1.2.6
cpuarchitecture //z.B. armv71
javaruntimeversion //z.B. 0.9
osbuildversion //z.B. eng.root.1409140825
apilevel //z.B. 19
device //z.B. GT-N7000
modell //z.B. GT-N7000
productid // z.B. JZ054K.N700000XLT4
fingerprint // z.B. samsung/gt-n7000...
hardware //z.B. smdk4210
brand //z.B. samsung
manufacturer //z.B. samsung
serial //z.B: 234098230948MNSAB234234
processorname //z.B. ARMv7 Processor rev 1
processors //z.B. [1592,2786] // ein Array mit BogoMips (Geschwindigkeit) vorhandener Prozessoren
processorfeatures //ein Array mit Prozessorfeatures
memory //ein assoz. Array mit verschiedensten Speichergrößeninformationen
batterylevel //z.B. 100
batterymaxlevel //z.B. 100
batterypresent
batterycharging
batteryhealth
batterytechnology
batterytemperature
batterypwrsupply
batterystatus

DEV.AUDIO[Diskussion]

Die Funktionsgruppe dev.audio ist auch unter audio erreichbar.

DEV.BATTERY[Diskussion]

Noch nicht implementiert.

DEV.BLUETOOTH[Diskussion]

Noch nicht implementiert.

DEV.CAM[Diskussion]

Noch nicht implementiert.

DEV.FILE[Diskussion]

Die Funktion dev.file ist auch über file erreichbar.

DEV.GPS[Diskussion]

{ null | long | array } = dev.gps [ ( [ bool aktiv ] ) ]  

Die Funktion dev.gps bietet Möglichkeiten für die Positionsermittlung, Positionsdaten stehen einfach in array = dev.gps(). Die Positionsermittlung kann mit dev.gps(true) aktiviert werden.

Hinweis: Normalerweise sieht Android es vor, dass es für verschiedene Möglichkeiten der Positionserkennung auch eigene Konstrukte gibt - so ist etwa die Erkennung über den Provider "Netzwerk" eine andere als die über GPS oder die über "WLAN". Infinity-Profan fasst alle diese Möglichkeiten zusammen und bietet einen einheitlichen Abruf. So kann auch eine genauere Position ermittelt werden ohne dass GPS explizit aktiviert wurde vom User.

Wird kein Parameter übergeben, dann erhält man dieses assoziatives Array mit den aktuellen Positionsinformationen:

Beispiel:
print "Ermittlung: "+(dev.gps(true)==true?"Aktiv":"konnte nicht aktiviert werden")// Erkennung aktivieren

proc event id dta

    case id==event.backkey : end

    if id==event.gps

        print "Positionsdaten:"
        print dta

    endif

endproc


Hinweis: Es wird das event event.gps an die proc event geliefert, gleich nach dem die Positionsermittlung einen Wert ermitteln konnte und fortlaufend. Positionswerte stehen dann im Array in data.

Schaltet der User GPS hinzu, dann ist die Position lediglich genauer (accuracy).

Wert Listen gibt wieder ob die Infinity-Profan-Positionsbestimmung aktiviert ist oder nicht. Per array providers kann ermittelt werden, ob der User Positionsbestimmung überhaupt erlaubt und mindestens 1 Positions"provider" angezapft werden konnte.

Providers ist ein assoziatives Array mit Schlüsselnamen welche Methoden der Standortbestimmung angezapft werden konnten. Hat der User Standorterkennung deaktiviert dann ist das Array 0 Einträge groß.

Üben len(dev.gps()["providers "]) kann man demnach die Anzahl der verfügbaren Methoden ermitteln.

Im Array satelites stehen detailierte Informationen zu den angezapften Sateliten:

long id: interne Nr. des Sat
long signal: 0-99, Signalstärke zum Gerät
long azimuth: 0-360, Horizontalwinkel zum Gerät
long elevation: 0-90, Höhenwinkel zum Gerät


Üben len(dev.gps()["satelites"]) kann man demnach die Anzahl der akquirierten Satelliten ermitteln.

Keywords: GPS, Position, Location, Standort

DEV.INTERNET.HTTP[Diskussion]

string = dev.internet.http ( string url [, bool Sync = true [, { string file | proc Proc } [, array Werte]]])

Webserver/ URL-Abruf, läd und sendet Daten per http-Protokoll an Webserver.

Rückgabewert: String, Antwort des Websevers.
print dev.internet.http("http://ip.mxii.com")//gibt die WAN-IP aus

Optional, 2. Parameter true (default) oder false, ob synchron geladen werden soll. Bei false und ohne 3. optionalen Parameter wird der Inhalt nirgends hin geladen sondern rein der Abruf asynchron abgesetzt.

Dritter Parameter optional, Funktionsname oder Dateiname, je nach dem ob nach dem Download der heruntergeladene Inhalt an eine Funktion übergeben werden oder als Datei gespeichert werden soll.

Vierter Parameter kann ein Assoziatives Array sein mit Variablennamen und deren Werten, die per GET übergeben werden sollen.

Ist der 4. Parameter einfach nur ein String, dann wird der String base64-kodiert übertragen per Post in die serverseitig abrufbare Variable $_GET["data"]. Ist der 4. Parameter ein assoziatives Array, dann werden alle Werte übertragen per GET in die serverseitig abrufbaren Variable mit gleichem Namen wie die Schlüsselnamen im Array.

Keywords: http,download,dw.get

DEV.LIGHTS[Diskussion]

Noch nicht implementiert.

DEV.PHONE[Diskussion]

Verwendet, liefert oder setzt grundsätzliche Eigenschaften des Telefon-Modules:

dev.phone
dev.phone.call
dev.phone.calldialog

Keywords: EMEI, Telefonnr., Operator, Call, SMS

array = dev.phone ()Liefert ein assoziatives Array:

emei: die EMEI des Telefon-Interfaces
simserial: die Seriennummer der SIM-Karte
simstate: Status der Sim-Karte
phonenr: Telefonnummer
voicemailnr: Telefonnummer der Mobilbox
callstate: Anrufstatus
datastate: Datenverbindungsmodus der Sim-Karte
operator: Name des Netzanbieters (z.B. D1, EPlus, ...)

DEV.PHONE.CALL[Diskussion]

dev.phone.call ( string )

Ruft ohne weitere Interaktionen die Nummer string per Telefon-Modul.

DEV.PHONE.CALLDIALOG[Diskussion]

dev.phone.calldialog ( string )

Öffnet die Rufnummer String im Telefon-Modul.

DEV.SCREEN[Diskussion]

Die Funktion dev.screen ist auch über screen erreichbar.

DEV.SCREEN.GUI[Diskussion]

Die Funktion dev.screen.gui ist auch über gui erreichbar.

DEV.SCREEN.GUI.MSG[Diskussion]

Die Funktion dev.screen.gui.msg ist auch über msg erreichbar.

DEV.THREAD[Diskussion]

{ ... } = dev.thread[.* ( ...

Die Funktionsgruppe dev.thread bietet Funktionen für den Umgang mit Threads:

dev.thread
dev.thread.sleep: sleep
dev.thread.settimer: Timer setzen
dev.thread.killtimer: Timer entfernen

DEV.THREAD.KILLTIMER[Diskussion]

dev.thread.killtimer ( long timerhandle )

Löscht einen mit dev.thread.settimer erstellten Timer.

DEV.THREAD.SETTIMER[Diskussion]

long = dev.thread.settimer ( long ms , @proc , bool repeat , mixed userdata )

Rückgabewert: Handle des Timers

Hinweis: Wenn dev.thread.settimer scheitert, dann wird null zurückgegeben und nicht 0.

Diese Timer wirken in den Haupt-Thread injiziert und greifen sobald dieser idle ist.

Beispiele:

Proc nach 2000ms ausführen:

Alle 2000ms ausführen:

Timer beenden:

Zweiter Timer schaltet ersten Timer nach 2 Sekunden ab:

DEV.THREAD.SLEEP[Diskussion]

dev.thread.sleep ( long ms )

Hält den Hauptthread für ms Millisekunden an, wobei dev.thread.sleep 1000 eine Sekunde wartet.

Achtung: ganz ähnlich wie bei Windows hat dann das Programm auch keine Zeit für Anzeigen. Beispielsweise werden auch Print-Ausgaben erst ausgegeben wenn der Hauptthread wie idle ist und somit auch print "Hallo Welt" mit anschließendem dev.thread.sleep 5000 die Print-Ausgabe erst nach 5 Sekunden zeigt.

Wer eine Proc zeitversetzt ausführen möchte sollte besser die Funktion time(proc,ms) verwenden.

Keywords: sleep

EVENT[Diskussion]

proc event ( long id [, { long data | array data } ] )

Funktion event wird aufgerufen, sobald ein globales Event auftritt wie z.B. Drücken von Systemtasten oder ein Fehler.

Beispiel:
proc event id dta

    case id==event.backkey : end//back button
    print "Event:"+id
    case dta : print dta
    case id==event.error : msg.box "ERROR #"+dta["nr"]+": "+dta["msg"]

endproc


Übersicht der Event-IDs:

User-IDs sollten immer kleiner -1 sein.

-1: ERROR, ein Systemfehler ist aufgetreten:
data["nr"] und data["msg"] halten genauere Fehlerinformationen bereit
1: Zurücktaste (Hardware o. Softbutton) wurde betätigt
2: Menütaste (Hardware o. Softbutton) wurde betätigt


Events für Tastatur:

100: Taste wurde gedrückt, Tastencode in data
101: Taste wurde losgelassen, Tastencode in data


Events für Maus/ Fingerberührung auf Bildschirm:

200: Finger/Maus auf Display gesetzt
201: Finger/Maus auf Display bewegt
202: Finger/Maus von Display entfernt

In Data findet sich jeweils 1 assoziatives Array mit folgenden Schlüsseln:

long p = pointer = Finger (ID eines Fingers, 0..x)
float x = Position auf Bildschirm
float y = Position auf Bildschirm
float press: Druckstärke, bei Fingern meist 1.0
float size: die Aufdruckgröße
string devicename: Bezeichnung des Stiftes, sowas wie "sec_e-pen" bei Pens oder oder "sec_touchscreen" bei Finger
long deviceid = eindeutige Gerätenummer die nach Neustarts aber anders sein kann
string device = eindeutige GeräteID die auch Neustarts übersteht




1000: Resume, die APP wurde wieder in den Vordergrund geholt
1100: Fokusänderung, je nach Data ob APP wieder den Fokus hat oder ihn verloren hat etwa wegen Bedienung des Vorhanges etc.
1200: Konfigurationsänderung im Gerät: Bildschirmrotation oder Auflösungsänderung oder Hardwaretastatur an- /abgesteckt - ggf. siehe assoziatives Array data.
1250: Bildschirm wurde ein- oder ausgeschaltet je nach data.


Beispiel:
proc event

    if id == 1

        print "Zurücktaste gedrückt!!!"

    elseif id == 2

        print "Menütaste gedrückt!!!"

    elseif id == -1

        msg(0,"Fehler aufgetreten",data)

    else

        print "Diese ID ist nicht definiert: ",id

    endif

endproc


3000: GPS-Position oder Genauigkeit hat sich geändert, siehe assoziatives Array in data: listen, found, latitude,longitude,altitude, accuracy, bearing, speed, provider.


4000: Batterie-Informationen haben sich geändert. Erweiterte Batterieinformationen mit Funktion device() beziehen!


5000: Gerät wird heruntergefahren, ob Neustart steht in data
5100: Gerät Dockingstation-Event.


6000: Ein- oder Ausgehender Anruf, siehe assoziatives Array in data.


7000: Meldet, wenn ein asynchroner http-Download, dessen Inhalt nicht an eine Proc sondern in eine Datei umgeleitet werden soll, fertig ist.


8000: Betätigung eines Textfeldes oder eines Buttons.


Keywords: event,onbackpressed,onerror,onmenupressed,onkey,mouse,ontap,finger, battery, phonestate

EXEC[Diskussion]

{ ... } = exec[.* ( ...

Die Funktionsgruppe exec bietet Funktionen für den Umgang mit dem System, APPs und APK-Paketen.

exec: öffnet je nach URL-Protokoll (z.B. http:// für Browser)
exec.package: öffnet installierte APP (Package) z.B. "com.google.zxing.client.android"
exec.packageinstall: Installiert die APK Dateiname String
exec.packageslist: Liefert assoz. Array installierter APPs.
exec.system: Führt string oder array als Systembefehl(e) aus

Exec ohne Parameter liefert ein assoziatives Array mit Informationen über das eigene Package, siehe print exec()

Exec mit Parameter kann verwendet werden z.B. um den Browser zu öffnen exec("http://google.de") oder um "Maps" zu öffnen oder die Galerie etc., lässt das System entscheiden wie bzw. womit string geöffnet werden soll, wird i.d.R. anhand des URL-Protokolls entschieden.

URL-Protokolle die scheinbar gut mit exec("...") funktionieren:

http: öffnet eine Webseite
market: öffnet den Playstore (market://details?id=com.google.zxing.client.android)


Beispiel:

Exec ohne Parameter:
print exec()//liefert ein assoz. Array z.B. mit den Schlüsseln: pkgname, appname und buildcount.
// oder
print exec().pkgname

Keywords: exec, run, shellexec

FILE[Diskussion]

{ ... } = file.* ( ...

Die Funktionsgruppe file bietet Funktionen für den Umgang mit Dateien und Verzeichnissen bzw. dem Dateisystem:

file
file.chdir: Verzeichniswechsel
file.copy: Kopieren
file.del: Entfernen
file.direxists: Verzeichnisexistenz
file.diskfree: freier Datenträgerspeicher
file.disksize: Datenträgerkapazität
file.exists: Dateiexistenz
file.getdir: Arbeits- und Sonderverzeichnis(se)
file.list: Dateien und Ordner listen
file.mkdir: Verzeichnis erstellen
file.read: Datei lesen
file.size: Dateigröße
file.time: Dateizeit
file.write: Datei schreiben
file.zip: Dateien packen
file.unzip: Dateien entpacken

Keywords: fattr, fileexists, direxists, fsize, ftime, dirsize, disksize, diskfree

FILE.CHDIR[Diskussion]

bool = file.chdir ( string Verzeichnis )

Verzeichniswechsel nach string Verzeichnis.

Rückgabewert: Ob Verzeichniswechsel erfolgreich war.

Keywords: chdir

FILE.COPY[Diskussion]

bool = file.copy ( string Datei1, String Datei2 )

Kopiert Datei1 nach Datei2.

Rückgabewert: Erfolg der Operation.

FILE.DEL[Diskussion]

bool = file.del ( string { Dateiname | Verzeichnisname } )

Löscht Datei oder Verzeichnis und gibt zurück true/false ob Datei o. Verzeichnis nicht mehr existiert.
print file.del("meine.datei")

Keywords: fdel,rmdir

FILE.DIREXISTS[Diskussion]

bool = file.direxists( string )

Rückgabewert: Ob Verzeichnis string existiert.

FILE.DISKFREE[Diskussion]

long = file.diskfree()

Rückgabewert: Anzahl freier Bytes auf Datenträger.

FILE.DISKSIZE[Diskussion]

long = file.disksize( string )

Rückgabewert: Größe aktueller Datenträger in Bytes.

FILE.EXISTS[Diskussion]

bool = file.exists ( string )

Rückgabewert: Ob Datei string existiert.

FILE.GETDIR[Diskussion]

string = file.getdir()

Rückgabewert: Das aktuelle Arbeitsverzeichnis.

Siehe auch:

file.getdir.app: Basisverzeichnis der APP
file.getdir.appcache: Cacheverzeichnis der APP
file.getdir.appres: Zusatzdateien der APP
file.getdir.sdcard: SD-Karte
file.getdir.system: Android Systemverzeichnis (ANDROID_ROOT)

FILE.GETDIR.APP[Diskussion]

string = file.getdir.app()

Rückgabewert: Basisverzeichnis der APP plus "files/", (z.B. /data/data/myapp/files/) - also das Verzeichnis, in das eine AndroidAPP hineingestartet wird und wo sie ihre Dateien anlegen soll. Das ist auch das Verzeichnis, welches von chdir() gleich nach Programmstart zurückgeliefert würde.

FILE.GETDIR.APPCACHE[Diskussion]

string = file.getdir.appcache()

Rückgabewert: Cacheverzeichnis der APP (z.B. /data/data/myApp/cache/) - also das Verzeichnis, in das eine AndroidAPP Cache-Daten ablegen soll. Benutzer haben die Möglichkeit diese Daten zu löschen in der Systemsteuerung -> APPs -> myApp -> [Cache-Löschen].

FILE.GETDIR.APPRES[Diskussion]

string = file.getdir.appres()

Rückgabewert: Ressourcen-Verzeichnis der APP (z.B. /data/data/myApp/res/) - also das Verzeichnis, in das die bei der IDE in das Verzeichnis /res/ zusätzlich hochgeladenen Dateien abgelegt sind.

FILE.GETDIR.SDCARD[Diskussion]

string = file.getdir.sdcard()

Rückgabewert: Verzeichnis der SD-Karte.

FILE.GETDIR.SYSTEM[Diskussion]

string = file.getdir.system()

Rückgabewert: Android Systemverzeichnis (ANDROID_ROOT)

FILE.LIST[Diskussion]

array = file.list ( [ string mask [, bool directories ] )

Gibt ein Array mit Datei- und Verzeichnisnamen im aktuellen Verzeichnis zurück.

Wenn bool directories true oder false, dann werden nur Verzeichnisse oder nur Dateien zurückgeliefert. Wird bool directories nicht gesetzt (bzw. ist null), dann werden Dateien und Verzeichnisse zurückgeliefert.

Beispiel:
print file.list()// listet alle Dateien und Verzeichnisse im aktuellen Verzeichnis

Keywords: addfiles, glob

FILE.MKDIR[Diskussion]

bool = file.mkdir( string )

Legt Verzeichnis string an.

Rückgabewert: Ob Verzeichnis string existiert.

FILE.READ[Diskussion]

string = file.read ( string Dateiname )

Liefert den Dateiinhalt aus Datei als String.

Beispiel:
print file.read("meine.datei")

Hinweis: Für Lesen per http vom Webserver Funktion dev.internet.http verwenden.

Keywords: fread, file_get_contents, blockread

FILE.SIZE[Diskussion]

long = file.size( string )

Rückgabewert: Größe von Datei string, oder -1 wenn nicht existent, oder -2 wenn ein gleichnamiges Verzeichnis existiert.

FILE.TIME[Diskussion]

long = file.time ( string )

Rückgabewert: Unix Zeitstempel letzte Änderung von Datei string.

FILE.UNZIP[Diskussion]

long = file.unzip ( p1,p2 )

Datei entpacken, p1 ist die ZIP-Datei und p2 das Zielverzeichnis.

Rückgabewert Anzahl erfolgreich ge/entpackter Dateien.

FILE.WRITE[Diskussion]

{ bool | long } = file.write ( { string Dateiname [, string Inhalt [, bool Anhängen ] ] } )

Erzeugt eine Datei oder ein Verzeichnis; schreibt Inhalt in eine Datei, optional hängt Inhalt an eine Datei an.

Wird file.write mit nur 1 Parameter aufgerufen also ohne string Inhalt, dann wird ein Verzeichnis erzeugt.

Beispiele:
file.write("datei.txt","Dateiinhalt")//legt Datei datei.txt an und schreibt Dateiinhalt hinein.

file.write("datei.txt","NochmehrInhalt",true)//hängt an Datei datei.txt NochmehrInhalt an (append).

Keywords: fwrite,fappend,fmkdir

FILE.ZIP[Diskussion]

long = file.zip ( p1 , p2 )

ZIP-Datei erstellen, P1 ist die zu packende Datei oder ein Array mit Dateinamen der zu packenden Dateien und P2 ist der Zip-Dateiname

Rückgabewert: Anzahl erfolgreich gepackter Dateien.

FLOAT[Diskussion]

float = float( { string | long } )

Liefert den in Parameter 1 angegebenen Wert als Floatwert.

Siehe auch: long, str

Keywords: float

GUI[Diskussion]

{ ... } = gui.* ( ...

Die Funktionsgruppe gui bietet Funktionen für die Grafische Benutzeroberfläche.

gui
gui.background: Hintergrund von Control
gui.destroy: Entfernt Control
gui.gravity: Gravitation eines Controls
gui.grid: Erstellt ein Grid-Control.
gui.height: Höhe in Pixel von Control
gui.image (ctrl,file): Erstellt ein Image
gui.show (ctrl,mode): Sichtbarkeit Control
gui.text: Text-Control erstellen
gui.textcolor: Textfarbe von Text-Control
gui.theme: Stil eines Contols
gui.width: Breite in Pixel von Control

Keywords: Controls, Buttons, Eingabe

GUI.BACKGROUND[Diskussion]

long = gui.background ( { long Control | [ array ( long Controls , long Column , long Row ) ] } [, mixed Color ] )

Setzt die Hintergrundfarbe eines Controls auf Parameter long Color.

Ist Parameter Color jedoch ein Array, dann entsteht ein Farbverlauf:

[WinkelInGrad,[ProzentWert,rgb(r,g,b [,a])],[ProzentWert,rgb(r,g,b [,a])],...]
[Winkel,[%,col],[%,col],...

Col ist mit der Funktion rgb(r,g,b[,a]) zu beziehen,
% steht für einen Prozentwert long 0 bis 100,
Winkel ist so zu verstehen: 0° zeigt nach oben, also 12 Uhr, 90° nach rechts (also 3 Uhr)

Hinweis bei Farbverläufen: Es können beliebig viele Abschnitte definiert werden, mindestens jedoch müssen 2 Abschnitte definiert werden. Startet der erste Abschnitt nicht bei Prozentwert 0, dann wird automatisch ein Wert für Prozentwert 0 eingefügt mit der selben Farbe wie die erste Farbe im Array. Endet der letzte Abschnitt nicht bei Prozentwert 100, dann wird automatisch ein Wert für Prozentwert 100 angehängt mit der selben Farbe wie die letzte Farbe im Array.

Beispiel:

Beispiel für einen Farbverlauf für gui.hwnd, von oben nach unten, von
schwarz nach weiß:
gui.background gui.hwnd [180 [0 rgb 0 0 0] [100 rgb 255 255 255]]

GUI.GRID[Diskussion]

long = gui.grid ( { long Parent | array ( long Parent , long CellX , long CellY ) } , [ array ( long Columns , long Rows ) ] )

Erzeugt ein Grid.

Beispiel:
// erzeugt ein 3x3 Grid auf Hauptfenster
grid=gui.grid gui.hwnd [3,3]
// erzeugt ein 4x4 Grid in Zelle 2,2 vom Hauptgrid
grid2=gui.grid [grid,2,2] [4,4]

GUI.HEIGHT[Diskussion]

long = gui.height ( [ long control ] )

Rückgabewert: Höhe in Pixel des Hauptfensters, oder, wenn long Control angegeben, Höhe des Controls.

Hinweis: Wert je nach screen.rotation anders.

Hinweis: gui.height() kann kleiner sein als screen.height().

GUI.IMAGE[Diskussion]

long handle = gui.image ( [ mixed parentControl | long Image ] , string fileName [, @proc] )

Achtung: Funktioniert noch nicht auf allen älteren Geräten!

Erstellt eine sichtbare alphakanal-durchlässige 32-Bit RGBA Zeichenfläche auf dem parentControl mit den Maßen des Bildes aus der Bilddatei fileName (PNG, GIF oder JPG) und läd das erste Bild aus der Bilddatei fileName auf die Zeichenfläche auf der auch jederzeit mit img-Funktionen gezeichnet werden kann.

Wird @proc angegeben, dann werden Klick-Informationen an diese Proc geleitet statt an proc event.

Die Größe des geladenen Bildes kann mit img.width und img.height ermittelt werden, wiederum die Anzeigegröße der Zeichenfläche kann mit gui.width und gui.height ermittelt werden.

Siehe auch: img, img.create (noch nicht verfügbar)

Beispiele:

Erstellt eine Zeichenfläche auf gui.hwnd und läd und zeigt darin das Icon der APP:
gui.image gui.hwnd "../res/appicon.png"

Erstellt ein 3x3 Grid und in manch Zelle das Icon der APP:
grid=gui.grid gui.hwnd [3,3]
gui.image [grid,1,2] "../res/appicon.png"
gui.image [grid,3,1] "../res/appicon.png"
gui.image [grid,2,3] "../res/appicon.png"

Neues Bild in Zeichenfläche laden:
img=gui.image gui.hwnd "../res/appicon.png"//irgend ein Bild laden
gui.image img "../res/anderedatei.png"//neues Bild laden

Kleines Alien-Spiel:

GUI.SHOW[Diskussion]

gui.show ( { long control | long grid , x , y } , long mode )

Setzt die Sichtbarkeit des Controls und/ oder der Grid-Zelle auf mode:

0: versteckt
1: sichtbar

XProfan-Äquivalent: showWindow

Beispiel:

GUI.TEXT[Diskussion]

long handle = gui.text ( { array parent , string text [, @proc] | long textControl , string text } )

Erstellt ein Text-Control in einer Grid-Zelle oder ändert den Anzeige-Text eines Text-Controls.

Wird @proc nicht angegeben, dann werden Klick-Informationen nur an event weitergeleitet.

Siehe auch: gui.gravity, gui.textcolor, gui.background, event.button

Beispiele:
grid=gui.grid gui.hwnd// create Grid on hwnd (1x1)
gui.text [grid,1,1] "myText"

Text nachträglich ändern:
grid=gui.grid gui.hwnd// create Grid on hwnd (1x1)
ctrl=gui.text [grid,1,1] "myText"
gui.text ctrl "newText!"

GUI.THEME[Diskussion]

long = gui.theme ( { long Control | [ array ( long Control , long Column , long Row ) ] } [, long theme] )

Setzt das Theme (Aussehen) eines Controls.

Ohne Parameter 2 kann gui.theme als Getter verwendet werden.

Konstanten:



Beispiel:
var grid=gui.grid(gui.hwnd,[2,2])// erzeugt ein 2x2 Grid auf Hauptfenster
gui.theme grid,gui.theme.debug// Alle Zellen von Grid grid sichtbar machen bzw. hervorheben
gui.theme [grid,1,1],gui.theme.debug// Zelle 1,1 von Grid stärker hervorheben

GUI.WIDTH[Diskussion]

long = gui.width ( [ long control ] )

Rückgabewert: Breite in Pixels des Hauptfensters, oder, wenn long Control angegeben, Breite des Controls.

Hinweis: Wert je nach screen.rotation anders.

Hinweis: gui.width() kann kleiner sein als screen.width().

LEN[Diskussion]

long = len ( { string | array } )

Anzahl der Zeichen im String oder Anzahl der Einträge im Array.

Siehe auch: arr.count, str.len

Keywords: len,count

LONG[Diskussion]

long = long( { float | string } )

Konvertiert Float oder String in einen ganzzahligen Datentyp.

Siehe auch: float, str

Keywords: long

MATH[Diskussion]

{ ... } = math.* ( ...

Die Funktionsgruppe math bietet wichtige mathematische Funktionen und Konstanten:

math.cos
math.sin
math.tan
math.pi
math.acos
math.asin
math.atan
math.sqrt
math.deg2rad
math.rad2deg
math.geodist
math.rnd

Keywords: sin,cos,tan, asin,acos,atan, sqrt, pi,deg2rad,rad2deg, GeoDist

MATH.ACOS[Diskussion]

float = math.acos ( float )

Rückgabewert: Arkuskosinus von float

MATH.ASIN[Diskussion]

float = math.asin ( float )

Rückgabewert: Arkussinus von float

MATH.ATAN[Diskussion]

float = math.atan ( float )

Rückgabewert: Arkustangens von float

MATH.COS[Diskussion]

float = math.cos ( float )

Rückgabewert: Kosinus von float

MATH.DEG2RAD[Diskussion]

float = math.deg2rad( float )

Rückgabewert: Winkel float im Bogenmaß.

MATH.GEODIST[Diskussion]

float = math.geodist ( array pt1 , array pt2 )

Rückgabewert: Float, Distanz in Meter

Berechnet die Distanz (Meter) 2er GPS-Koordinaten, erwartet deshalb auch 2 assoz. Arrays mit Werten "latitude" und "longitude" - so wie sie von der gps-Funktion zurückgeliefert werden.

Beispiel:
print round(math.geodist(
["latitude"=0,"longitude"=0]
["latitude"=20,"longitude"=20]
)) // ergibt 1788

MATH.PI[Diskussion]

float math.pi = 3.141592653589793

Hinweis: Math.pi ist keine keine Funktion sondern eine Konstante.
print math.pi// gibt 3.141592653589793 aus

MATH.RAD2DEG[Diskussion]

float = math.rad2deg ( float )

Rückgabewert: Bogenmaß float nach Winkel.

MATH.RND[Diskussion]

long = math.rnd ( long )

Siehe: rnd

MATH.SIN[Diskussion]

float = math.sin ( float )

Rückgabewert: Sinus von float

MATH.SQRT[Diskussion]

float = math.sqrt ( float )

Rückgabewert: Quadratwurzel von float

MATH.TAN[Diskussion]

float = math.tan ( float )

Rückgabewert: Tangens von float

MSG[Diskussion]

Die Funktionsgruppe msg stellt Dialogfenster und Benachrichtigungsfunktionen zur Verfügung:

msg
msg.box
msg.notify
msg.toast

Keywords: msg,input,toast,notify,messagebox

MSG.BOX[Diskussion]

msg.box ( Titel [, Text, [ { string Button | array Buttons }, [ string EingabefeldTextVorgabe [, @myProc ] ] ] ] )

Erzeugt eine asynchrone MessageBox, es können gleichzeitig mehrere MessageBoxen angezeigt werden.

Jede MessageBox zwingt zur Interaktion - mindestens die Zurücktaste muss gedrückt werden oder es muss eine Auswahl getroffen werden (wenn Buttons angezeigt werden sollen).

Für die Ergebnisübermittlung kann man eine Proc angeben, die dann aufgerufen wird mit Ergebnissen, sobald der User auf die Nachricht reagiert hat.

Da der Befehl nicht nur wie MessageBox Nachrichten anzeigen kann sondern auch wie (von XProfan bekanntes: ) input$ auf TextEingaben wartet, kann msg auch verwendet werden für Passworteingaben und auch für mehrzeilige Texteingaben.

Beispiele:

Zeigt ein Fenster mit Text ohne Titelzeile, kann nur mit der Zurücktaste geschlossen werden:
msg.box "Text"

Einen "OK"-Button hinzufügen per dritten Parameter befüllen:
msg.box "Titel","Text","OK"

Kein Text und keinen Titel sondern nur einen OK-Button:

Mehr als 1 Button (max. 3) anzeigen, dritter Parameter als Array:
msg.box "Titel","Text",["OK","Abbrechen"]

Titel und Text und 3 Buttons:
msg.box "Text","Titel",["Knopf1","Knopf2","Knopf3"]

Eingabefeld anzeigen. 4. Parameter nutzen MIT null (kein Eingabefeld) oder der "" (Input ohne Vorgabetext) oder direkt einen Vorgabetext angeben "Vorgabetext":
msg.box "Titel","Text",["OK","Abbrechen"],"texteingabe"

Das Eingabefeld kann verschiedene Eigenschaften besitzen. Wenn Eigenschaften für das Textfeld gesetzt werden sollen dann den 4. Parameter als Array übergeben:
msg.box "Titel","Text","OK",["Vorgabetext",Stilkonstante(n)]

Stilkonstanten gibt es viele - je nach Androidversion - z.B. 1 für "normaler Text" und "128" für "Passwort-Feld". Stilkonstanten sind zu addieren: 1+128 = normaler Text als Passwortfeld. So gibt es auch Datum, E-Mail, Telefon, NurZiffern, MultiLine etc... die Stilkonstanten gibts hier:  [...] 

Der 5. Parameter (optional) erwartet einen Zeiger (@) auf eine Prozedur, die dann die Eingaben bzw. Buttonwahl empfängt.

Beispiel für ein Eingabefeld:
msg.box "Titel","Text","OK","VorgabeText",@myProc

proc myproc(btn,txt)

    print "Es wurde Button "+str(btn)+" gewählt und der eingegebene Text lautet: "+txt

endproc


Man kann an die myProc aus "userdata" übergeben, dann ist der 5. Parameter ein Array wie folgt:
msg.box "Titel","Text","OK","VorgabeText",[@myProc,"spezialdaten"]

proc myproc(btn,txt,userdata)

    print "Es wurde Button "+str(btn)+" gewählt und der eingegebene Text lautet: "+txt+", übergebene userdata: "+userdata

endproc

MSG.NOTIFY[Diskussion]

msg.notify ( Text [, Titel [, LED [, Options ] ] ] ] )

Erzeugt eine Notifikation im Vorhang, ggf. und optimal mit: Icon, Titelzeile, Nachrichtenzeile, einer weiteren Nachrichtenzeile, einer rechtsbündige Zahlenanzeige.

Parameter 1: String oder Array

Bei String: Der Nachrichtentext
Bei Array: [Nachrichtentext, ZweiteZusatzZeile, ZusatzZahl]
Wird msg.notifikation aufgerufen und nur 1 Parameter angegeben, dann wird der Text als Titel angezeigt und ein Nachrichtentext entfällt.

Parameter 2: Die Notifikation bekommt einen Titel der in einer größeren Schriftart angezeigt wird über dem eigentlichen Nachrichtentext.

Parameter 3: LED-Information(en): Entweder ein Long für Farbe (mit Funktion rgb zu beziehen) - manche Smartphones haben eine LED die bei Notifikationen leuchtet (oft "nur" bei ausgeschaltetem Display); oder ein Array [farbe, anzeigedauerMillisekunden, ausblendedauerMillisekunden] um festzulegen wie die LED blinken soll.

Parameter 4: Boolean oder Optionsarray.

Im Fall Boolean True oder False ob die Notifikation "Unlöschbar" ist per "entfernen"-Button oder per "wegwischen". Bei True kann die Notifikation nicht entfernt werden im Gegensatz zu false.

Im Fall Array: [unlöschbarBoolean, AppHervorholenBeiKlickBoolean, prioritätsLong]
Ist AppHervorholenBeiKlickBoolean false dann passiert beim Klick auf die Notifikation garnichts, andernfalls wird die APP geöffnet. prioritätsLong kann -2, -1,0 (standard),1 oder 2 sein, je nach dem wie "hoch" diese Notifikation angezeigt werden soll über oder unter anderen Notifikationen.

Rückgabewert ist Long, ein Handle für die Notifikation um sie entfernen oder aktualisieren zu können.

MSG.TOAST[Diskussion]

msg.toast ( Text [, Titel ] )

Erzeugt eine (meist nur kurz sichtbare) nichtinvasive Meldung (meist im unteren Drittel des Bildschirmes), so etwas wie "Mit WLAN Netzwerk xyz verbunden."

Beispiel:
msg.toast "Hallo Welt!"

ORD[Diskussion]

long = ord( string )

Liefert den Wert des ersten Zeichens im String, A = 65.

Keywords: ord

PRINT[Diskussion]

print ( { string | long | float | array | boolean | null } [ ...

print
print.cls
print.color

Gibt Werte aus übergebenen Parametern als Text aus.

Beispiel:
print "Text"

Print kann auch Arrays anzeigen:
print [10,20,"Hallo",10.5,["Test",50,null,60,[true,false,msg],true,100],false,200]

Hinweis: Ist der Typ eines Wertes im Array nicht numerisch dann wird der Typ dem Wert vorangestellt in Klammern.

Print ist nur sinnvoll für einfache Debugging-Ausgaben. Komplexe Layouts lassen sich mit gui realisieren.

Keywords: print,print_r,color

PRINT.CLS[Diskussion]

print.cls ( long )

Siehe: cls

PRINT.COLOR[Diskussion]

print.color ( { null | col1 } [, col2 ] )

Setzt die Text- (col1) und Texthintergrund- (col2) Farbe für Print-Ausgaben.

Beispiel:
print.color rgb(255,0,0),rgb(255,255,0)
print "roter Text mit gelbem Hintergrund"

RGB[Diskussion]

long = rgb ( r, g, b [, a ] )

Liefert den Farbwert für die Farbe rot,grün,blau und optional alpha.

rgb
rgb.getrvalue
rgb.getgvalue
rgb.getbvalue
rgb.getavalue

Hinweis: a=alpha=Durchsichtigkeit: 0=unsichtbar, 255=sichtbar

Beispiel:
cls rgb(0,0,0)// löscht aktuellen Bildschirm schwarz
cls rgb(0,0,0,128)// löscht aktuellen Bildschirm schwarz halb durchsichtig
cls rgb(255,255,255,128)// löscht aktuellen Bildschirm weiß durchsichtig

Keywords: rgb,getavalue,getbvalue,getgvalue,getrvalue

RGB.GETAVALUE[Diskussion]

long = rgb.getavalue ( col )

Liefert den Alphaanteil aus Farbe col

Beispiel:
print rgb.getavalue(rgb(10,20,30,40))// gibt 40 aus

Keywords: rgb,getavalue,getbvalue,getgvalue,getrvalue

RGB.GETBVALUE[Diskussion]

long = rgb.getbvalue ( col )

Liefert den Blauanteil aus Farbe col

Beispiel:
print rgb.getbvalue(rgb(10,20,30))// gibt 30 aus

Keywords: rgb,getavalue,getbvalue,getgvalue,getrvalue

RGB.GETGVALUE[Diskussion]

long = rgb.getgvalue ( col )

Liefert den Grünanteil aus Farbe col

Beispiel:
print rgb.getgvalue(rgb(10,20,30))// gibt 20 aus

Keywords: rgb,getavalue,getbvalue,getgvalue,getrvalue

RGB.GETRVALUE[Diskussion]

long = rgb.getrvalue ( col )

Liefert den Rotanteil aus Farbe col

Beispiel:
print rgb.getrvalue(rgb(10,20,30))// gibt 10 aus

Keywords: rgb,getavalue,getbvalue,getgvalue,getrvalue

RND[Diskussion]

long = rnd ( long )

Zufallszahl zwischen 0 und long-1.

Beispiel:
print rnd(5)// zeigt Zufallszahl 0 bis 4, also 0, 1, 2, 3 oder 4

Keywords: rnd

ROUND[Diskussion]

{ long | float } = round ( { long | float } [, long Nachkommastellen [, bool Abschneiden ]] )

Rundet den Wert aus Parameter 1 oder - wenn bool Abschneiden true, schneidet die Nachkommastellen ab.

Keywords: round,trunc

SCREEN[Diskussion]

Funktionsgruppe für Anzeige- und Display-Eigenschaften:

screen: Liefert assoziatives Array mit aktuellen Werten
screen.fullscreen: Vollbildmodus, ob Statuszeile und Navigation unsichtbar
screen.fontsizes: liefert ein assoz. Array mit den verschiedenen Schriftgrößen des Systemes
screen.height: Anzahl physischer Pixel // %maxy
screen.keepon: Timeout f. Bildschirmabschaltung deaktivieren
screen.rotation: Display Drehung
screen.width: Anzahl physischer Pixel //%maxx
screen.xdpi: horizontale "Pixel pro Inch"-Angabe
screen.ydpi: vertikale "Pixel pro Inch"-Angabe

Beispiele:

Keywords: display,screen,landscape,portrait,sensor,maxx,maxy

SCREEN.FULLSCREEN[Diskussion]

bool = screen.fullscreen [ ( [ bool ] ) ] 

Ermittelt oder setzt den Vollbildmous, je nach dem ob Parameter bool übergeben oder nicht.

Rückgabewert: Bool, ob App im Vollbildmodus.

Beispiele:

Ermitteln des aktuellen Status:
print screen.fullscreen
// oder print(screen.fullscreen())

Vollbildmodus aktivieren:
screen.fullscreen true
// oder screen.fullscreen(true)

Vollbildmodus deaktivieren:
screen.fullscreen false
// oder screen.fullscreen(false)

Keywords: Vollbild

SCREEN.HEIGHT[Diskussion]

long = screen.height ()

Rückgabewert: Long, Bildschirmhöhe in Pixel.

Hinweis: Wert je nach screen.rotation anders.

Siehe auch: screen.width, gui.height

Beispiel:

Auflösung anzeigen:

Keywords: Bildschirm, Auflösung

SCREEN.KEEPON[Diskussion]

bool = screen.keepon [ ( [ bool ] ) ]  

Ermittelt oder setzt, je nach dem ob Parameter bool übergeben, ob die automatische Bildschirmabschaltung deaktiviert ist:

Rückgabewert: Bool, ob Bildschirmabschaltung deaktiviert.

Beispiele:

Ermitteln des aktuellen Status:
print screen.keepon
// oder print(screen.keepon())

Bildschirmabschaltung deaktivieren:
screen.keepon true
// oder screen.keepon(true)

Bildschirmabschaltung reaktivieren:
screen.keepon false
// oder screen.keepon(false)

Keywords: Bildschirm,Abschaltung,TimeOut

SCREEN.ROTATION[Diskussion]

long = screen.rotation [ ( [ long ] ) ]  

Display-Rotation ermitteln, oder, festlegen wenn Parameter n übergeben.

Rückgabewert ist der Wert der tatsächlich gesetzten Einstellung.

Konstanten für Parameter long und Rückgabewerte:

Weitere mögliche Werte für Modus screen.rotation, die numerisch an- oder zurückgegeben werden können.

Abhängig von der Implementation der Hersteller scheinen hier die Werte 0 (Querformat nach rechts gedreht) und 1 (Hochformat) sowie 8 (Querformat nach links gedreht) und 9 (Hochformat auf den Kopf gestellt) sowie 4 für (je nach Sensor/ automatisch) immer zu funktionieren. Damit kann man eine Drehung festsetzen oder eben automatisch bestimmen lassen.

SCREEN.WIDTH[Diskussion]

long = screen.width ()

Rückgabewert: Long, Bildschirmbreite in Pixel.

Hinweis: Wert je nach screen.rotation anders.

Siehe auch: screen.height, gui.width

Beispiel:

Auflösung anzeigen:

Keywords: Bildschirm, Auflösung

STR[Diskussion]

{ ... } = str[.* ( ...

Die Funktionsgruppe str bietet Funktionen für den Umgang mit Stringinhalten und Konvertierungen:

str: Long/ Float nach String
str.chr: Zeichen long als String, 65 = A
str.decode64: Base64-Dekodierung von string
str.del: Entfernt Zeichen aus string
str.encode64: Base64-Kodierung von string
str.ins: String einfügen
str.len: Länge von string.
str.lower: Großbuchstaben in Kleinbuchstaben
str.md5: MD5-Summe von string
str.mid: Teilstring
str.ord: Wert des ersten Zeichens im String, A = 65
str.pos: Position von Vorkommen ermitteln
str.replace: Vorkommen ersetzen
str.sha1: SH1-Summe von string
str.sha256: SH256-Summe von string
str.shuffle: mischt Zeichen nach Zufall
str.trim: Führende und abschließende Leerzeichen entfernen
str.upper: Kleinbuchstaben in Großbuchstaben

Keywords: str, base64, decode64, encode64,implode, ins, instr, lower, md5, mid, sh1, sh256, shuffle, strpos, translate, upper, serialize

string = str ( { long | float } )Rückgabewert: String-Repräsentation von long oder float.

STR.CHR[Diskussion]

string = str.chr ( long )

Siehe: chr

STR.DECODE64[Diskussion]

string = str.decode64 ( string )

Rückgabewert: Base64-Dekodierte Zeichenkette.

STR.DEL[Diskussion]

string = str.del ( string, long Position, long Anzahl )

Entfernt Anzahl Zeichen an Position aus String und liefert das Ergebnis als String zurück.

Beispiel:
print str.del("Hallo",1,2)// llo

Keywords: del

STR.ENCODE64[Diskussion]

string = str.encode64 ( string )

Rückgabewert: Base64-Kodierte Zeichenkette.

STR.INS[Diskussion]

string = str.ins ( string , string Einfügen , long Position )

Rückgabewert: Eingefügter string Einfügen in string an long Position.

Beispiel:
print str.ins("Hallo","-",2)// gibt H-allo aus

STR.LEN[Diskussion]

string = str.len ( string )

Rückgabewert: Anzahl der Zeichen im String.

Hinweis: str.len ist etwas schneller als len da die Prüfung ob Array wegfällt.

Siehe auch: arr.count, len

Beispiel:
print str.len("Hallo Welt")// 10

Keywords: length

STR.LOWER[Diskussion]

string = str.lower ( string )

Rückgabewert: Großbuchstaben in String umgewandelt in kleine Buchstaben.

Beispiel:
print str.lower("Hallo")// gibt hallo aus

STR.MD5[Diskussion]

string = str.md5 ( string )

Rückgabewert: MD5-Summe vom Inhalt in string.

STR.MID[Diskussion]

string = str.mid ( string , long Startposition , long AnzahlZeichen )

Rückgabe: Teilstring aus string ab long Startposition long AnzahlZeichen.

Beispiel:
print str.mid("Hallo",2,3)// ergibt all

STR.ORD[Diskussion]

long = str.ord ( string )

Siehe: ord

STR.POS[Diskussion]

long = str.pos ( string , string Suche [, long Startposition ] )

Rückgabewert: Position von string Suche in string.

Wenn angegeben, dann beginnt die Suche an long Startposition.

Beispiel:
print str.pos("Hallo","l")// zeigt 3

STR.REPLACE[Diskussion]

string = str.replace ( string, string Suche , string Ersatz [, bool Wiederholen ] )

Alle Vorkommen von string Suche in string Ersatz ersetzen.

Wenn bool Wiederholen true, dann wird der Vorgang so lange wiederholt, bis nach den Ersetzungen der string Suche nicht neu entstanden ist.

Beispiel:
print str.replace("Hallo","ll","i")// Haio

Keywords: str_replace, translate

STR.SHA1[Diskussion]

string = str.sha1 ( string )

Rückgabewert: SHA1-Summe vom Inhalt in string.

STR.SHA256[Diskussion]

string = str.sha256 ( string )

Rückgabewert: SHA267-Summe von String

STR.SHUFFLE[Diskussion]

string = str.shuffle ( string )

Rückgabewert: Zeichen in string zufällig vermischt.

STR.TRIM[Diskussion]

string = str.trim ( string )

Rückgabewert: Führende und abschließende Freizeichen aus string entfernt.

STR.UPPER[Diskussion]

string = str.upper( string )

Rückgabewert: Kleinbuchstaben in String umgewandelt in große Buchstaben.

Beispiel:
print str.upper("Hallo")// gibt HALLO aus

TIME[Diskussion]

{null|long|string}=time([{long Modus[,long Unixtime]|String Datum}])

Ohne Parameter:

time gibt den sog. Unix-Zeitstempel aus: Anzahl vergangener Sekunden seit dem 01.01.1970.

Beispiel:

Parameter 1-Werte:

Negative Werte sind die TickCounter.

Wenn zweiter Parameter gegeben:

Wird ein zweiter Parameter angegeben dann wird nicht der aktuelle Zeitpunkt verwendet sondern der Zeitpunkt der als zweiten Parameter übergebenen Unixtime.

So kann man die Uhrzeit + 1h ausgeben:
print time(0,time()+60*60))

//

Weitere Funktionalität der Funktion time ist das Umwandeln eines lesbaren Datums im String zurück zu einer Unixtime:

Ist Parameter 1 ein String, dann wird das Datum (Stringinhalt) als Datum gelesen und Time gibt die entsprechende Unixtime aus.

Das Datum im String darf 2 Formate haben:

a) Punkt als Trennzeichen für dd.mm.yyyy
dd.mm.yyyy[ hh[:nn[:ss]]]
oder

b) Minus als Trennzeichen für yyyy-mm-dd
yyyy-mm-dd[ hh[:nn[:ss]]]
(für die Minuten zur Abgrenzung vom Monat mal nn verwendet)

Optional kann auch eine Uhrzeit enthalten sein, optional kann die Uhrzeit auch Sekunden enthalten: hh:nn[:ss] -

bei Angabe mit Uhrzeit muss die Uhrzeit mit einem Freizeichen vom Datum getrennt sein und bei der Uhrzeit ist für jeden Wert der Doppelpunkt das Trennzeichen.

Beispiel für Rückwandlung Datum nach Unixtime:
time("10.12.1978")
//oder
time("1978-12-10")

und/ oder mit Uhrzeit:
time("10.12.1978 18:10")
//oder
time("1978-12-10 18:10")

und/ oder Uhrzeit mit Sekunden:
time("10.12.1978 18:10:35")
//oder
time("1978-12-10 18:10:35")

Damit kann man aus einer leserlichen Datum/ Zeitangabe die Unixtime rückrechnen - optimal für Datum/ Zeitberechnungen.

Keywords: time,date,gettickcount

TRIM[Diskussion]

string = trim ( string )

Entfernt Leerzeichen am Anfang und Ende des Strings.

Keywords: trim

BREAK[Diskussion]

break

Veranlasst sofortiges Verlassen der aktuellen Schleife.

Kann wie Return auch im Hauptprogrammablauf verwendet werden um die Ausführung des nachfolgenden Quelltextes zu verhindern.

Siehe auch: continue, while

Beispiel:

CASE[Diskussion]

case Bedingung/Argument : Anweisung

Mit case kann ein Programmzweig einzeilig definiert werden, der nur ausgeführt wird, wenn die Bedingung erfüllt bzw. das Ergebnis von Argument positiv ist.

Beispiel:
case 10==20 : msg.toast("...

CONTINUE[Diskussion]

continue

Führt sofort zum nächsten Schleifendurchlauf.

Siehe auch: break, while

IF[Diskussion]

if Bedingung/Argument

Mit if, elseif, else und endif können Programmzweige definiert werden, die nur ausgeführt werden, wenn die Bedingung erfüllt bzw. das Ergebnis von Argument positiv ist.

Beispiel:
a=10, b=10

if a==b

    //... Programmtext

elseif a<b

    //... Programmtext

elseif a>b

    //... Programmtext

else

    //... Programmtext

endif


Keywords: Bedingungen, Verzweigungen, Programmzweige

ifelseifelseendif

WHILE[Diskussion]

while [ Bedingung/Argument ] 

While startet eine (endlos-) Schleife, die mit break und continue beeinflussbar ist. Optional kann Parameter Bedingung/Argument angewandt werden, der für jeden Durchlauf true sein muss.

Beispiel:
i=0
while
print ++i
case i==10 : break
wend

Mit Angabe Bedingung/Argument:
i=0
while i<10
print ++i
wend

Beide Beispiele geben die Zahlen 1 bis 10 aus.

Keywords: Schleife

whilewend

END[Diskussion]

end ( [ long Exitcode ] )

Beendet das Programm sauber an Ort und Stelle, oder, wenn optional Exitcode angegeben, terminiert das Programm unsauber mit Exitcode.

Beispiel:
print "Text den wohl niemals jemand sehen wird"
end

Keywords: end, exit, terminate

GLOBAL[Diskussion]

Variablenbezeichner von globalen Variablen definieren:

Oder:

INCLUDE[Diskussion]

include Dateiname [,...

Statisches Inkludieren: Inkludiert eine Quelltext-Datei an Ort und Stelle des Include-Befehles. Ermöglich ebenso das Inkludieren von Procs in Procs.

Der Parameter darf keine Stringkonstante sein, Variablen als Parameter für den Include-Aufruf sind nicht möglich da der Präkompilierer die Includes einbindet.
//Richtig:
include ogl.inc, sounds.inc
//Falsch:
include "ogl.inc", "sounds.inc"

PROC[Diskussion]

proc Name( [ Parameter, [ ...

Definiert eine Prozedur/ namens Name und für ihre (optionalen) Parameter die Namen der Variablen.

Prozeduren können Werte aller Variablentypen (einschließlich Arrays) per return zurückliefern.

Prozeduren können Über- und Unterladen werden: Parameter müssen nicht an eine Proc übergeben werden, auch dann nicht, wenn welche definiert sind. Übergibt man an eine Proc z.B. nur die Parameter a und b statt auch c, dann ist c in der Proc definiert aber hat den Wert null. So kann man auch innerhalb einer Proc erkennen, ob ein Parameter übergeben wurde oder nicht. Eine Proc ohne Return liefert immer null. Hinweis: Null ist nicht gleich 0!

In Infinity-Profan gibt es auch Procs in Procs, die inneren Procs sind nur in der Elternproc bekannt.

Wie bei XProfan und XPSE mit nProcs ist es in Infinity-Profan egal, ob Procs am Programmkopf oder Fuß definiert werden, da der Kompilierer ohnehin den Quelltext umsortiert und die tatsächlich verwendeten Funktionen an der passenden Stelle des Quelltextes verknüpft. So kann man sich oben im Programmkopf auf den eigentlichen Quelltext/ Ablauf konzentrieren und benötigte Procs am Fuß ablegen.

Die Beschränkung der Anzahl der übergebenen Parameter liegt theoretisch bei 9100, jedoch sollten so viele Parameter keiner Proc übergeben werden um Speicherprobleme zu vermeiden.

Parameterwerte werden byValue übergeben, byRef für Arrays mit vorangestelltem @ vor jedem Parameternamen. Auf Parameter, die nicht vom Typ Array übergeben werden, hat @ keinen Einfluss, jedoch wird die Prüfung für diesen Parameter auf eine Array-Kopie beim setzen des @-Zeichens abgeschaltet. Bei Funktionen, bei denen es auf höchste Geschwindigkeit ankommt, ist also eine Optimierung per @ für jeden Parameter mit einzubeziehen.

Hinweis: Zeiger auf eine Proc per @Procname

Beispiele:
proc meineProc(a,b,c)

    /// ...
    /// return

endproc


Ebenso - dank Space-Operator - einfachere Syntax möglich:
proc meineProc a b c

    /// ...
    /// return

endproc


Bei der Parameter-Definition kann auch gleich ein Vorwert übergeben werden, ein Wert der genutzt werden soll wenn der Parameter nicht mit übergeben wurde:
proc test(a,b,c=50)

    return c

endproc

print test()// gibt 50 aus

Selbe:
proc test a b c=50

    return c

endproc

print test()// gibt 50 aus

Das geht auch:

Selbe:

Hinweis zur Performance:

ist schneller als:

weil für alle Parameter die Prüfung auf ein Array wegfällt, dessen Daten ggf. für die Proc dupliziert würden.

Keywords: Prozeduren, Funktionen

procendproc

RETURN[Diskussion]

return [{ null | bool | long | float | string | array | proc }]

Beendet den Ablauf einer Prozedur (Proc) oder des Hauptprogrammes und - optional - liefert den angegebenen Wert zurück.

Es können mehrere Return-Anweisungen innerhalb einer Proc verwendet werden und Return kann wie auch Break auch im Hauptprogrammablauf verwendet werden, um anzuzeigen, dass die nachfolgenden Zeilen nicht weiter ausgeführt werden sollen.

Bei Arrays ist die Rückgabe immer byRef.

Keywords: return

Willkommen | FAQ | Links | Kontakt | Referenz | Screenshots | Shop | Veröffentlichte APPs | Facebook

Infinity-Profan © 2014-2017 XProfan.Net