Dynamische Menus in UC4

Dynamische Menus in UC4

Menus in UC4 zu erstellen, ist vergleichsweise einfach. Allerdings haben diese "einfachen" Menus den Nachteil, daß die Anzahl der Menupunkte bei der Programmierung fest vorgegeben sein muß. Weiter ist der Zugriff auf die Inhalte dieseer Menupunkte (Benutzereingaben) nur über zuvor definierte UC4 Scriptvariablen möglich. Im folgenden soll beschrieben werden, wie trotzdem generische Menus erstellt und verwendet werden können.

Ausgangssituation

Bisweilen ist es wünschenswert, ein Benutzermenu zu erstellen, das eine unterschiedliche große Anzahl an Einträgen enthält. Als Beispiel kann eine Anzahl von UC4 VARAs genommen werden, in denen im Rahmen einer Projektverwaltung einzelne Projekte im UC4 verwaltet werden. Die Namen dieser Projekt-VARAs läßt sich aus einer eigenen UC4 VARA herleiten, in denen alle aktiven Projekte enthalten sind. Die BenutzerMenus werden mittels UC4 Script erstellt.

Lösungsansatz

Der Grundgedanke der Lösung ist nun folgender:

1) es werden für alle Projekt-VARAs im Aktivierungsprotokoll des UC4 Scriptes genau ein Eintrag erstellt, der folgenden Aufbau besitzt:

* einen eindeutigen Identifier (bspw. "##PRJ##")
* eine eindeutige Nummer (bspw. 1, 2, 3, 4)
* einen eindeutigen Hinweis auf die zugehörige Projekt-VARA (bspw. eine Runnummer "0060647038")
* einen sprechenden Titel, der dem Benutzer den Inhalt des jeweiligen Projektes anzeigt (bspw. ein Text wie "SWIFT -> INHOUSE")

Alle Teile werden durch einen Begrenzer (bspw. ":") voneinander getrennt.

Dies wird durch ein UC4 Scripting wie bspw. das folgende erreicht (die Zeilen sind natürlich nicht vollständig!)

! Projekte anzeigen/anlegen
:set &cnt# = 1
:set &hnd# = prep_process_var(&project_vara#)
:process &hnd#
:  set &pid# = get_process_line(&hnd#, 1)
:  if isnumeric(&pid#)= "Y"
:    set &pvara# = "&project_prefix#.&pid#"
:    set &title# = get_var(&pvara#, "&p_title#")
:    set &owner# = get_var(&pvara#, "&p_owner#")
:    set &appl# = get_var(&pvara#, "&p_application#")
:    if &owner# = &u_filter#
:      if str_match(&appl#, &u_appl#)= "Y"
:        set &cnt# = format(&cnt#)
:        p "##PRJ##:&cnt#:&pid#:&title#"
:        set &cnt# = add(&cnt#, 1)
:      endif
:    endif
:  endif
:endprocess
:close_process &hnd#
! max. Menupunkt speichern
:set &m_cnt# = format(&cnt#)

2) in einem zweiten Schritt wird nun der Report des aktiven Scriptes nach dem eindeutigen Identifier ("##PRJ##") durchsucht und aus den gefundenen Einträgen einzelnene Menupunkte aufgebaut. Dabei dient der eindeutige Identifier für die Auswahl der relevaten Zeilen mittels prep_process_report(), die eindeutige Nummer (1, 2, 3) für den Zugriff auf ein ausgewähltes Projekt, und der Hinweis auf die Projekt-VARA ("0060647038") für den eindeutigen Zugriff auf die VARA. Das Ganze ist eingebettet in eine :beginread .. :endread Sequenz, so daß alle Ausgabezeilen in einem Menu erscheinen. Hier wieder ein Ausschnitt aus einem UC4 Script für den Zweck der Auswertung:

:beginread
:  set &hnd# = prep_process_report(, , "ACT", "*##PRJ##:*")
:  process &hnd#
:    set &line# = get_process_line(&hnd#)
:    set &idx# = str_find(&line#, "##PRJ##")
:    if &idx# > 0
! CNT bestimmen
...
! PID bestimmen
...
! Prj bestimmen
...
:  endprocess
:  close_process &hnd#
:  p "# &m_cnt#", "neues Projekte"
:  p "--------", "--------"
:  read &m_choice#, "0-&m_cnt#", "Eingabe(0 - &m_cnt#, Ende mit 0)", , MN
:endread

Noch die Hinweise:

  • mit der UC4 Script-Variabel &m_choice# ("max choice") wird die Obergrenze der gültigen Werte für die Eingabe festgelegt.
  • mit der Zeile ':p "--------", "--------"' wird das Menu ein wenig strukturierter und lesbarer

An Ende der Schleife wird mit ":read .." eine Auswahl vom Benutzer verlangt:

  • mit "0" (Vorbelegung) wird die weitere Verarbeitung beendet
  • mit einer Auswahl > 0 wird die entsprechende Projekt-VARA verarbeitet

Es geht also weiter mit bspw.:

:if &m_choice# = 0
:  p "na, dann eben nicht :)"
:else
! Verarbeitung der ausgewählten Projekt-VARA
:endif