Referenzliste Einführung -blättern- Referenzliste Menu Library

Inhalt | Start

Die Menu Library

2. Menu Library
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
Definition von Menüs
Menü-Abfrage
Die Auswertung der Variablen Entry
Untermenüs
Menü-Attribute
Hinzufügen und Löschen von Einträgen
Das Löschen eines Menüs
Das Verwalten mehrerer Menüs mit EasyGem
Richtlinien für die Menüprogrammierung
Popup-Menüs
Verbindung zur Mac OS Toolbox
Referenzliste Menu Library




Ein sehr wichtiger Teil eines Benutzer-Interfaces sind die Menüs. Sie kennen das Menü des Finders. In der obersten Zeile erscheint eine Reihe von Einträgen. Klickt man mit dem Mauszeiger auf einen Eintrag, klappt ein Kasten mit mehreren Untereinträgen herunter. Aus denen kann man dann mit der Maus den gewünschten Eintrag auswählen.
Solche Menüs werden normalerweise mit einem Resource-Editor erstellt, der die Informationen in die Resourcefork Ihres Programms schreibt. Von dort müssen Sie dann über eine Nummer und den Typ identifiziert, vom Programm geladen und beim MacOS angemeldet werden.
Das ist mit EasyGem alles viel einfacher: Sie brauchen kein zusätzliches Programm, die Menüs werden mit einfachen und übersichtlichen Befehlen direkt in Ihrem Programm definiert und verwaltet. Mit EasyGem kann auch ein Anfänger professionelle Menüs programmieren.




2.1 Definition von Menüs

Wir wollen mit der Erklärung dort ansetzen, wo auch die Programmierung beginnt: bei der Festlegung, wie das Menü aussehen soll.
Zunächst brauchen Sie natürlich eine genaue Vorstellung von Ihrem Menü. Jedes Menü enthält mindestens einen Menü-Titel. Das ist im allgemeinen das Apfel-Menü, von dem aus die Kontrollfelder aufgerufen werden können. In diesem Menü können Sie genau einen weiteren Menüpunkt eintragen. Meistens bringt man hier seine Copyrightmeldung unter.
Die weiteren Menü-Titel sind vollkommen frei belegbar. Sie sollten sich also zunächst überlegen, wie Sie Ihre Menü-Titel nennen wollen, wieviele es sind, und welche Einträge Sie jeweils für die einzelnen Menü-Titel anmelden wollen. Ihr Menü entwerfen Sie dann einfach im Programm mit den folgenden EasyGem Befehlen:


Make_Menu Apple$, Info$, R Info [,Menuname$]
Def_Menu [R Menu_Id,] Info$, R Info
Menü-Definition beginnen.
M_Title Titel$[,R Entry]
Menü-Titel festlegen.
M_Entry Txt$, R Entry
M_Subtitle Subtitel$[,R Entry]
Menü-Eintrag bzw. Menü-Untertitel definieren.
M_Line_Entry
Menü-Zeile definieren.
M_End_Title
Titel oder Untertitel abschliessen.
End_Menu
Menü-Definition beenden.


Dazu zunächst ein kleines Beispiel:
Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Neu",New1
  M_Entry "Öffnen",Open1
  M_Entry "Speichern",Save1
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu

Sie sehen an diesem Beispiel, daß Def_Menu die Definition des Menüs einleitet und End_Menu sie abschließt. Die eigentliche Festlegung, wie das Menü aussieht, wie also die Einträge und Menü-Titel heißen und welcher Eintrag zu welchem Titel gehört, steht im Programm zwischen dem Def_Menu und dem End_Menu.
In der ersten Variablen hinter Def_Menu erhalten Sie eine Identifikationsnummer zurück, die Sie später für weitere EasyGem-Funktionen benötigen. Wenn Sie nur ein einziges Menü benutzen wollen, können Sie diese Variable auch weglassen.
Der zweite Parameter hinter
Def_Menu ist der Text des ersten Eintrags im Apfel-Menü (normalerweise irgendeine Copyright-Meldung). Die Variable Info bei Def_Menu dient der Erkennung, ob der entsprechende Eintrag angeklickt wurde.
Mit M_Title wird ein neuer Menü-Titel angefangen. Als Parameter muß die Bezeichnung des Menü-Titels übergeben werden.

Danach werden mit
M_Entry die einzelnen Einträge des Menü-Titels bestimmt. Das sind die Teile, die herausklappen, sobald man mit der Maus auf den Menü-Titel klickt. Hinter M_Entry muß der Name des Eintrags angegeben werden, sowie eine Variable, in der Sie eine Referenznummer für diesen Eintrag zurückerhalten. Damit können Sie später feststellen, welcher Menüpunkt ausgewählt wurde.

Mit
End_Menu schließlich wird die Menüdefinition abgeschlossen.
Hinweis: Der Befehl Make_Menu ist nur noch aus Kompatibilitätsgründen zu älteren EasyGem Versionen vorhanden. Verwenden Sie bei neuen Programmen besser Def_Menu statt Make_Menu.

Wenn nun ein Menü in der beschriebenen Weise definiert worden ist, kann es auf den Bildschirm gebracht werden. Dazu dient der Befehl:


M_Show
Menü darstellen.

Zunächst sind natürlich noch keine Kästen heruntergeklappt, so daß man nur die Titelzeile des Menüs sieht.


In vielen Fällen ist es nötig, ein Menü komplett abzuschalten, zum Beispiel, wenn eine modale Dialogbox dargestellt wird, oder der Programmablauf aus anderen Gründen nicht durch Menüaktionen des Anwenders gestört werden soll. Dafür gibt des den Befehl M_Hide. Er macht das ganze Menü inaktiv, es ist dann also immer noch zu sehen, aber nicht mehr anwählbar.


M_Hide
Menü nicht anwählbar machen. Mit M_Show kann das so inaktivierte Menü wieder aktiviert werden.


Sie können mit den bis jetzt eingeführten Befehlen schon ein kleines Beispielprogramm schreiben. Dazu nehmen wir das obige Programm und fügen noch einige Zeilen hinzu. Unser kleines Programm wird noch keine Abfrage des Menüs enthalten, sondern dieses lediglich darstellen und nach 5 Sekunden wieder löschen.

COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Neu",New1
  M_Entry "Öffnen",Open1
  M_Entry "Speichern",Save1
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu
M_Show
WAIT 5
Easy_Exit
END




2.2 Menü-Abfrage

