Re: Menü Aufbau/Beispiel Kategorie: Programmierung (von Werner - 2.08.2008 19:05) | ||
Als Antwort auf Re: Menü Aufbau/Beispiel von Jens. - 1.08.2008 16:51 | ||
| ||
Hi Jens, schön lang und nicht ganz übersichtlich dein Menü. Hier aber in paar Ideen zur Lösungsfindung: 1. Im Thread main ist das release und das capture nicht auf der selben Ebene. release wird in der loop immer ausgeführt, das capture nur wenn Taste gedrückt. 2. Was passiert in deinen Funtionen uhrdatum() und test()? Wenn diese blockierend arbeiten, dann ist die Unterscheidung von pos = 1 und pos = 2 nicht nötig, da aus der Funktion nur dann zurück gekehrt wird, wenn die Eingabe abgeschlossen ist, dann kann auch gleich im zweiten Teil weiter gearbeitet werden (pos = 2). Ein gutes Beispiel für eine solche Eingabefunktion ist in der stkeyb.input() zu finden. Diese Funktion wartet auf die Eingabe von Ziffen und kehrt erst bei Enter, timeout oder Abbruch zurück. Wenn du allerdings in deinen Funktionen einen neue Thread starten solltest, dann musst du während der Eingabe das Menü deaktivieren. Hier ein Beispiel: Im Thread main loop { // loop anfang if (InEingabe == 1) continue; if (stkeyb.get() !=255) // warten taste gedrückt [...] } und in der Funktion dis [...] InEingabe == 1; uhrdatum(); [...] Soll hei�en, dass beim starten der Eingabe das Navigieren durch das Menü unterbunden wird. Aber Achtung, nicht vergessen am Ende der Eingabe InEingabe = 0 zu setzen. Persönlich bevorzuge ich die erste Variante mit der blockierende Eingabefunktion. In meinem Program starte ich ein Menü durch drücken der Tasten F1, F2 oder F3. Dann rufe ich aus dem Hauptthread die entsprechende Unterfunktion auf. Hier werden dann die Untermenüpunkte angezeigt und anschlie�end in die Eingabefunktion verzweigt. Dort erfolgt dann die eigentliche Eingabe. Alle Funktionen sind blockierend. Hier ein Codeschnipsel: /******************************************************************************* * Textkonstanten *******************************************************************************/ const MENU20NR = 3; // Anzahl der Menupunkte bei F1 const MENU20[] = "0: Zurxf5""ck ","1: Datum stellen","2: Zeit stellen "; // Menueoptionen bei F1 const MENU21 = "Datum einstellen"; // Menueanzeigetexte je nach Menupunkt const MENU22 = "Uhrzeit stellen "; const INPUTERR = "Eingabefehler!!!"; // Meldung bei fehlerhaften Eingaben const INPUTCAN = "Abbruch! "; // Meldung bei Abbruch /******************************************************************************* * Konstanten *******************************************************************************/ const TIMEOUT = 10000; // Timeout fuer Eingaben const SHOW_OLD = 1000; // Anzeigedauer fuer alte Werte const SHOW_NEW = 2000; // Anzeigedauer fuer neue Werte /******************************************************************************* * Menu22() * Untermenue Nr.2 im Menu F1 - Uhrzeit einstellen * * @param void * @return void *******************************************************************************/ function Menu22() { long val; // Hilfswerte fuer Eingaben int val1, val2, val3; // Aufgeteile Eingabewerte lcdext.line(1); lcdext.print(MENU22); lcdext.line(2); lcdext.print(" "); lcdext.time(1); sleep SHOW_OLD; val = input(-1, 2, " __:__:__ "); lcdext.delline(2); lcdext.line(2); val1 = val / 10000; val = val % 10000; // Stunde val2 = val / 100; // Minute val3 = val % 100; // Sekunde if (val1>=0)and(val1<=24) and (val2>=0)and(val2<=59) and (val3>=0)and(val3<=59) { system.settime(val1, val2, val3); pcf8583.syncpcf(); lcdext.print("Set: "); lcdext.time(1); } else if (val == -1) // bei Defaultwert lcdext.print(INPUTCAN); // Eingabe abgebrochen! else lcdext.print(INPUTERR); sleep SHOW_NEW; } /******************************************************************************* * Menu20() * Anzeigen des Untermenues nach druecken der Taste F1. * Menuepunkt zum Konfigurieren der Grundparameter * * @param void * @return void *******************************************************************************/ function Menu20() { long timeout, val; // Hilfswerte fuer Timeout und Eingaben MZahl = MENU20NR; // 4 Menuoptionen InMenu = 0x20; stports.setLED(6, 1); loop { lcdext.clear(); timeout = system.timer(); loop { Key = stkeyb.get(); if ((Key < MZahl) or (Key == stkeyb.CLEAR)) break; val = system.timer() - timeout; if (val >= (TIMEOUT * 2)) { lcdext.clear(); InMenu = 0; stports.setLED(6, 0); return; // Timeout-Abbruch } lcdext.line(1); lcdext.print(MENU20[mod(val, MZahl)]); yield; } plm.beep(10); sleep 40; plm.beep(-1); wait stkeyb.get()==255; sleep 50; // Zeit zum Tastenentprellen if (Key == 1) // Datum einstellen { stports.setLED(1, 1); Menu21(); stports.setLED(1, 0); } if (Key == 2) // Uhrzeit einstellen { stports.setLED(2, 1); Menu22(); stports.setLED(2, 0); } if (Key == 0) // Zurueck { timer.DefineUpDown(); lcdext.clear(); InMenu = 0; stports.setLED(6, 0); return; } } } Hierbei verwende ich eine eigene Eingabefunktion input, welche mit einer Eingabemaske arbeitet. Ansonsten entspricht Sie grundsätzlich der Funktion stkeyb.input(), hat aber ganz andere Parameter. Lange Antwort, hoffentlich hilfts. Mfg Werner | ||
Antwort schreiben Antworten: |