INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 2 Bewertungen - 4.5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Menü u. Submenü von Ricardo - Durchlaufproblem
11.09.2014, 18:11
Beitrag #1
Menü u. Submenü von Ricardo - Durchlaufproblem
Hallo zusammen,

ich bin am Erstellen eines sinnvollen Hauptmenü mit Submenüs. Durch ein bisschen Stöbern im www und im Forum bin ich auf den (für mich) einfach zu lesenden Code von Ricardo gekommen (hier im Anhang nochmal reinkopiert).

Wenn ich das Programm in meinen Mega lade, so kommt im 3,2"TFT das Menü. Nun habe ich das Problem, dass ich auf dem Hauptmenü 2x touchen muss um in ein Untermenü zu kommen.
Noch dazu kommt, wenn ich das erste Mal den Button 'Menue_1' drücke und dann anschließen den Button für 'Menü_3', so kommt dann das Untermenü vom Button 1.

Hat jemand das Menü am Laufen oder hat dazu jemand eine Korrektur zum Programm.
Ich suche schon seit einiger Zeit, warum das auf 2x berühren reagiert.

Dann habe ich noch eine Frage zum Code:
Code:
while(1)
und
Code:
while(2)
was bewirken die 1 und die 2 in der Klammer und muss ich zwischen Haupt- u. Submenü in der while() unterscheiden??

Genauso die Sprungmarke? nach der loop
Code:
start: ......goto start;

Ich dachte, das Programm kommt hier automatisch immer wieder vorbei, oder muss ich das hier speziell steuern bzw. zurückführen?

Vielleicht ist Ricardo gleich selber dran...wäre natürlich super.

Gruß Franz

hier der Code von Ricardo:

Code:
/* UTFT_Buttons_Demo_320x240
angepasst auf 2 Ebenen - 3 Hauptmenupunkte und
je Submenu wieder 3 Menupunkte + "Zurueck"-Button */