Vielleicht haben Sie versucht, während der fünf Sekunden, die das Menü dargestellt wurde, mit der Maus in die Titelzeile zu fahren, um irgendeinen Eintrag herunterzuklappen. Wenn Sie das gemacht haben, ist nichts passiert, gar nichts klappte herunter.
Der Grund dafür ist, daß Sie EasyGem noch nicht aufgefordert haben, sich um solche Ereignisse wie "Maus ist in der obersten Zeile, also Menü aufklappen" zu kümmern. Um die notwendige Prozedur hier einzuführen, müssen wir etwas weiter ausholen.

Es gibt verschiedene Arten von Aktionen, die der Benutzer machen kann: Er kann Fenster bedienen (vergrößern/verkleinern, verschieben, löschen, in den Hintergrund klicken, Schiebebalken einstellen etc.), und er kann mit dem Menü arbeiten (also Menüs herunterklappen lassen und einzelne Einträge anklicken). EasyGem stellt verschiedene Prozeduren zur Verfügung, je nachdem, ob nur mit Menüs oder mit Menüs und Fenstern gearbeitet werden soll.

Der einfachste Aufruf von EasyGem, der nur Menü-Aktionen des Benutzers behandelt, ist:


M_Waitmesag R Entry
Auf Menü-Ereignis warten.

Die Prozedur M_Waitmesag erledigt alles für Sie: Wenn die Maus in die oberste Zeile hineinbewegt und die Maustaste gedrückt wird, klappt das entsprechende Menü herunter. Sobald der Benutzer dann einen Eintrag aus dem heruntergeklappten Kasten auswählt, setzt M_Waitmesag die Variable Entry entsprechend und kehrt zurück.

Wenn Sie das Programm von vorhin noch im Speicher haben, dann können Sie das WAIT 5 probehalber durch ein M_Waitmesag Entry ersetzen. Das geänderte Programm zeigt die Menü-Kopfzeile an und wartet solange, bis Sie mit der Maus irgendeinen Menükasten herunterklappen lassen und einen Eintrag anklicken. Danach kehrt M_Waitmesag wieder zurück, Easy_Exit wird aufgerufen und das Programm wird beendet.

Wichtig: M_Waitmesag wartet solange, bis ein Menüpunkt angeklickt wurde und gibt erst dann dem Programm die Kontrolle zurück! Wenn die Menüabfrage sozusagen nebenbei erfolgen soll, also wenn Ihr Programm, während die Menüzeile dargestellt wird, noch andere Aktionen ausführen soll, dann müssen Sie Easy_Mesag verwenden:


Easy_Mesag R Entry
Fragt das Menü ab und gibt in Entry entweder 0 (nichts angeklickt) oder den angeklickten Menüpunkt zurück.

Easy_Mesag entspricht M_Waitmesag, nur daß eben nicht gewartet wird, bis ein Menüpunkt angeklickt wurde. Aber nur innerhalb von Easy_Mesag wird überhaupt abgefragt, ob ein Kasten herunterklappen soll und welcher Menüpunkt ausgewählt wurde. Deshalb ist es nötig, Easy_Mesag immer wieder aufzurufen! Wenn Sie das nicht tun, also z.B. Easy_Mesag nur ein einziges Mal aufrufen, dann wird nur während der kurzen Zeit, die die Ausführung von Easy_Mesag benötigt, die Maus abgefragt. Danach findet keine Maus-Abfrage durch EasyGem mehr statt, und der Benutzer kann zwar mit der Maus in die Kopfzeile fahren, aber es wird nichts geschehen. Die richtige Anwendung von Easy_Mesag ist also:


REPEAT
 Easy_Mesag Entry
 'Hier kann ein kurzer Programmteil stehen.
UNTIL Ende_Bedingung

Es ist wichtig, daß der "kurze Programmteil" nicht zu lange Ausführungszeit in Anspruch nimmt. Tut er das, so wird Easy_Mesag zu selten aufgerufen und damit die Maus zu selten abgefragt. Die Folge kann sein, daß der Benutzer mit der Maus in die Titelzeile hineinfährt, aber das Menü erst eine halbe Sekunde später herunterklappt (nämlich das nächste Mal, wenn Easy_Mesag aufgerufen wird).



2.3 Die Auswertung der Variablen Entry

In der Variablen
Entry wird sowohl bei M_Waitmesag als auch bei Easy_Mesag zurückgegeben, welcher Menüpunkt vom Benutzer ausgewählt wurde. Bei M_Waitmesag wird jedoch so lange gewartet, bis ein Menüpunkt angewählt wurde. Easy_Mesag kann dagegen in Entry auch Null zurückgeben, nämlich genau dann, wenn gerade kein Menüpunkt angeklickt wurde. Der Unterschied ist etwa der gleiche wie zwischen INPUT$(1) und INKEY$. Im ersten Fall wartet der Computer, bis eine Taste gedrückt wurde; im zweiten Fall wird ein Leerstring gemeldet, falls noch keine Taste gedrückt worden ist.

Es ist gar nicht so einfach, in einer einfachen Zahl die Information darüber, welcher Eintrag angeklickt wurde, unterzubringen. Man könnte die Einträge durchnumerieren, und in Entry die Nummer des Eintrags zurückgeben, aber was passiert, wenn im Menü ein Eintrag eingefügt wird? Dann stimmen sämtliche Abfragen auf Einträge hinter dem neu dazugekommenen nicht mehr. Deshalb geht EasyGem einen anderen Weg.

Vielleicht erinnern Sie sich an die Variable, die Sie bei jedem M_Entry angeben müssen. Die Syntax von M_Entry ist ja bekanntlich:


M_Entry Txt$,R Entry
Menüeintrag definieren.


In Entry wird dabei die interne Kennummer des betreffenden Eintrags zurückgegeben. Diese Nummer erhalten Sie später auch von M_Waitmesag und Easy_Mesag zurück. Durch einfachen Vergleich können Sie dann feststellen, ob der betreffende Eintrag angewählt wurde oder nicht.Die interne Nummer selbst brauchen Sie dabei gar nicht zu kennen.

Im Prinzip funktioniert also die Abfrage von Menüs folgendermaßen:

1. Sie definieren Ihr Menü mit
Def_Menu, M_Title, M_Subtitle, M_Entry und End_Menu. Sie geben bei jedem M_Entry eine Variable an. Als Beispiel soll das Datei-Menü dienen, das wir schon kennen. Da waren es die Variablen New1, Open1, Save1 und Quit1.

2. Sie rufen
M_Waitmesag oder Easy_Mesag auf und erhalten die Variable Entry zurück.

