da ich öfters vor der Aufgabe stand, Zahlenwerte in Systemvariablen einzugeben, habe ich mir ein Pop-up mit einer (hoffentlich) universell verwendbaren Zahlentastatur geschrieben.
Die universelle Zahlentastatur kann überall eingesetzt werden, wo über die AIO Remote – App eine
Zahl in eine Systemvariable eingegeben werden soll.
Die Zahlentastatur ist als Pop-up-Fenster ausgeführt und kann innerhalb einer Fernbedienung an
verschiedenen Stellen für verschiedene Variablen benutzt werden.
Beim Aufruf wird mit Hilfe jeweils eines Makros die Zielvariable angegeben, für welche die
Zahleneingabe bestimmt ist. Über einen Format-String können der zulässige Wertebereich der
Eingabe und die Anzahl der Nachkommastellen festgelegt werden.
Im PDF habe ich den Aufbau des Pop-ups und das zugehörige CCU-Programmskipt beschrieben.
Code: Alles auswählen
=======================================================================================
= Skript Keypad =
=======================================================================================
Changelog
=======================================================================================
A0: 15.09.2022
- initial
=======================================================================================
=======================================================================================
=== Keypad_entry ==============================================================
=======================================================================================
!- ======= Keypad_entry ======
!- ======= Zeichen aus Buffer holen und verarbeiten =======
!- Version A0
integer buffer_size;
string format_element;
integer format_precision = 0;
real format_min = 0.0;
real format_max = 0.0;
boolean result_valid = false;
string key_in = dom.GetObject("Keypad_Key").Value(); !- neues Zeichen vom Keypad holen
string key_buffer = dom.GetObject("Keypad_Buffer").Value(); !- Buffer Zeicheneingabe holen
string key_format = dom.GetObject("Keypad_Format").Value(); !- Formatierungsstring holen
!-- Formatierungsstring auswerten --
!- Formatierungsstring: <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert>
!- Achtung: Kommazahlen mit Dezimalpunkt (.) angeben
!- Minimalwert = Minimalwert : Keine Bereichsprüfung
!- Beispiel: Wertebereich -23,5 bis 50 mit max. 2 Nachkommastellen: "2;-23.5;50"
!- Wenn kein Formatierungsstring dann Integer ohne Bereich annehmen
if (key_format == "")
{
key_format = "0;0;0";
}
!- Anzahl Nachkommastellen
format_element = key_format.StrValueByIndex(";",0);
format_precision = format_element.ToInteger();
if (format_precision < 0)
{
format_precision = 0;
}
if (format_precision > 15)
{
format_precision = 15;
}
!- Minimalwert
format_element = key_format.StrValueByIndex(";",1);
format_min = format_element.ToFloat();
!- Maximalwert
format_element = key_format.StrValueByIndex(";",2);
format_max = format_element.ToFloat();
if (format_max <= format_min)
{
format_max = 0;
format_min = 0;
}
!- aktuelle Anzahl Nachkommastellen ermitteln
integer current_precision = key_buffer.Find(",");
if (current_precision > -1)
{
current_precision = (key_buffer.Length() - current_precision) - 1;
}
!- Fehlermeldung im Buffer? -> Löschen
if (key_buffer.StartsWith("Err"))
{
key_buffer = "0";
}
!-- Eingaben auswerten --
!- Taste Clear Entry
if (key_in == "CE")
{
key_buffer = "0";
}
!- Zahlentasten 1..9 auswerten
if ((key_in >= "1") && (key_in <= "9") && (current_precision < format_precision))
{
if (key_buffer == "0")
{
key_buffer = "";
}
if (key_buffer == "-0")
{
key_buffer = "-";
}
key_buffer = key_buffer + key_in;
}
!- Zahlentaste 0 auswerten
!- dabei Nullfolgen vor dem Komma unterdrücken
if (key_in == "0")
{
if ((key_buffer <> "0") && (key_buffer <> "-0"))
{
key_buffer = key_buffer + key_in;
}
}
!- Vorzeichenwechsel auswerten
if (key_in == "SIGN")
{
if (key_buffer.Substr(0,1) <> "-")
{
if (format_min < 0)
{
key_buffer = "-" + key_buffer;
}
}
else
{
key_buffer = key_buffer.Substr(1,(key_buffer.Length()-1));
}
}
!- Dezimalpunkt auswerten
!- nur ein Dezimalpunkt ist zulässig
!- nur wenn Kommastellen zugelassen
if ((key_in == "DEC") && (format_precision > 0))
{
if (key_buffer.Find(",")== -1)
{
key_buffer = key_buffer + ",";
}
}
!- eine Stelle löschen
!- Sonderfälle:
!- Minuszeichen und Dezimalpunkt bleiben nicht alleine stehen
!- leeres Feld wird zur 0
if (key_in == "DEL")
{
buffer_size = key_buffer.Length();
if (buffer_size > 0)
{
key_buffer = key_buffer.Substr(0,(buffer_size-1));
}
if (key_buffer == "-")
{
key_buffer = "-0";
}
if (key_buffer == ",")
{
key_buffer = "0";
}
if (key_buffer == "")
{
key_buffer = "0";
}
}
!- Eingabetaste auswerten
if (key_in == "ENTER")
{
key_buffer = key_buffer.Replace(",",".");
real key_result = key_buffer.ToFloat();
!-- Bereichsprüfung
result_valid = true;
if (format_min <> format_max)
{
if (key_result > format_max)
{
key_result = format_max;
result_valid = false;
}
if (key_result < format_min)
{
key_result = format_min;
result_valid = false;
}
}
!-- Ergebnis an Variable übergeben wenn gültig
if (result_valid)
{
string target_var = dom.GetObject("Keypad_Target").Value(); !- Name Zielvariable holen
if (target_var == "")
{
dom.GetObject("Keypad_Buffer").State("Err:Var.name leer");
result_valid = false;
dom.GetObject("Keypad_Valid").State(result_valid);
quit;
}
object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get (target_var);
if (!oVar)
{
dom.GetObject("Keypad_Buffer").State("Err:Var.nicht vorh.");
result_valid = false;
dom.GetObject("Keypad_Valid").State(result_valid);
quit;
}
if (oVar.Value().VarType() <> 3)
{
dom.GetObject("Keypad_Buffer").State("Err:Var.typ falsch");
result_valid = false;
dom.GetObject("Keypad_Valid").State(result_valid);
quit;
}
!-- Eingabewert in Ziel-Systemvariable schreiben
dom.GetObject(target_var).State(key_result);
}
!- geprüften Ergebniswert aufbereiten für Ausgabe im Anzeigefeld
key_buffer = key_result.ToString();
key_buffer = key_buffer.Replace(".",",");
if (key_buffer.Find(",") > 0)
{
key_buffer = key_buffer.RTrim("0");
key_buffer = key_buffer.RTrim(",");
}
}
!- wenn Ergebnis in Systemvariable geschrieben, den Buffer fürs nächste Mal löschen
if (result_valid)
{
key_buffer ="0";
}
!- Buffer zum Anzeigefeld zurückschreiben
dom.GetObject("Keypad_Buffer").State(key_buffer);
!- Flag für Bearbeitungsstatus schreiben
!- Bei true Trigger zum Schließen des Keypad-PopUps
dom.GetObject("Keypad_Valid").State(result_valid);