#include <UTFT.h>        // TFT Lib
#include <UTouch.h>        // Touch Lib
#include <UTFT_Buttons.h>     // Button Lib
extern uint8_t BigFont[];    // Zeichengroeße fuer Buttons und Text
// Instanzen
UTFT          myGLCD(ITDB32S,38,39,40,41);
UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
// Diese Buttons werden in allen Menuebenen verwendet
unsigned int main_but1, main_but2,main_but3;
/* m_press der aktuell geklickte Button im Hauptmenu
kann auch -1 für kein Button sein, daher int */
int m_press;
// Footertext Hauptmenu
const char footertext[]="Hauptmenue";
void setup() {
  // LCD starten
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  // Touch starten
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_HI);
  myButtons.setTextFont(BigFont);
}
void loop() {
  // Standardfarben entspr. Vorgaben in den Libs benutzen
  const boolean default_colors = true;
start:
  // Buttons des Hauptmenu setzen
  main_but1 = myButtons.addButton (10,50,300,30,"Menu 1");
  main_but2 = myButtons.addButton (10,80,300,30,"Menu 2");
  main_but3 = myButtons.addButton (10,110,300,30,"Menu 3");
  // Buttons anzeigen
  myButtons.drawButtons();
  // Einen Text schreiben
  myGLCD.print(footertext, 20, 200);
  myGLCD.setColor(VGA_WHITE);
  // Hier beginnt die Abfrage der geklickten Buttons
  while(1)
  {
    if (myTouch.dataAvailable() == true)
    {
      m_press = myButtons.checkButtons();
      // Je nach ausgewahltem Button wird Funktion mit Parameter aufgerufen
      if (m_press==main_but1) l_1_screen(1);
      if (m_press==main_but2) l_1_screen(2);
      if (m_press==main_but3) l_1_screen(3);
      // Hoch zu Start um Hauptmenu (wieder) anzuzeigen
      goto start;
    }
  }
}
/* Funktion stellt je nach Auswahl im Hauptmenu
das zugehoerige Submenu dar */
void l_1_screen(unsigned int submenu)
{
  // Footertext Submenu
  const char sfootertext[]="Submenue: ";
  // Zusatzbutton fuer Ruecksprung ins Hauptmenu und aktuell geklickter Button
  unsigned int main_but4,m_press_2;
  // Buttons des Hauptmenu loeschen
  myButtons.deleteAllButtons();
  // Je nach Auswahl Submenu neue Buttons setzen
  switch (submenu)
  {
  case 1:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-11");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-12");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-13");
    break;
  case 2:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-21");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-22");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-23");
    break;
  case 3:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-31");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-32");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-33");
    break;
  }
  // Zurueck-Button setzen um ins Hauptmenu zu kommen
  main_but4 = myButtons.addButton (10,140,300,30,"Zurueck");
  while(2)
  {
    if (myTouch.dataAvailable() == true)
    {
      myButtons.drawButtons();
      myGLCD.print(sfootertext, 20, 200);
      // Text welches Submenu
      myGLCD.printNumI(submenu, 160, 200);
      myGLCD.setColor(VGA_WHITE);
      m_press_2 = myButtons.checkButtons();
      // Aufruf der Funktionen zu den Submenubuttons
      switch (submenu)
      {
      case 1:
        if (m_press_2==main_but1) do_s_11();
        if (m_press_2==main_but2) do_s_12();
        if (m_press_2==main_but3) do_s_13();
        break;
      case 2:
        if (m_press_2==main_but1) do_s_21();
        if (m_press_2==main_but2) do_s_22();
        if (m_press_2==main_but3) do_s_33();
        break;
      case 3:
        if (m_press_2==main_but1) do_s_31();
        if (m_press_2==main_but2) do_s_32();
        if (m_press_2==main_but3) do_s_33();
        break;
      }
      if (m_press_2==main_but4) break;
    }
  }
  // Buttons des Submenu loeschen
  myButtons.deleteAllButtons();
  myGLCD.clrScr(); // LCD leeren
  return; // raus aus Funktion
}
/* Die Funktionen hinter den Submenueintraegen
sonst läuft der Sketch nicht */
void do_s_11(){
}
void do_s_12(){
}
void do_s_13(){
}
void do_s_21(){
}
void do_s_22(){
}
void do_s_23(){
}
void do_s_31(){
}
void do_s_32(){
}
void do_s_33(){
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2014, 19:14 (Dieser Beitrag wurde zuletzt bearbeitet: 11.09.2014 19:45 von Corvus.)
Beitrag #2
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Zu den 2 Berührungen kann ich noch nichts sagen, dafür muss ich mich erstmal hineinlesen.

while(1) und while(2) tun das gleiche. Beides wird wie while(true) interpretiert. Es sind also Endlosschleifen. Deshalb auch die etwas unschöne Verwendung von goto besser wäre hier die Verwendung von break und die default_colors Zuweisung in die setup() Funktion zu verlagern wo sie als eimalig auszuführender Befehl eigentlich hingehört.

Das ist ein schönes Paradebeispiel, warum man goto nicht verwenden sollte. Der Sourcecode wird schnell unübersichtlich. Auch break trägt nicht sonderlich zur Leserlichkeit bei. Noch schöner wäre hier, die Abbruchbedingung der while()Schleife direkt in den Schleifenkopf zu schreiben.

gruß lorenz

Hab mich jetzt reingelesen.
setz mal myButtons.drawButtons(); vor die Zeile mit while(2). Dann sollte es klappen.

gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2014, 20:27
Beitrag #3
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Hab mich mal ans aufräumen des Codes gemacht:
Zitat:
/* UTFT_Buttons_Demo_320x240
angepasst auf 2 Ebenen - 3 Hauptmenupunkte und
je Submenu wieder 3 Menupunkte + "Zurueck"-Button */

#include <UTFT.h>        // TFT Lib
#include <UTouch.h>        // Touch Lib
#include <UTFT_Buttons.h>     // Button Lib
extern uint8_t BigFont[];    // Zeichengroeße fuer Buttons und Text
// Instanzen
UTFT          myGLCD(ITDB32S,38,39,40,41);
UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
// Diese Buttons werden in allen Menuebenen verwendet
unsigned int main_but1, main_but2,main_but3;
/* m_press der aktuell geklickte Button im Hauptmenu
kann auch -1 für kein Button sein, daher int */
int m_press;
// Footertext Hauptmenu
const char footertext[]="Hauptmenue";
void setup() {
  // LCD starten
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(BigFont);
  // Touch starten
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_HI);
  myButtons.setTextFont(BigFont);
  // Standardfarben entspr. Vorgaben in den Libs benutzen
  const boolean default_colors = true;
}
void loop() {
  // Buttons des Hauptmenu setzen
  main_but1 = myButtons.addButton (10,50,300,30,"Menu 1");
  main_but2 = myButtons.addButton (10,80,300,30,"Menu 2");
  main_but3 = myButtons.addButton (10,110,300,30,"Menu 3");
  // Buttons anzeigen
  myButtons.drawButtons();
  // Einen Text schreiben
  myGLCD.print(footertext, 20, 200);
  myGLCD.setColor(VGA_WHITE);
  // Hier beginnt die Abfrage der geklickten Buttons
  while(!myTouch.dataAvailable()){}
  m_press = myButtons.checkButtons();
  // Je nach ausgewahltem Button wird Funktion mit Parameter aufgerufen
  if (m_press==main_but1) l_1_screen(1);
  if (m_press==main_but2) l_1_screen(2);
  if (m_press==main_but3) l_1_screen(3);
}
/* Funktion stellt je nach Auswahl im Hauptmenu
das zugehoerige Submenu dar */
void l_1_screen(unsigned int submenu)
{
  // Footertext Submenu
  const char sfootertext[]="Submenue: ";
  // Zusatzbutton fuer Ruecksprung ins Hauptmenu und aktuell geklickter Button
  unsigned int main_but4,m_press_2;
  // Buttons des Hauptmenu loeschen
  myButtons.deleteAllButtons();
  // Je nach Auswahl Submenu neue Buttons setzen
  switch (submenu)
  {
  case 1:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-11");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-12");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-13");
    break;
  case 2:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-21");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-22");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-23");
    break;
  case 3:
    main_but1=myButtons.addButton(10,50,300,30,"S-Menu-31");
    main_but2=myButtons.addButton(10,80,300,30,"S-Menu-32");
    main_but3=myButtons.addButton(10,110,300,30,"S-Menu-33");
    break;
  }
  // Zurueck-Button setzen um ins Hauptmenu zu kommen
  main_but4 = myButtons.addButton (10,140,300,30,"Zurueck");
  do
  {
    myButtons.drawButtons();
    myGLCD.print(sfootertext, 20, 200);
    // Text welches Submenu
    myGLCD.printNumI(submenu, 160, 200);
    myGLCD.setColor(VGA_WHITE);
    while(!myTouch.dataAvailable()){}
    m_press_2 = myButtons.checkButtons();
    // Aufruf der Funktionen zu den Submenubuttons
    switch (submenu)
    {
    case 1:
      if (m_press_2==main_but1) do_s_11();
      if (m_press_2==main_but2) do_s_12();
      if (m_press_2==main_but3) do_s_13();
      break;
    case 2:
      if (m_press_2==main_but1) do_s_21();
      if (m_press_2==main_but2) do_s_22();
      if (m_press_2==main_but3) do_s_33();
      break;
    case 3:
      if (m_press_2==main_but1) do_s_31();
      if (m_press_2==main_but2) do_s_32();
      if (m_press_2==main_but3) do_s_33();
      break;
    }
  }while(m_press_2!=main_but4);
  // Buttons des Submenu loeschen
  myButtons.deleteAllButtons();
  myGLCD.clrScr(); // LCD leeren
  return; // raus aus Funktion
}
/* Die Funktionen hinter den Submenueintraegen
sonst läuft der Sketch nicht */
void do_s_11(){
}
void do_s_12(){
}
void do_s_13(){
}
void do_s_21(){
}
void do_s_22(){
}
void do_s_23(){
}
void do_s_31(){
}
void do_s_32(){
}
void do_s_33(){
}


