|
|
|
|
| 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. |
|
|
|
© 1998-2000 www.berkhan.de | Online bestellen |