3. Um festzustellen, welcher Eintrag angewählt wurde, vergleichen Sie Entry mit New1, Open1, Save1 und Quit1. Wenn Entry gleich New1 ist, wurde der Menüpunkt "Neu" ausgewählt; ist Entry gleich Open1, so wurde "Öffnen" angewählt und so weiter. Wenn Entry gleich null ist, wurde nichts angeklickt (diese Rückmeldung ist nur bei Easy_Mesag möglich, M_Waitmesag kehrt nicht zurück, wenn nichts angeklickt wurde.

4. Abhängig davon, was ausgewählt wurde, kann nun Ihr Programm reagieren.


Das nachfolgende Beispielprogramm bringt ein kleines Menü auf den Bildschirm und gibt jeweils den Namen des angeklickten Menüeintrags aus. Durch Auswählen von
"Beenden" kann das Programm verlassen werden.


COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"
COMPILER "OPW 320*200"

Easy_Init

'Definitionsteil.
Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Neu",New1
  M_Entry "Öffnen",Open1
  M_Entry "Speichern",Save1
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu
'Ende Definitionsteil.

M_Show:'Menü wird dargestellt.

REPEAT
 M_Waitmesag X
 Select X
  CASE Info:PRINT "Über dieses Info"
  CASE New1:PRINT "Neu"
  CASE Open1:PRINT "Öffnen"
  CASE Save1:PRINT "Speichern"
 END_SELECT
UNTIL X=Quit1

Easy_Exit:'Programmende: EasyGem abmelden.
END

Hinweis: Das Beispielprogramm verwendet ein Omikron Basic Ausgabefenster, weil wir noch nicht erklärt haben, wie man mit EasyGem Fenster anlegt und verwaltet. Sobald Sie die Fensterprogrammierung mit EasyGem beherrschen, sollten Sie keine Omikron Basic Ausgabefenster mehr benutzen.



2.4 Untermenüs

Ab EasyGem 4.0 besteht auch die Möglichkeit, Untermenüs zu definieren. Dazu gibt es die beiden folgenden Prozeduren:


M_Subtitle Titel$[,R Entry]
M_End_Title
Untermenü definieren

Nehmen wir z.B. an, Sie hätten ein Malprogramm geschrieben und möchten dem Anwender die Möglichkeit geben, beim Speichern des Bildes zwischen verschiedenen Dateiformaten zu wählen. Dazu könnten Sie ein Untermenü einfügen, wie im folgenden Beispiel:

Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Neu",New1
  M_Entry "Öffnen",Open1
  M_Subtitle "Speichern",Save1
   M_Entry "als 'PICT'",Save_Pict1
   M_Entry "als 'GIF'",Save_Gif1
   M_Entry "als 'TIFF'",Save_Tiff1
  M_End_Title
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu
Wie Sie sehen, ist an die Stelle des Menüeintrags "Speichern" jetzt die Definition eines Untermenüs getreten. Die einzelnen Einträge im Untermenü werden auf die gleiche Weise definiert, wie bei einem normalen Menü. Sie müssen aber unbedingt darauf achten, dass die Definition des Untermenüs mit M_End_Title abgeschlossen wird, damit EasyGem weiss, dass alle folgenden Einträge wieder zum Hauptmenü gehören.

Es ist sogar möglich, Untermenüs zu schachteln, d.h. Unteruntermenüs usw. anzulegen. Denken Sie aber daran, dass jedes einzelne Untermenü mit
M_End_Title abgeschlossen wird. Es muss in Ihrer Definition genauso viele M_Subtitle Befehle wie M_End_Title Befehle geben.



2.5 Menü-Attribute

Vielleicht haben Sie schon Menüs gesehen, die irgendwelche Extras aufwiesen. Manche Einträge waren nicht anklickbar (das sieht man daran, daß sie in grauer Schrift dargestellt werden), es gibt Einträge mit einem Häkchen oder mit einem anderen Symbol davor, es gibt Einträge, die in einem anderen Schriftstil dargestellt werden oder mit einem Tastaturshortcut versehen sind und schließlich gibt es Programme, die ihre Menüeinträge während des Programmablaufs ändern. Alles das können Sie mit EasyGem auch machen und zwar genauso einfach, wie das Erstellen eines Menüs selbst.

Unter einem Attribut versteht man eine Eigenschaft eines Menüeintrags. Das Attribut "checked" bedeutet z.B. ein Häkchen vor dem Menüeintrag. Wenn ein Menüeintrag das Attribut "disabled" hat, ist er grau dargestellt und nicht anwählbar.

Mit EasyGem können Sie sehr einfach die Attribute aller Menüeinträge ändern. Um zum Beispiel das Attribut "checked" zu setzen, benötigen Sie nur einen Aufruf von
M_Check:


M_Check Entry
Setzt das Attribut "checked" (das Häkchen) auf den Menüeintrag Entry.

Mit Entry ist wieder die interne Kennummer des entsprechenden Menüeintrags gemeint. Diese interne Kennummer wird ja schon von M_Entry in der Definition des Menüs zurückgegeben. Sie können also für Entry einfach immer die Variable angeben, die Sie auch bei M_Entry verwendet haben.


Def_Menu "Info",Info
 M_Title "Datei"
  M_Entry "Mit Checkmark",Checkmark1
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu
M_Check Checkmark1:'Hier wird der Eintrag "Mit Checkmark" mit dem
'Attribut "checked" versehen. Damit hat der Eintrag ein vorgestelltes Häkchen,
'sobald der Menükasten herunterklappt.


Wie Sie sehen, wird bei M_Check einfach die Variable Checkmark1 angegeben. Diese Konvention zieht sich wie ein roter Faden durch EasyGem. Für den Eintrag "Mit Checkmark" steht die Variable Checkmark1. Immer wenn dieser Eintrag gemeint ist, gibt man entweder die Variable Checkmark1 explizit an (wie bei M_Check), oder vergleicht mit dieser Variablen (wie bei M_Waitmesag oder Easy_Mesag ).
Um den Sachverhalt zu verdeutlichen, können Sie im vorherigen Demoprogramm die Zeile

CASE New1:PRINT "Neu"

ersetzen durch:
CASE New1:M_Check New1


Wenn jetzt der Menüpunkt "Neu" angeklickt wird, dann wird er mit dem Attribut "checked" versehen, bekommt also ein Häkchen vorangestellt.
Für jeden Menüeintrag muß stets die Variable stellvertretend stehen, die bei der Definition des Menüeintrags mit
M_Entry angegeben wurde.


Natürlich gibt es noch eine Reihe anderer Attribute und zugeordneter Befehle, die Sie hier aufgelistet finden:


Attribut "checked" (vorgestelltes Häkchen):
M_Check Entry
Setzen.
M_Uncheck Entry
Löschen.

Attribut "disabled" (graue Darstellung, nicht anwählbar):
M_Disable Entry
Setzen.
M_Enable Entry
Löschen.

Hinweis: Mit diesen Befehlen kann auch der Menü-Titel selbst und damit das ganze zugehörige Menü "disabled" bzw. "enabled" werden. Dazu müssen Sie in Entry nur die Nummer des Menütitels übergeben und danach M_Draw aufrufen, damit die Änderung sichtbar wird.


Attribut "crossed" (vorgestelltes durchgestrichenes Rechteck):
M_Cross Entry
Setzen.
M_Uncross Entry
Löschen.

Attribut "font" (Schriftfont ändern):
M_Font Entry,Font
In Font muß die Idendificationsnummer des gewünschten Fonts übergeben werden. Wenn Sie diese Nummer nicht kennen, können Sie die Funktion FN Get_Font_Number aus der Extension Library verwenden, um über den Font-Namen die Font-Nummer zu erfahren.

Attribut "style" (Schriftstil ändern):
M_Style Entry,Style
Für Style muß der gleiche Wert wie bei dem BASIC-Befehl TEXT STYLE übergeben werden.

Attribut "mark" (Markierung anbringen):
M_Mark Entry,Mark
Mark muß den ASCII-Code eines Zeichens enthalten, das vor dem Menü dargestellt werden soll.
Alle Attribute löschen:
M_Normal Entry
Der Eintrag wird wieder normal dargestellt.

Bei einigen Menüeinträgen möchte man gern, daß diese auch von der Tastatur aus ausgelöst werden können. Dabei wurde von Apple festgelegt, daß dafür die Command-Taste in Verbindung mit einer normalen Taste benutzt werden soll. Zwischen Groß- und Kleinbuchstaben wird in diesem Fall nicht unterschieden. Für diese sogenannten Shortcuts gibt es bei EasyGem auch einen Befehl:

Attribut "shortcut" (Taste definieren):
M_Command Entry,Cmd
Für Cmd geben Sie den ASCII-Code des Zeichens an, das den Menüeintrag auslösen soll.
Hinweis: Wenn Cmd=0 angegeben wird, dann wird der Shortcut wieder entfernt.

Seit MacOS 8.0 ist es möglich, auch die anderen Modifier-Keys für Menü-Shortcuts zu verwenden. Dafür wurde in EasyGem 4.0 der Befehl M_Modifier eingeführt.
Attribut "modifier" (Modifier-Keys definieren):
M_Modifier Entry,Modifier
In Modifier müssen sie eine Bitmaske übergeben. Dabei haben die einzelnen Bits folgende Bedeutung:

Bit 0: Shift-Key
Bit 1: Alt-Key
Bit 2: Ctrl-Key
Bit 3: NOT Cmd-Key

Bitte beachten Sie, dass Bit 3 ein Negativbit ist. Wenn dieses Bit gesetzt ist, wird die Cmd-Taste nicht benutzt.

Beispiel:
Def_Menu "Info",Info
 M_Title "Datei"
  M_Entry "Shift+Alt+A",Entry1
  M_Line_Entry
  M_Entry "Beenden",Quit1
End_Menu
M_Command Entry1,65:'Hier wird definiert, dass der Eintrag "Shift+Alt+A"
M_Modifier Entry1,%1011:'auch durch die Tastenkombination [Shift]+[Alt]+A
'ausgelöst werden kann. Die sonst übliche Cmd-Taste wurde durch das
'3. Bit abgeschaltet.



Manchmal ist es nötig, den Text eines Menüeintrags während des Programmlaufs zu ändern. Zum Beispiel könnte eine Undo-Funktion sich, je nach getopptem Fenster, mal auf Text und mal auf Grafik beziehen. Damit der Anwender weiß, was jeweils rückgängig gemacht werden kann, sollte der Text im Menüeintrag jeweils angepaßt werden.

Dafür gibt es den Befehl:
M_Text Entry,Txt$
In Txt$ kann ein beliebiger Stringausdruck übergeben werden (maximal 255 Zeichen).

Sicher haben Sie schon gesehen, dass einige Programme auch Icons in ihren Menüs verwenden. Seit Version 4.0 ist auch das mit EasyGem möglich. Das Problem besteht allerdings darin, dass man das Aussehen eines Icons nicht wie bei einem Text einfach durch einen Befehl festlegen kann. Wenn Sie Ihre Menüs mit Icons ausstatten wollen, benötigen Sie darum zusätzliche Software, nämlich einen sogenannten Resource-Editor. Ein kostenloses Programm dieser Art und für die meisten Zwecke völlig ausreichend ist "ResEdit" von Apple, das Sie sich von Apple's Internetseite herunterladen können.
Damit öffnen Sie dann die Datei mit dem BASIC-Code Ihres Programms und legen eine Resource vom Typ 'cicn' an. Das ist ein kleines Bild von 32 x 32 Pixeln, das Sie mit dem in ResEdit eingebauten Editor erstellen können. Der Icon-Resource müssen Sie eine Nummer zuweisen, die zwischen 256 und 510 liegen darf. Diese Nummer geben Sie dann bei
M_Icon für Icon an.

Attribut "icon" (Icon zuweisen):
M_Icon Entry,Icon
In Icon müssen sie die Resource-Nummer des gewünschten Icons übergeben

Das Icon wird im Menü normalerweise in seiner vollen Grösse von 32 x 32 Pixeln dargestellt. Da dadurch der Menüeintrag sehr gross wird, besteht die Möglichkeit, das Icon mit dem Befehl M_Command Entry,$1D auf 16 x 16 Pixel zu verkleinern.

Manchmal muß man abfragen können, ob ein Eintrag ein bestimmtes Attribut hat oder nicht. Auch dafür gibt es in EasyGem Funktionen:

Abfrage auf "checked" (vorgestelltes Häkchen):
FN M_Checked(Entry)
Ergibt -1, wenn der Eintrag "checked" ist, sonst 0.

Abfrage auf "disabled" (graue Darstellung, nicht anwählbar):
FN M_Enabled(Entry)
Ergibt -1, wenn der Eintrag "enabled" (anwählbar) ist, sonst 0.

Abfrage auf "crossed" (vorgestelltes durchgestrichenes Rechteck):
FN M_Crossed(Entry)
Ergibt -1, wenn der Eintrag "crossed" ist, sonst 0.
Abfrage auf "font" (Schriftfont des Menüeintrags):
FN M_Font(Entry)
Gibt die Nummer des Schriftfonts zurück.
Abfrage auf "style" (Schriftstil des Menüeintrags):
FN M_Style(Entry)
Gibt den Schriftstil zurück (Bedeutung wie bei TEXT STYLE).
Abfrage auf "mark" (Markierung des Menüeintrags):
FN M_Mark(Entry)
Gibt den ASCII-Code der Markierung des Menüeintrags zurück.

Abfrage auf "shortcut" (Shortcut des Menüeintrags):
FN M_Command(Entry)
Gibt den ASCII-Code des Shortcuts zurück, der zum Menüeintrag gehört.


Abfrage auf "modifier" (Modifier-Keys des Menüeintrags):
FN M_Modifier(Entry)
Gibt einen Wert zurück, aus dem Sie entnehmen können, welche Modifier-Keys zusammen mit dem Shortcut gedrückt sein müssen, um diesen Menüeintrag auszulösen. Beschreibung des Rückgabewertes bei M_Modifier.


Abfrage auf "text" (Text des Menüeintrags):
FN M_Text$(Entry)
Gibt den Text des Menüeintrags als String zurück.


Abfrage auf "icon" (Icon-Nummer des Menüeintrags):
FN M_Icon(Entry)
Gibt die Nummer des Icons zurück, das in diesem Menüeintrag angezeigt wird.


Um zum Beispiel bei unserem Demoprogramm abzufragen, ob der Eintrag "Öffnen" "checked" ist oder nicht, müßte man folgende Programmzeile einfügen:
IF FN M_Checked(Open1)
 THEN PRINT "Mit Checkmark"
 ELSE PRINT "Ohne Checkmark"
ENDIF

Wie Sie gesehen haben, können Sie die Attribute auch schon setzen, wenn das Menü noch gar nicht angezeigt wird. Allerdings funktionieren die bisher besprochenen Funktionen und Prozeduren nur, wenn die Definition des Menüs bereits abgeschlossen ist, also nachdem End_Menu ausgeführt wurde.

Wenn Sie in Ihrem Menü von vorneherein ein bestimmtes Attribut für irgendeinen Eintrag setzen wollen, können Sie einen anderen Weg gehen: Sie schreiben einfach (Beispiel: für Attribut "checked") in die Zeile mit dem M_Entry hinter das M_Entry selbst den Aufruf M_Check (ohne Parameter). Das sieht dann etwa so aus:

M_Entry "Öffnen",Open1:M_Check 'Dieser Eintrag wird jetzt gechecked,
'bekommt also einen Haken.

Das funktioniert völlig analog auch mit den anderen Attributen:

M_Disable
Eintrag sofort "disablen".
M_Check
Eintrag sofort "checken".
M_Cross
Eintrag sofort "crossen".
M_Font Font
Schriftfont festlegen.
M_Style Style
Schriftstil festlegen.
M_Mark Mark
Markierung festlegen.
M_Command Cmd
Shortcut festlegen.
M_Modifier Modifier
Modifier-Keys festlegen.
M_Icon Icon
Icon festlegen.


Es wird jeweils das entsprechende Attribut gesetzt. Damit EasyGem weiß, auf welchen Menüeintrag sich der jeweilige Befehl bezieht, müssen diese Aufrufe direkt hinter dem M_Entry stehen, auf das sie sich beziehen.
Die Umkehrfunktionen gibt es übrigens nicht . Wenn ein Eintrag z.B. nicht "crossed" sein soll, dann geben Sie ganz einfach
M_Cross nicht an.

Eine weitere Möglichkeit, Menüattribute gleich bei der Definition festzulegen besteht in der Verwendung sogenannter Metacharacter. Diese können direkt hinter den Text des jeweiligen Menüeintrags geschrieben werden. Es gibt folgende Metacharacter:


!
Der Buchstabe hinter dem Ausrufezeichen wird als Markierung an den Anfang des Eintrags gesetzt (z.B. das Diamantsymbol oder das Häkchen).
<
Damit kann man die Textattribute des Menüs festlegen. Dazu dienen die Buchstaben B (bold), I (italic), U (underline), O (outline) und S (shadow). Es können auch mehrere dieser Buchstaben hinter dem Kleiner-Zeichen stehen.
/
Dient zum Festlegen des Tastatur-Shortcuts für diesen Menüeintrag.
(
Der Eintrag wird disabled, ist also nicht anwählbar.

Um zum Beispiel einen Menüeintrag "Print" zu definieren, der auch durch [Cmd] + [P] ausgelöst werden kann und zunächst "disabled" ist, weil nach Programmstart noch kein Dokument geladen ist, das gedruckt werden könnte, müßte man folgenden Befehl eingeben:

M_Entry "Print/P(",Prn

Hinweis: Sobald ein Dokument geladen ist, das gedruckt werden kann, müssen Sie natürlich mit M_Enable dafür sorgen, daß der Menüeintrag "Print" anwählbar wird.


Da ja bekanntlich aller guten Dinge drei sind, bietet EasyGem noch eine weitere Möglichkeit, um Attribute gleich bei der Definition zu setzen. Dazu dienen die folgenden vier Befehle:


M_Disabled_Entry Txt$,R Entry
Definiert einen Eintrag, anolog zu M_Entry, nur daß der Eintrag gleich "disabled" ist.
M_Checked_Entry Txt$,R Entry
Definiert einen Eintrag analog M_Entry, nur daß der Eintrag "checked" ist.
M_Crossed_Entry Txt$,R Entry
Definiert einen Eintrag analog M_Entry, nur daß der Eintrag "crossed" ist.
M_Disabled_Entry Txt$
Entspricht M_Disabled_Entry Text$,R Entry, nur wird hier keine Kennzeichner-Variable zuruckgegeben. Sie können diesen Eintrag also nicht abfragen, was aber nicht schlimm ist, da er ohnehin nicht anklickbar ist.

Die verschiedenen Einträge eines Menüs lassen sich oft in bestimmte Funktionsgruppen einteilen, z.B. Funktionen, die Fenster öffnen, andere, die Fenster schließen oder solche, die Fensterinhalte drucken. Um die Funktionsgruppen voneinander zu trennen, werden am besten durchgezogene Linien in das Menü eingetragen. Dafür gibt es in EasyGem den Befehl:

M_Line_Entry
Durchgezogene Linie definieren.

Die Trennlinie ist natürlich nicht anwählbar und dient nur der Übersichtlichkeit.


2.6 Hinzufügen und Löschen von Einträgen

Sicherlich haben Sie schon mit Programmen gearbeitet, die ihre Menüs während der Laufzeit verändern. Häufig wird z.B. ein Menü-Titel mit der Bezeichnung "Fenster" angelegt, wobei in dieses Menü dynamisch die Titelzeilen der gerade geöffneten Fenster eingetragen werden. Öffnet der Anwender ein neues Fenster, so wird der Name dieses Fensters zusätzlich in das Fenster-Menü aufgenommen; schliesst der Anwender ein Fenster, so wird dieses wieder aus dem Fenster-Menü entfernt.
Der Anwender kann dann einfach durch Auswählen des entsprechenden Menüeintrags das gewünschte Fenster toppen.

Ab Version 4.0 können Sie auch Ihre EasyGem Menüs dynamisch verwalten. Dafür gibt es die beiden Prozeduren:

M_Insert Item, Txt$,R Entry
M_Delete Item
Mit diesen beiden Befehlen können nachträglich Menü-Einträge hinzugefügt bzw. entfernt werden.
Wenn Sie einen neuen Menü-Eintrag einfügen wollen, müssen Sie EasyGem natürlich mitteilen, an welcher Stelle der neue Eintrag eingesetzt werden sollen. Dazu übergeben Sie in Item die Nummer eines bereits vorhandenen Eintrags (kann auch die Nummer eines Titels sein, wenn noch kein Eintrag vorhanden ist). EasyGem fügt dann den neuen Eintrag direkt hinter den durch Item spezifizierten ein.
Wenn Sie
-Item statt Item übergeben, wird der neue Eintrag nicht hinter sondern vor Item eingesetzt. Bei M_Delete ist diese Unterscheidung natürlich sinnlos.
Die übrigen Parameter haben die gleiche Bedeutung wir bei
M_Entry.

Um zu verdeutlichen, was im einzelnen zu tun ist, haben wir wieder ein kleines Beispielprogramm geschrieben:

COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

DIM Window(64)
'Definitionsteil.
Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Statisch"
  M_Entry "Hinzufügen",Insert1
  M_Entry "Entfernen",Delete1
  M_Line_Entry
  M_Entry "Beenden",Quit1
 M_Title "Dynamisch",Window(0)
End_Menu
'Ende Definitionsteil.

M_Show:'Menü wird dargestellt.

REPEAT
 M_Waitmesag X
 Select X
  CASE Insert1:N+=1
   M_Insert Window(N-1),"Fenster"+STR$(N),Window(N)
  CASE Delete1
   If N>0 THEN M_Delete Window(N):N-=1
 END_SELECT
UNTIL X=Quit1

Easy_Exit:'Programmende: EasyGem abmelden.
END

Immer wenn Sie aus dem Menü "Statisch" den Menüpunkt "Hinzufügen" auswählen, wird in das Menü "Dynamisch" ein neuer Eintrag vorgenommen und zwar hinter den bereits bestehenden. Entsprechend wird der letzte Eintrag entfernt, wenn Sie "Entfernen" anklicken.
Dieses Hinzufügen bzw. Entfernen würde man in der Praxis natürlich nicht mit dem Anklicken bestimmter Menü-Einträge sondern mit dem Öffnen bzw. Schliessen von Fenstern verbinden.

Hinweis: Da mit diesen Befehlen an beliebiger Stelle Menü-Einträge eingefügt bzw. entfernt werden können, dürfen Sie nicht mehr davon ausgehen, dass aufeinanderfolgende Menüeinträge auch aufeinanderfolgende Nummern haben. Vielmehr sucht EasyGem für den neuen Eintrag eine freie Nummer, z.B. die eines Eintrags, der zuvor an anderer Stelle mit M_Delete entfernt wurde.



2.7 Das Löschen eines Menüs

Im allgemeinen wird man ein einmal definiertes Menü zur Laufzeit des Programms nicht wieder löschen wollen. In speziellen Fällen kann das jedoch erforderlich sein. Darum gibt es auch dafür einen Befehl in der EasyGem Library. Er lautet:

Clear_Menu
Menü löschen.

2.8 Das Verwalten mehrerer Menüs mit EasyGem

Wenn Sie in Ihren Programmen mit einem einzigen Menü auskommen, dann brauchen Sie dieses Kapitel nicht zu lesen. Nur wenn Sie mehrere, verschiedene Menüs von einem Programm aus verwenden wollen, dann benötigen Sie die folgenden Prozeduren und Funktionen.
Wenn man mehr als ein Menü verwenden will, muß man eine Möglichkeit einführen, mit der die verschiedenen Menüs unterschieden werden können. Dazu dient in EasyGem ein weiterer Parameter, der bei allen Befehlen mit angegeben werden muß, bei denen die Identifizierung eines bestimmten Menüs erforderlich ist.
Diese Identifikations-Nummer wird Ihnen im ersten Parameter bei Def_Menu zurückgegeben. Aus Kompatibilitätsgründen zu älteren EasyGem Versionen gibt es auch noch den Befehl End_Menu mit einem Rückgabeparameter:

End_Menu R Menu_Id
Entspricht End_Menu, gibt aber zusätzlich die Identifikationsnummer des gerade definierten Menüs zurück. Diese Nummer ist identisch mit der Nummer, die Sie schon bei Def_Menu zurückerhalten haben.

Hinweis: Wenn Sie Def_Menu mit drei Parametern verwenden, brauchen Sie natürlich nicht noch einmal mit End_Menu die Identifikationsnummer abzuholen.

Die Definition eines Menüs mit Def_Menu, M_Title, M_Subtitle und M_Entry (oder M_Disabled_Entry, oder, oder ... ) erfolgt beim Arbeiten mit mehreren Menüs ganz genauso, wie beim Arbeiten mit nur einem Menü. Allerdings müssen Sie immer Def_Menu mit drei Parametern verwenden, wobei der ersten Variablen die Identifikations-Nummer des gerade definierten Menüs zugewiesen wird. Im Unterschied zum einfachen Fall sind also in einem solchen Programm mehrere Def_Menu mit jeweils zugeordnetem End_Menu vorhanden. Jedes Menü erhält seine eigene, unverwechselbare Identifikations-Nummer.

Wenn die Menüs fertig definiert sind, kann man dieselben Befehle für sie verwenden, die wir bereits kennen. Natürlich können nicht zwei Menüs gleichzeitig dargestellt werden, es ist aber möglich, ein Menü auszuschalten und ein anderes dafür darzustellen. Dazu übergibt man dem Befehl M_Show die Identifikations-Nummer des gewünschten Menüs als zusätzlichen Paramenter.

M_Show Menu_Id
Stellt das Menü mit der Identifikations-Nummer Menu_Id dar.

Hinweis: Wenn Sie Menu_Id=0 übergeben, wird das Menü zum Omikron Basic Ausgabefenster angezeigt. Das funktioniert natürlich nur, wenn Sie auch ein Omikron Basic Ausgabefenster angelegt haben.


Um festzustellen, welches Menü gerade angezeigt wird, gibt es die Funktion:

FN M_Which
Ermittelt die Identifikationsnummer des angezeigten Menüs.

Da die Befehle für die Verwaltung von mehreren Menüs sich nur durch den zusätzlichen Parameter Menu_Id von denen für ein Menü unterscheiden, ansonsten aber genauso funktionieren, werden sie nicht nochmal extra erklärt, sondern sind nachfolgend nur tabellarisch aufgelistet.


M_Check Menu_Id,Entry
M_Uncheck Menu_Id,Entry
M_Disable Menu_Id,Entry
M_Enable Menu_Id,Entry
M_Cross Menu_Id,Entry
M_Uncross Menu_Id,Entry
M_Font Menu_Id,Entry,Font
M_Style Menu_Id,Entry,Style
M_Mark Menu_Id,Entry,Mark
M_Normal Menu_Id,Entry
M_Command Menu_Id,Entry,Cmd
M_Modifier Menu_Id,Entry,Modifier
M_Text Menu_Id,Entry,Txt$
M_Icon Menu_Id,Entry,Icon
FN M_Checked(Menu_Id,Entry)
FN M_Enabled(Menu_Id,Entry)
FN M_Crossed(Menu_Id,Entry)
FN M_Font(Menu_Id,Entry)
FN M_Style(Menu_Id,Entry)
FN M_Mark(Menu_Id,Entry)
FN M_Command(Menu_Id,Entry)
FN M_Modifier(Menu_Id,Entry)
FN M_Text$(Menu_Id,Entry)
FN M_Icon(Menu_Id,Entry)
M_Insert [Menu_Id,] Item, Txt$,R Entry
M_Delete [Menu_Id,] Item
Clear_Menu Menu_Id

Wie immer läßt sich die Verwendung dieser EasyGem Befehle am besten an einem Beispiel verdeutlichen:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init:'EasyGem initialisieren.
'Erstes Menü definieren.
Def_Menu Menu1,"Über dieses Programm",Info1
 M_Title "Planeten",Planets
  M_Entry "Merkur",Mercury
  M_Entry "Venus",Venus
  M_Entry "Erde",Earth
  M_Entry "Mars",Mars
 M_Title "Monde",Moons
  M_Entry "Erdmond",Earth_Moon
  M_Entry "Phobos",Phobos
  M_Entry "Deimos",Deimos
 M_Title "Menü 1"
  M_Entry "Zu Menü 2",To_Menu2
  M_Line_Entry 
  M_Entry "Beenden",Quit1
End_Menu

'Zweites Menü definieren.
Def_Menu Menu2,"Über dieses Programm",Info2
 M_Title "Baryonen"
  M_Entry "Proton",Proton
  M_Entry "Anti-Proton",Anti_Proton
  M_Entry "Neutron",Neutron
 M_Title "Leptonen"
  M_Entry "Elektron",Electron
  M_Entry "Positron",Positron
  M_Entry "Neutrino",Neutrino
 M_Title "Menü 2"
  M_Entry "Zu Menü 1",To_Menu1
  M_Line_Entry 
  M_Entry "Beenden",Quit2
End_Menu
'Menu 1 darstellen.
M_Show Menu1
REPEAT:'In dieser Schleife wird auf Menüaktionen gewartet.
 M_Waitmesag Entry
 IF FN M_Which=Menu1
  THEN
   IF Entry=Quit1 THEN EXIT
   IF Entry=To_Menu2 THEN M_Show Menu2
   'Hier kommen weitere Abfragen für Menu1.
  ELSE
   IF Entry=Quit2 THEN EXIT
   IF Entry=To_Menu1 THEN M_Show Menu1
   'Hier kommen weitere Abfragen für Menu2.
 ENDIF
UNTIL 0:'Endlosschleife.
Easy_Exit:'EasyGem wieder abmelden
END

Hinweis: Wenn Sie in Ihrem Programm zwar zunächst mit einem Menü auskommen, später aber für eine Erweiterung eventuell weitere Menüs benötigen, sollen Sie von vornherein die Menu_Id mit angeben. Dadurch ersparen Sie sich eine spätere Neuprogrammierung der Teile für das erste Menü. Bei sehr vielen Menüs kann es auch sinnvoll sein, die Identifikations-Nummern und auch die Referenz-Nummern für die einzelnen Einträge in Feldern zu speichern um eine klare Zuordnung der Einträge zu den Menüs zu erhalten.




2.9 Richtlinien für die Menüprogrammierung

Bitte beachten Sie, daß die vorangegangenen Beispiel mit willkürlichen Menüeinträgen aufgebaut wurden. Diese dienten nur zur Erklärung der diversen EasyGem Funktionen und sollten nicht als Grundlage für fertige Programme verwendet werden. Für den Aufbau von Menüs haben sich gewisse Regeln eingebürgert, die im Interesse einer einheitlichen Bedienbarkeit verschiedener Programme auch nach Möglichkeit eingehalten werden sollten.
Jedes Menü sollte mit den Menü-Titeln
"Datei" und "Bearbeiten" beginnen und einige grundlegende Funktionen hierfür zur Verfügung stellen. Das folgende Beispiel erzeugt ein solches Menü:


Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Neu/N",New1
  M_Entry "Öffnen ... /O",Open1
  M_Line_Entry
  M_Entry "Schließen/W",Close1
  M_Entry "Speichern/S",Save1
  M_Subtitle "Speichern als ... ",Save_As1
   M_Entry "ASCII code",Save_As_Ascii1
   M_Entry "BASIC code",Save_As_Basic1
   M_Entry "Picture",Save_As_Pict1
  M_End_Title
  M_Line_Entry
  M_Entry "Seite einrichten ... ",Page_Setup1
  M_Entry "Drucken ... /P",Print1
  M_Line_Entry
  M_Entry "Beenden/Q",Quit1
 M_Title "Bearbeiten"
  M_Entry "Undo/Z",Undo1
  M_Line_Entry
  M_Entry "Ausschneiden/X",Cut1
  M_Entry "Kopieren/C",Copy1
  M_Entry "Einsetzen/V",Paste1
  M_Entry "Löschen",Clear1
End_Menu


2.10 Popup-Menüs

Seit Version 4.0 können Sie mit EasyGem auch Popup-Menüs anlegen und verwalten. Dazu benötigen Sie nur drei zusätzliche Prozeduren, da für die Definition und die Verwaltung die gleichen Prozeduren und Funktionen benutzt werden können wie für normale Menüs:

Def_Popup R Menu_Id
Popup-Menü Definition beginnen.
End_Popup
Popup-Menü Definition abschliessen.
M_Show_Popup Menu_Id,X,Y,R Entry
Popup-Menü darstellen.
Um ein Popup-Menü benutzen zu können, muss es zunächst definiert werden. Das funktioniert genauso wie bei normalen Menüs, nur dass Sie anstelle von Def_Menu und End_Menu die Prozeduren Def_Popup und End_Popup verwenden. Dazwischen können Sie dann wie gewohnt die Menüeinträge definieren. Auch Untermenüs und Icons sind möglich.

Achtung: Aus technischen Gründen funktionieren Popup-Menüs nur, wenn auch eine Menüleiste definiert wurde. Dies bedeutet jedoch in der Praxis keine Einschränkung, da jedes Anwender-Programm über eine Menüleiste verfügen sollte.

Popup-Menüs werden normalerweise bei bestimmten Tastenkombinationen (meistens Maustaste + Ctrl-Taste) aufgerufen. Dazu dient der Befehl
M_Show_Popup. Diesem Befehl müssen Sie die Identifikationsnummer des gewünschten Popup-Menüs, die Position des Popup-Menüs (meistens die aktuelle Mausposition) und die Nummer des Default-Eintrags übergeben.
Die Prozedur stellt das Popup-Menü an der gewünschten Stelle dar und übernimmt alle Aktionen, solange die Maustaste gedrückt ist. Sobald der Anwender die Maustate loslässt, entfernt die Prozedur das Popup-Menü wieder vom Bildschirm und in
Entry erhalten Sie die Nummer des ausgewählten Eintrags zurück. Dieser kann auch 0 sein, wenn kein Eintrag ausgewählt wurde.

Die einzelnen Schritte lassen sich am besten an einem Beispiel verdeutlichen:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"
COMPILER "OPW 320*200"

Easy_Init

'Definitionsteil.
Def_Menu Menu1,"Über dieses Programm",Info
 M_Title "Datei"
  M_Entry "Beenden",Quit1
End_Menu

Def_Popup Popup1
 M_Entry "Undo/Z",Undo_Popup1
 M_Line_Entry
 M_Entry "Ausschneiden/X",Cut_Popup1
 M_Entry "Kopieren/C",Copy_Popup1
 M_Entry "Einsetzen/V",Paste_Popup1
 M_Entry "Löschen",Clear_Popup1
End_Popup
'Ende Definitionsteil.

M_Show:'Menü wird dargestellt.

REPEAT
 Easy_Mesag Entry,Buffer$,Mx,My,Mb
 If Entry
  THEN 'Normale Menüverarbeitung.
  ELSE
   IF Mb=17
    THEN 'Ctrl+Maustaste.
     Item=0:M_Show_Popup Popup1,Mx,My,Item
     SELECT Item
      CASE 0:PRINT "Es wurde nichts ausgewählt"
      CASE Undo_Popup1:PRINT "Undo"
      CASE Cut_Popup1:PRINT "Ausschneiden"
      CASE Copy_Popup1:PRINT "Kopieren"
      CASE Paste_Popup1:PRINT "Einsetzen"
      CASE Clear_Popup1:PRINT "Löschen"
     END_SELECT
   ENDIF
 ENDIF
UNTIL Entry=Quit1

Easy_Exit:'Programmende: EasyGem abmelden.
END

Wie Sie sehen, wird zunächst ein normales Menü definiert, das aber nur einen Eintrag zum Beenden des Programms enthält. Danach erfolgt die Definition des Popup-Menüs.
Das Programm verwendet eine erweiterte Version von
EasyMesag, die zusätzlich die Position der Maus (Mx,My) und den Zustand der Maustasten zurückgibt (Mb). Um die Bedeutung von Buffer$ brauchen Sie sich erstmal nicht zu kümmern. Dies wird später bei der Fensterprogrammierung besprochen.
Immer wenn der Anwender Ctrl+Maustaste drückt (
Mb=17) und sich die Maus über dem Omikron Basic Ausgabefenster befindet, wird das Popup-Menü aufgerufen. Anschliessend wird der ausgewählte Eintrag im Fenster ausgedruckt. In der Praxis würde man hier natürlich eine Routine aufrufen, die die gewünschte Funktion tatsächlich ausführt.

Hinweis: Das Beispielprogramm verwendet ein Omikron Basic Ausgabefenster, weil wir noch nicht erklärt haben, wie man mit EasyGem Fenster anlegt und verwaltet. Sobald Sie die Fensterprogrammierung mit EasyGem beherrschen, sollten Sie keine Omikron Basic Ausgabefenster mehr benutzen.


2.11 Verbindung zur Mac OS Toolbox

Obwohl Sie mit der Menu Library nahezu alles programmieren können, was man für normale Programme so braucht, kann es in Einzelfällen doch vorkommen, dass Sie direkt die Funktionen der Mac OS Toolbox auf die mit der Menu Library definierten Menüs anwenden wollen. Dies geschieht mit dem Omikron Basic Befehl
MAC_OS. Eine genaue Beschreibung dieses Befehls finden Sie im Omikron Basic Handbuch.
Damit das Mac OS weiss, auf welches Menü sich der Befehl bezieht, muss im allgemeinen ein sogenanntes Handle übergeben werden. Dafür gibt es die folgende Funktion:
FN M_Handle([Menu_Id,]Entry)
Gibt das Handle zurück, unter dem das Menü, zu dem der Eintrag mit der Nummer Entry gehört, vom Mac OS verwaltet wird.
Diese Funktion kann sowohl für normale Menüs als auch für Popup-Menüs verwendet werden.


Referenzliste Einführung -blättern- Referenzliste Menu Library

Inhalt | Start



© 1998-2000 Berkhan-Software
www.berkhan.de | Online bestellen