hoffe ich hab nichts übersehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.09.2014, 22:49
Beitrag #4
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Hallo Corvus,

wau, sieht gut aus. Ich hab mal die überarbeitete Version geladen und der Menüwechsel in ein Submenü klappt nun mit 1x klicken.

Ob die Submenüs dann noch richtig arbeiten, kann ich jetzt noch nicht prüfen, denke aber dass dies auch ok ist.

Vorerst vielen Dank für die schnelle Hilfe.

Gruß Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.09.2014, 12:35
Beitrag #5
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Moin Leutz,
danke dass man sich meiner Anfängercodes annimmt, können dadurch nur besser werden Smile
Grüße RK

PS: Leider im Moment kaum Zeit für Arduino Sad

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.09.2014, 13:55
Beitrag #6
Smile RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Hallo Ricardo,

wie schreibst Du meistens..." aber immer gerne doch..."
Mir hat Dein "Anfängercode" schon weitergeholfen, vielen Dank.
Die korrigierte Version läuft bei mir soweit in allen Punkten.

Gruß Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.10.2014, 08:21
Beitrag #7
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Hallo,

ich hatte schon im alten Thread geschrieben und nun auch die aufgeräumte Version getestet.

Ich habe das Problem, dass ich nicht von den void do_x_xx mit einem Back Button zurück auf die 2. Ebene komme.

