Das leidliche Thema, wie man ein optimales Menü, gerade auf einem
kleinen Controller.
Als recht effizient hat sich bei mir die Pointer-Tabelle erwiesen. Ich
baue mir eine Tabelle, die für jeden Menüeintrag auf den anzuzeigenden
String, eine Ausführ-Funktion und eine Value-Funktion zeigt.
Der Sting ist klar, es ist der Anfang des dazustellenden Menüeintrages.
Die Ausführfunktion ist die, die bei Auswahl des Menüeintrages
aufgerufen wird. Die Value-Funktion kann dem String noch eine dynmische
Komponente anhängen, also einen Wert oder Text, der sich aus dem Zustand
des Systems ergibt.
Für eine luxuriöse Darstellung mit Scrollen und Auswählen werden jetzt
leidglich zwei Pointer benötigt. Ein Auswahl-Pointer läuft mit den
Menütasten, also i.d.R. Hoch und Runter und steht damit immer auf dem
aktuell ausgewählten Wert.
Der zweite Pointer, der Display-Pointer wird aus der Display-Größe und
dem Auswahl-Pointer berechnet, er zeigt auf den ersten anzuzeigenden
Eintrag. Die Anzahl der anzuzeigenden Einträge wird anhand der
Display-Größe festgelegt.
Mit diesen beiden Pointern kann man nun nach Vorliebe alle
Menü-Varianten abbilden, es hängt lediglich von der Verknüpfung der
beiden Pointer ab:
Ein Menü, dass seine zentrale Auswahlzeile immer in der Mitte hält, beim
ersten Eintrag sind also oberhalb leere Zeilen, beim letzten darunter.
Oder eine dynamische Auswahlzeile, die zuerst vom ersten Eintrag bis zur
Mitte läuft und den letzten Zeilen dann ans untere Ende läuft.
Oder die Tilt-Auswahl, die oben startet, dann bis zur letzten Zeile
läuft und dort bleibt.
Auch der Rundkurs ist einfach, man bleibt mit der Auswahl immer in der
Mitte des Displays und das menü läuft rund, der erste Eintrag wird unten
wieder eingeblenden, wenn Ihr versteht was ich meine. Man kann eine
Ende-Erkennung in der Tabelle ( z.B. NULL Pointer) verwenden um eine
Trennlinie einzufügen.
Anhand der Pointerkonstellation kann man natürlich auch leicht Symbole
einfügen, die Anzeigen, dass da noch mehr weiter oben oder weiter unten
ist.
Gruß, Ulrich