Icon: Tuorial 25: Ereignisbehandlungen bei Anwendungen mit mehr als einem Fenster

  • Hallo Himbeerfreunde, Linux-Freaks und Forumsbewohner,


    in diesem Tutorial zeige ich Euch, wie man in der Programmiersprache Icon Anwendungen programmiert,
    - in denen mehrere Fenster, die mit VIB erstellt wurden, gleichzeitig auf dem Bildschirm erscheinen und
    - wie solche Anwendungen in ein gemeinsames Hauptprogramm einfließen.


    An einem einfachen Beispiel führe ich die Entwicklung der Benutzeroberflächen vor, erstelle ein kleines Programm, dass diese beiden Benutzeroberflächen öffnet. Schritt für Schritt zeige ich dann, wie die Bedienelemente der eingebundenen Quellcodes angezeigt werden, wie die Callback-Routinen programmiert werden und wie der Zyklus aussieht, in einem anfänglichen Programm immer mehr Features einzubauen.


    An zwei Beispielen führe ich die Entwicklung von Ereignisbehandlungs-Algorithmen vor. Die erste Methodik lehnt sich an die Icon-Ereignisbehandlung an und erweitert diese auf zwei Fenster. Die zweite Methodik ähnelt sehr der klassischen Ereignisbehandlung, wenn es um die Ereignisbehandlung von Tastatur- und Mausereignissen geht. Durch den Einsatz von Icon-Befehlen bleibt diese Ereignisbehandlung weiterhin sehr schlank und überschaubar, insbesondere dann, wenn Ereignisse von Bedienelementen ausgehen, die mit VIB erzeugt wurden.


    [font="Courier"]Pending(Win1 | Win2 | Win3 | ...)[/font] erkennt, ob an irgendeinem der angesprochenen Fenster ein Ereignis (Bedienelement der GUI, Maus, Tastatur) erkannt wurde. [font="Courier"]*Pending(...)[/font] liefert die Anzahl offener - unbehandelter - Ereignisse.


    Solange [font="Courier"]*Pending() = 0[/font] ist, passiert in einem Programm nicht viel, außer dass man durch ein [font="Courier"]delay()[/font] oder [font="Courier"]WDelay()[/font] eine Verzögerung einbaut, um die CPU-Auslastung zu reduzieren.


    Der Befehl [font="Courier"]Active()[/font] ermittelt schließlich das Fenster mit offenem Ereignis. Das dazugehörige Ereignis kann entweder mit [font="Courier"]Event()[/font] erkannt werden - oder pauschal über [font="Courier"]ProcessEvent()[/font] und den definierten Callback-Routinen verarbeitet werden.


    Aus dem Befehl [font="Courier"]ProcessEvent()[/font] habe ich mehr herausgekitzelt, als man es üblicherweise kennt. Das Interessante ist, dass [font="Courier"]ProcessEvent()[/font] zuerst versucht, das Ereignis in Verbindung mit graphischen Bedienelementen zu betrachten. Misslingt dies, gibt [font="Courier"]ProcessEvent()[/font] das Ereignis zurück - in den meisten Fällen ist dass dann ein Tastatur- oder Mausereignis. Dieses Ereignis kann man entweder einer eigenen Ereignisbehandlung zuführen - oder behandelt dieses Ereignis im Rahmen von zwei weiteren Prozeduren, die man [font="Courier"]ProcessEvent([/font]) als weitere Parameter übergeben kann. Eine von diesen beiden Prozeduren ist für die Größenänderung des Fensters zuständig. Innerhalb dieser Routine kann man bei Bedarf die Größe und Schriftgröße automatisch anpassen. Die andere Prozedur wird unbedingt immer ausgeführt.


    In der umfassendsten Form sieht [font="Courier"]ProcessEvent()[/font] dann so aus:
    [code][font="Courier"]event := ProcessEvent(Root-Vidget des Fensters, alternativeEreignisbehandlung, unbedingteRoutine, ResizeEreignis)[/font]
    [code]


    [font="Courier"]event[/font] Ereigniscode
    Das Root-Vidget kann durch [font="Courier"]vidgets["root"][/font] ermittelt werden.


    Die drei Prozedursufrufe [font="Courier"]alternativeEreignisbehandlung[/font], [font="Courier"]unbedingteRoutine[/font], [font="Courier"]ResizeEreignis[/font] übergeben, ohne dass man dies angeben müsste, folgende Argumente an diese Prozeduren:
    [font="Courier"]event[/font] Ereignis-Code
    [font="Courier"]x[/font] x-Koordinate des Ereignisses
    [font="Courier"]y[/font] y-Koordinate des Ereignisses


    Und wem das alles zuviel ist, der mag einmal GetEvent() einsetzen. Dieser Befehl ist DIE Ereignisbehandlung für vollkommen ereignisgesteuerte Anwendungen.


    Viel Spaß mit der angehängten Datei!


    Andreas

    Files

    • Icon_Teil25.pdf

      (514.8 kB, downloaded 197 times, last: )

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().