Bespiel:
Hauptmenü > Menü 3 > Submenü 1

Nun packe ich den Back Button in void do_s_31 {}
Button wird angezeigt, der break erfolgt ABER kein return zu case 3.

Jemand eine Idee wie ich das hinbekomme dass ich auch wieder eine Ebene höher komme?

Immer das Board neu starten kanns nicht sein Tongue


Gruß
Christian
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2015, 21:24
Beitrag #8
RE: Menü u. Submenü von Ricardo - Durchlaufproblem
Hallo!
Erstmal DANKE! Ihr habt mir mit dem Menue schon sehr geholfen.
Ich würde gerne aufgrund eines Charakters, sagen wir mal F == 'H', aus jedem menue/submenue rausspringen und einfach nur Fehler in die mitte vom Tft schreiben. Wenn der "Fehler" wieder weg ist soll einfach das Hauptmenü wieder angezeigt werden. Soll so eine Art Alarmmeldung werden. Hatte schon die Idee einfach oben beim Loopanfang die Abfrage zu machen und in ein neues menue zu springen. Klappt aber irgendwie nicht. Wenn ich if (F == 'H') return; hinter jeden Case schreibe wird es angezeigt, aber halt leider nur dann wenn ich einen Butten dazu betätige. Irgendwie müsste zu der Hauptschleife noch eine Schleife laufen, die andauernd fragt ob F=='H' ist. Hat jemand eine Idee wie ich das umgesetzt bekomme?
Gruss Chris
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Menü über Bluetooth Eingabe abwarten anwo 4 503 18.10.2016 08:59
Letzter Beitrag: Lolliball
  image menu navi für mega2560 mit tft-lcd ArduTux 3 412 16.01.2016 15:52
Letzter Beitrag: arduinofan
  Serial Menü futti0 8 1.112 25.12.2015 19:54
Letzter Beitrag: hotsystems
  Menü mit 3 Buttons programmierer12 2 815 20.11.2014 23:21
Letzter Beitrag: itAxel
  LCD Menü per taster Luppi 3 1.806 06.11.2014 19:40
Letzter Beitrag: Luppi
  Problem mit LCD Touch Menü Bavarian 1 878 28.10.2014 10:23
Letzter Beitrag: Corvus
Brick Arduino LCD Menü Rotary und Settings im Untermenü setzen? Wampo 19 16.615 20.09.2014 14:42
Letzter Beitrag: klaros

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste