Referenzliste Utility Library -blättern- Referenzliste Control Library

Inhalt | Start

Die Control Library

  

6. Die Control Library
6.1
6.2
6.3
6.3.1
6.3.2
6.3.3
6.3.4
6.3.5
6.3.6
6.3.7
6.3.8
6.4
6.4.1
6.4.2
6.4.3
6.5
6.5.1
6.5.2
6.6
6.6.1
6.6.2
6.6.3
6.6.4
6.6.5
6.6.6
6.6.7
6.6.8
6.7
6.8
Allgemeines
Definition von Controls
Einzelne Controls
Button-Controls
Text-Controls
Popup-Menüs
Schiebebalken und Regler
Fortschrittsanzeigen
Icons und Bilder
Uhrzeit und Datum
Sonstige Controls
Control-Gruppen
Radiogruppen und allgemeine Control-Gruppen
Plakatflächen und Fensterköpfe
Reiter
Control-Parameter abfragen und setzen
Basis-Parameter abfragen
Basis-Parameter setzen
Prozeduren und Funtionen für spezielle Controls
Bevelbuttons
Text-Controls
Fortschrittsbalken
Schiebebalken und Schieberegler
Uhren- und Datumsanzeigen
Menüs
Icons und Bilder
Inhalt bei Bevelbuttons, Imagewells und Reitergruppen
Control-Darstellung
Sonstige Control-Funktionen
Referenzliste Control Library



Unter Controls versteht man graphische Objekte, die in Dialogboxen oder Fenstern dargestellt werden und mit denen der Anwender auf einfache und intuitive Weise den Ablauf eines Programms steuern kann. Einige Controls haben Sie schon kennengelernt, obwohl Ihnen wahrscheinlich nicht bewusst war, dass es sich um Controls handelte. So zählen die Buttons, Radiobuttons, Checkboxes und Popup-Menüs, die Sie aus der Dialog Library kennen, zu den Controls. Aber auch umrahmte Felder, in die man kurze Texte eingeben kann, werden zu den Controls gerechnet. Aus der Window Library kennen Sie Fenster mit Schiebebalken. Auch diese Schiebebalken sind individuelle Controls, die von EasyGem automatisch angelegt und verwaltet werden.
Alle Controls, die Sie bisher kennen, werden von EasyGem automatisch (Schiebebalken in Fenstern) oder halbautomatisch (Buttons und Textedit-Felder in Dialogboxen) verwaltet. Dadurch haben Sie zwar wenig Arbeit bei der Programmierung aber auch wenige Einflussmöglichkeiten.

Die Control Library ermöglicht es Ihnen nun, individuelle Controls pixelgenau in beliebigen Fenstern oder Dialogboxen zu positionieren und zu verwalten. Dabei wurden fast alle neuen Controls, die mit Mac OS 8.0 eingeführt wurden, in die Control Library aufgenommen.


6.1 Allgemeines

Controls werden durch Prozeduren definiert, denen ein Satz von Parametern übergeben wird. Nach dem Aufruf der Prozedur erhalten Sie eine Nummer zurück, über die Sie das Objekt jederzeit identifizieren können. Dies funktioniert also im Prinzig genauso wie bei Menüs, Dialogboxen und Fenstern.
Im einzelnen gibt es die folgenden Parameter:
Con Control-Identifikationsnummer. In dieser Variablen erhalten Sie eine Nummer zurück, mit der Sie den Control später ansprechen können.

Achtung: Die meisten Controls stehen erst ab System 8.0 zur Verfügung. Wenn Sie Con=0 zurückerhalten, ist der Control auf diesem System nicht vorhanden.
X X-Position der linken oberen Ecke des Controls.
Y Y-Position der linken oberen Ecke des Controls.
W Breite des Controls.
H Höhe des Controls.
T$ Die meisten Controls enthalten auch einen Text, den Sie über diesen Parameter bestimmen können.
F Bei diesem Wert haben die einzelnen Bits bestimmte Bedeutungen. Wenn Bit 0 gesetzt ist, ist das Objekt sichtbar. Die Verwendung der übrigen Bits hängt vom Objekttyp ab.
V Einigen Controls kann man damit einen bestimmten Wert zuordnen (z.B. Schiebebalken). Bei bestimmten Controls hat dieser Parameter auch eine völlig andere Bedeutung.
Mi Minimal möglicher Wert, den der Control haben kann. Bei bestimmten Controls hat dieser Parameter auch eine völlig andere Bedeutung.
Ma Maximal möglicher Wert, den der Control haben kann. Bei bestimmten Controls hat dieser Parameter auch eine völlig andere Bedeutung.
T Von einigen Controls gibt es verschiedene Variations-Typen. Mit diesem Parameter wählen Sie den gewünschten Typ aus. Bei bestimmten Controls hat dieser Parameter auch eine völlig andere Bedeutung.
Act Dieser Parameter gibt Ihnen besonders viele Möglichkeiten, Ihre Controls individuell zu verwenden. In Act können Sie nämlich einen Pointer auf eine Action-Funktion übergeben, die immer dann aufgerufen wird, wenn der Anwender den Control anklickt.
Wenn Sie keine Action-Funktion definieren möchten, übergeben Sie
Act=0.
Hinweis: Für die meisten Controls benötigen Sie nur einen Teil der hier aufgeführten Parameter, da z.B. eine Checkbox nur die Werte 0 (nicht gecheckt) oder 1 (gecheckt) annehmen kann und daher für Mi bzw. Ma nicht extra Werte angegeben werden müssen.

Für viele Controls gibt es auch vereinfachte Prozeduren, bei denen EasyGem z.B. die optimale Breite oder Höhe eines Controls aus anderen Werten berechnet (z.B. dem Control-Text).



6.2 Definition von Controls

Controls gehören immer zu einem Fenster oder einer Dialogbox. Bevor man Controls definieren kann, muss man daher eine Dialogbox oder ein Fenster anlegen.
Die eigentliche Control-Definition wird dann mit
Def_Controls eingeleitet und mit End_Controls abgeschlossen.
Def_Controls Win
Control-Definition im Fenster Win beginnen.
End_Controls
Control-Definition beenden.
Damit ergibt sich die folgende Vorgehensweise:
Def_Controls Win:'Controls im Fenster oder der Dialogbox
 'mit der Nummer Win anlegen.
 'Hier stehen dann die einzelnen Control-Definitionen.
End_Controls
Hinweis: Wenn Sie bei einer Dialogbox die Definition der Controls zwischen Def_Dialog und End_Dialog vornehmen, brauchen Sie Def_Controls und End_Controls nicht extra aufzurufen, da dies bereits von Def_Dialog und End_Dialog übernommen wird. Sie können aber auch bei einer Dialogbox nachträglich noch weitere Controls definieren. Diese müssen dann aber durch Def_Controls und End_Controls geklammert werden.

Bevor wir nun unser erstes Beispiel programmieren können, müssen wir erstmal einige konkrete Controls vorstellen. Wir beginnen mit den knopfartigen Controls, da Sie viele davon ja schon aus der Dialog Library kennen.


6.3 Einzelne Controls

6.3.1 Button-Controls

Button-Controls haben immer ein Feld, das man mit der Maus anklicken kann, wodurch sich der Zustand des Buttons ändert.

Die Control Library bietet folgende Button-Typen:
Con_Button R Con,X,Y[,W,H],T$,F,Act
Normaler Pushbutton.
Con_Iconbutton R Con,X,Y[,W,H],T$,F,Ma,T,Act
Pushbutton mit Icon.
Con_Bevelbutton R Con,X,Y[,W,H],T$,F,T,Act
Con_Bevelbutton R Con,X,Y,W,H,T$,F,Mi,Ma,T,Act
Eckiger Knopf mit sehr vielen Variationsmöglichkeiten.
Con_Checkbox R Con,X,Y,T$,V
Con_Checkbox R Con,X,Y[,W,H],T$,F,V,Act
Checkbox wie aus der Dialog Library bekannt.
Con_Radiobutton R Con,X,Y,T$
Con_Radiobutton R Con,X,Y[,W,H],T$,F,V,Act
Radiobutton wie aus der Dialog Library bekannt.
Mit Con_Button wird ein normaler Knopf erzeugt, wie Sie Ihn bereits aus der Dialog Library kennen. Position und Grösse können jetzt aber mit X,Y,W,H pixelgenau bestimmt werden. Dabei werden alle Angaben immer als lokale Koordinaten des Fensters oder der Dialogbox, für die der Button definiert wird, interpretiert. Wenn W und H weggelassen werden, berechnet EasyGem die Grösse des Knopfes aus der Länge des Textes, der in T$ übergeben wird.

Die einzelnen Bits in
F haben folgende Bedeutung:

Bit 0 : Der Button ist sichtbar.

Bit 1 : Es wird ein Default-Button definiert. Diesen erkennen Sie an der breiteren Umrandung. Der Default-Button kann ausserdem auch mit [Return] ausgelöst werden.

Bit 2 : Der Button ist ein Exit-Button. Beim Anklicken eines Exit-Buttons wird eine mit
Easy_Dialog geöffnete modale Dialogbox automatisch geschlossen.

Bit 3 : Der Button verhält sich wie eine Checkbox. Das heisst, dass er nach dem Anklicken nicht wieder in seinen ursprünglichen Zustand zurückkehrt sondern selektiert bleibt und erst nach erneutem Anklicken wieder normal wird.

In
Act können Sie die Adresse einer Action-Funktion übergeben. Diese Funktion wird aufgerufen, sobald der Button angewählt wurde, sobald also die Maus über dem Button losgelassen wurde. Ihrer Action-Funktion werden zwei Parameter übergeben, wovon der erste die Control-Identifikations-Nummer und der zweite einen sogenannten Part-Code enthält. Dieser ist wichtig, wenn der Control aus meheren Teilen besteht, spielt aber bei einfachen Knöpfen keine Rolle.

DEF FN My_Action(Con,Part)

Wenn Sie keine Action-Funktion benötigen, setzen Sie einfach Act=0.
Con_Iconbutton funktioniert genauso wie Con_Butten. Die zwei zusätzlichen Parameter haben folgende Bedeutung:

In
Ma können Sie die Resource-Id eines Icons vom Typ 'cicn' übergeben. Um so ein Icon zu erzeugen, benötigen Sie einen Resource-Editor. Für einfache Zwecke können Sie "ResEdit" von Apple verwenden, das man sich von der Apple-Seite im Internet herunterladen kann. Alle Resourcen, die Sie für Ihr Progamm verwenden wollen, sollten Sie am besten immer in der Quellcode-Datei anlegen. Der Omikron Basic Compiler überträgt die Resourcen dann automatisch auf das compilierte Programm.

Mit
T können Sie festlegen, ob das Icon links (T=0) oder rechts vom Buttontext (T=1) dargestellt werden soll.

Con_Iconbutton ist ab System 8.0 verfügbar.
Die nach ihrem Aussehen benannten Bevelbuttons gibt es in ausserordentlich vielen Variationen. Sie können sich wie Pushbuttons, Checkboxes oder Radiobuttons verhalten, man kann ihnen Icons oder Bilder zuweisen, den Buttontext verschieden positionieren und es gibt alle Varianten mit 3 unterschiedlich breiten Abschrägungen (3D-Effekt).
Ungewöhnlich für eingefleischte Mac-Anwender ist ihr eckiges Aussehen, es handelt sich aber um Originalobjekte aus der Macintosh-Toolbox.

Bei den Bevelbuttons haben die Bits 4 und 10 in
F ebenfalls eine Bedeutung:

Bit 4 : Nach dem Anklicken bleibt der Button im selektierten Zustand, kann also durch nochmaliges Anklicken nicht zurückgesetzt werden. Dazu ist der Befehl
Con_Setvalue nötig, der weiter unten besprochen wird. Dieses Verhalten benötigt man, wenn man mehrere Bevelbuttons zu einer Gruppe mit Radiobutton-Verhalten zusammenfassen will (Con_Def_Radiogroup), z.B. für Werkzeug-Paletten.

Bit 10 : Der Inhalt des Buttons (Text und/oder Icon) wird beim Anklicken um ein Pixel nach rechts und nach unten verschoben. Dadurch entsteht verstärkt der visuelle Eindruck, dass man einen Knopf hereingedrückt hat.
Neben dem Text kann ein Bevelbutton noch weiteren Inhalt enthalten (ein Icon oder ein Bild). Diese zusätzlichen Inhalte müssen als Resourcen vorliegen. Da für diesen Zweck verschiedenen Resourcetypen in Frage kommen, können Sie in Mi bestimmte Werte übergeben, mit denen festgelegt wird, nach welchem Resourcetyp gesucht werden soll.

Mi = 0 : Nur Text spezifiziert durch T$.
Mi = 1 : Icon-Suite-Resource (z.B 'ICN#', 'ic14', 'ic18').
Mi = 2 : Einzel-Icon-Resource vom Typ 'cicn'.
Mi = 3 : Picture-Resource vom Typ 'PICT'. Dieser Typ hat gegenüber den Icon-Varianten den Vorteil, dass Pictures nicht auf feste Grössen beschränkt sind.

Wie bei
Con_Iconbutton übergeben Sie in Ma die Resource-Id des gewünschten Objektes (Icon-Suite, Einzel-Icon oder Picture).

Mit
T können Sie unter 3 verschieden starken Abschrägungen (3D-Effekt) der Knöpfe wählen.

T = 0 : geringe Abschrägung
T = 1 : mittlere Abschrägung
T = 2 : grosse Abschrägung

Con_Bevelbutton ist ab System 8.0 verfügbar.
Checkboxes und Radiobuttons kennen Sie ja bereits aus der Dialog Library, so dass wir hier nicht viel dazu zu sagen brauchen. Die Control Library ermöglicht Ihnen allerdings eine wesentlich flexiblere Handhabung dieser Objekte.

Der Parameter V bestimmt bei diesen Typen, ob das Objekt von Anfang an bereits selektiert ist (V=1) oder nicht (V=0).

Wie man Radiobuttons zu Gruppen zusammenfasst wird weiter unten beschrieben.
Nach soviel Theorie wollen wir jetzt erstmal ein praktisches Beispiel angeben. Knöpfe mit Icons oder Bildern werden dabei nicht berücksichtigt, weil man diese Objekte nicht durch Programmtexte definieren kann. Hier müssen wir auf die Beispielprogramme im DEMO-Ordner verweisen.

Das folgende Programm stellt eine einfache modale Dialogbox mit verschiedenen Knöpfen dar:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Act=&FN My_Action(,)
Def_Dialog Dialog1,"Bevel Buttons",1
 Con_Bevelbutton Bevel1,20,20,"Push Button",%1,0,Act
 Con_Bevelbutton Bevel2,20,50,"Toggle Button",%1001,1,Act
 Con_Bevelbutton Bevel3,20,80,"Sticky Button",%10001,1,Act
 Con_Bevelbutton Bevel4,20,110,"Offset Button",$401,2,Act
 Con_Button Exit_Button,80,160,"Beenden",%111,Act
End_Dialog

Twin_Open Win1,20,41,-640,-400,80,24,"Protokoll","",G_All:'Textfenster öffnen.
Easy_Dialog Dialog1
Easy_Exit
END

DEF FN My_Action(Con,Part)
 SELECT Con
  CASE Bevel1
   Twin_Print Win1,"Knopf mit kleiner Schräge und Push-Verhalten."
  CASE Bevel2
   Twin_Print Win1,"Knopf mit normaler Schräge und Toggle-Verhalten."
  CASE Bevel3
   Twin_Print Win1,"Knopf mit normaler Schräge und Sticky-Verhalten."
  CASE Bevel4
   Twin_Print Win1,"Knopf mit grosser Schräge und Offset-Verhalten."
  CASE Exit_Button
   Twin_Print Win1,"Ausgangsknopf."
 END_SELECT
END_FN
Es wird eine modale Dialogbox mit vier unterschiedlichen Bevelbuttons und einem Default-Exit-Pushbutton erzeugt. Dabei wurden die vereinfachten Prozeduren verwendet. Dadurch sind die einzelnen Knöpfe unterschiedlich breit, was nicht besonders schön aussieht. Versuchen Sie doch mal selbst, das Programm so abzuändern, dass alle Knöpfe gleich breit sind, indem Sie die erweiterten Prozeduren für die Definition der Knöpfe verwenden.

Für alle Buttons haben wir die gleiche Action-Funktion benutzt, da man ja über den Parameter
Con in My_Action erfährt, welcher Knopf angeklickt wurde. Natürlich können Sie auch für jeden Button eine separate Action-Funktion definieren oder 0 übergeben, wenn Sie keine Action-Funktion benötigen, weil Sie z.B. den Zustand der einzelnen Objekte erst nach Verlassen der Dialogbox ermitteln wollen. Wie das geht erfahren Sie weiter unten.



6.3.2 Text-Controls

Bei der Programmierung von Benutzerschnittstellen müssen häufig kurze Texte ausgegeben werden oder man braucht kleine umrahmte Felder, in die der Anwender etwas eintippen kann.

Dafür gibt es in der Control Library die folgenden Prozeduren:
Con_Static R Con,X,Y,T$
Con_Static R Con,X,Y,W,H,T$[,F]
Statischer Text (vom Anwender nicht editierbar).
Con_Edit R Con,X,Y,W,H,T$[,F]
Editierbarer Text (kann vom Anwender verändert werden).
Con_Editpassword R Con,X,Y,W,H[,F]
Editierbarer Text, bei dem die eingetippten Buchstaben aber nur als Punkte dargestellt werden. Dieser Befehl eignet sich daher besonders zum Erstellen von Passwortabfragen.
Mit Con_Static erzeugen Sie einen statischen Text, dieser Text kann also vom Anwender nicht verändert werden. Sie kennen solche Texte ja schon aus der Dialog Library (D_Text, D_Output). Statische Texte benutzt man, um etwas zu erklären oder den Anwender auf etwas hinzuweisen.
Wenn Sie keine Breite und Höhe angeben, berechnet EasyGem diese Werte so, dass der Text in eine Zeile passt. Durch geeignete Wahl von
W und H können Sie aber auch erreichen, dass der Text auf mehrere Zeilen verteilt wird.

Con_Edit ergibt ein umrandetes Feld, in das der in T$ übergebene Text eingetragen wird. Der Anwender kann diesen Text dann auch verändern. T$ kann natürlich auch leer sein. Passt der Text nicht in eine Zeile, wird er auf mehrere Zeilen verteilt.Wenn der Anwender mehr Text eingibt als in das Feld passt, wird automatisch gescrollt.
Wenn System 8.0 oder höher installiert ist, wird um das jeweils aktive Feld ein Fokusring gezeichnet, ansonsten erkennt man das aktive Feld auch an dem blinkenden Cursor.

Con_Editpassword funktioniert genauso wie Con_Edit, es kann jedoch kein Text übergeben werden. Die eingetippten Buchstaben werden auch nicht angezeigt, sondern durch dicke Punkte symbolisiert. Wie der Name schon vermuten lässt, wird diese Prozedur zur Definition von Feldern für die Passwortabfrage benutzt.

Con_Editpassword ist auch erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Dialog Dialog1,"Text Controls",1
 Con_Static Static1,20,20,"Dies ist ein statischer Text ohne Umbruch."
 Con_Static Static2,20,40,100,60,"Dies ist ein statischer Text mit Umbruch."
 Con_Edit Edit1,20,120,200,60,"Dieser Text kann editiert werden."
 Con_Static Static3,20,200,"Passwort eingeben"
 Con_Editpassword Edit2,160,200,100,20
 Con_Button Exit_Button,200,250,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END


6.3.3 Popup-Menüs

Häufig kommt es vor, dass man dem Anwender die Möglichkeit geben möchte, unter mehreren Optionen eine auszuwählen. Das kann man zwar auch mit Radiobuttons realisieren, bei einer grösseren Anzahl von Optionen benötigen diese aber viel Platz. Günstiger ist da schon die Verwendung eines Buttons mit Popup-Menü.

Die Control Library ermöglicht es, sowohl klassische Pushbuttons als auch Bevelbuttons mit Popup-Menüs auszustatten:
Con_Popup R Con,X,Y[,W,H],T$,Mi
Con_Popup R Con,X,Y,W,H,T$,F,Mi,Ma,Act
Button mit Popup-Menü.
Con_Bevelpopup R Con,X,Y[,W,H],T$,F,V,T
Con_Bevelpopup R Con,X,Y,W,H,T$,F,V,Mi,Ma,T,Act
Bevelbutton mit Popup-Menü.
Bevor Sie einen Button mit Popup-Menü anlegen können, müssen Sie erstmal mit den Funktionen der Menu Library ein Popup-Menü definieren.

Wenn Sie
Con_Popup verwenden möchten, übergeben Sie die Menü-Identifikationsnummer dann im Parameter Mi. Mit Ma können Sie gegebenenfalls noch festlegen, wieviel Platz von der Gesamtbreite für den Popup-Titel verwendet werden soll. Für den eigentlichen Button bleiben dann nur noch W-Ma Pixel. Der Titel steht jeweils links vom Popup-Button, während der gerade ausgewählte Eintrag in den Button geschrieben wird.

Con_Bevelpopup bietet gegenüber Con_Popup noch weitere Einstellmöglichkeiten. Die Menü-Identifikationsnummer müssen Sie bei diesem Befehl in V übergeben.

Bei
Con_Bevelpopup haben die Bits 5,8 und 9 in F ebenfalls eine Bedeutung:

Bit 5 : Wenn dieses Bit gesetzt ist, wird der Popup-Pfeil vertikal zentriert an der rechten Seite des Buttons dargestellt, sonst in der rechten unteren Ecke.

Bit 8 : Beim Anklicken eines Eintrags wird dieser nicht durch einen Haken markiert. Es wird also nicht zwischen verschiedenen Möglichkeiten ausgewählt (z.B. Schriftgrössen), sondern ein Befehl ausgeführt. Die Befehlsausführung muss Ihr Programm dann natürlich selbst vornehmen. Das Popup-Menü symbolisiert dieses Verhalten nur dadurch, dass der ausgewählte Eintrag nicht durch einen Haken markiert wird. Die Command-Betriebsart ist darum eigentlich nur sinnvoll, wenn Sie auch die Adresse einer Action-Funktion übergeben, damit Ihr Programm entsprechend reagieren kann. Dieses Bit wird erst ab System 8.1 ausgewertet.

Bit 9 : Es können mehrere Einträge parallel ausgewählt werden (mehrere Haken). Normalerweise verhalten sich Popup-Menüs ja wie Radiobuttons, d.h. es ist immer nur ein Eintrag markiert.

Mi und Ma und T wurden bereits bei Con_Bevelbutton erläutert.

Im Unterschied zu
Con_Popup wird bei Con_Bevelpopup der in T$ übergebene Text immer in den Button geschrieben und nicht davor. Das gleiche gilt für Icons oder Pictures, die Sie ja ebenfalls dem Bevelbutton zuordnen können.

Con_Bevelpopup ist ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
'Menüleiste definieren, damit Popup-Menüs funktionieren.
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
 M_Entry "Beenden/Q",Quit_Program
End_Menu
Def_Popup Currency
 M_Entry "Dollar",Dollar
 M_Entry "Euro",Euro
 M_Entry "Pound",Pound
End_Popup

Def_Dialog Dialog1,"Popup Buttons",1
 'Pushbutton mit Popup-Menü.
 Con_Popup Popup1,20,20,"Währung",Currency
 'Bevelbutton mit Popup-Menü.
 Con_Bevelpopup Popup2,20,50,"Währung",1,Currency,1
 'Bevelbutton mit Popup-Menü und Multivalue-Verhalten.
 'Popup-Pfeil zentriert.
 Con_Bevelpopup Popup3,20,80,"Währung",%1000100001,Currency,1
 Con_Button Exit_Button,100,130,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END


6.3.4 Schiebebalken und Regler

Schiebebalken kennen Sie ja bereits von den Fenstern aus der Window Library. EasyGem Fenster können ja bei Bedarf mit einem horizontalen und einem vertikalen Schiebebalken ausgerüstet werden. Dabei handelt es sich ebenfalls um Controls, die nur automatisch von EasyGem angelegt und verwaltet werden. Mit der Control Library haben Sie nun die Möglichkeit, eigene Schiebebalken an beliebigen Positionen in Fenstern und Dialogboxen zu definieren.

Für Schiebebalken und die in ihrem Verhalten sehr ähnlichen Regler gibt des die folgenden Prozeduren:
Con_Scrollbar R Con,X,Y,W,H,V,Mi,Ma
Con_Scrollbar R Con,X,Y,W,H,F,V,Mi,Ma,Act
Schiebebalken definieren.
Con_Slider R Con,X,Y,W,H,V,Mi,Ma
Con_Slider R Con,X,Y,W,H,F,V,Mi,Ma,T,Act
Regler definieren.
Con_Littlearrows R Con,X,Y,V,Mi,Ma
Con_Littlearrows R Con,X,Y,F,V,Mi,Ma,Act
Kleine Pfeile definieren.
Im Unterschied zu den bisher besprochenen Controls müssen Sie bei den ersten beiden Control-Typen die Breite und Höhe des Controls immer angeben. Daraus wird nämlich abgeleitet, ob der Schiebebalken/Regler horizontal (W>H) oder vertikal (W<H) gezeichnet werden soll.

Einen Text können Sie bei allen drei Controls nicht übergeben.

Die Parameter
V,Mi und Ma haben hier ihre ursprüngliche Bedeutung. Je nach Stellung des Schiebers haben diese Controls nämlich einen bestimmten Wert. Den Anfangswert können Sie mit V eistellen, während Mi/Ma den minimal/maximal möglichen Wert festlegen. Alle Werte müssen aus dem Intervall [-32768,32767] sein. Ab System 8.5 wurde der Wertebereich auf [-2147483648,2147483647] erweitert.

Con_Littelarrows erzeugt einen Schiebebalken ohne Schieber. Dieser besteht also nur aus den beiden kleinen Pfeilen für Auf- und Abbewegung. Die Pfeile sind immer übereinander angeordnet und können in Ihrer Grösse nicht verändert werden. Darum brauchen Sie auch keine Breite und Höhe anzugeben.

Ab System 8.0 gibt es bei Schiebebalken und Reglern auch die Möglichkeit des sogenannten Live-Feedbacks. Wenn der Anwender den Regler bewegt, wird automatisch Ihre Action-Funktion aufgerufen, so dass Ihr Programm sofort auf die Bewegung reagieren kann. Das Live-Feedback ist nur aktiv, wenn Bit 1 von
F gesetzt ist. Ansonsten wir nur eine Aussenlinie bewegt (Geisterrahmen).
Bei Con_Slider sind zusätzlich die Bits 2 - 4 in F wie folgt belegt:

Bit 2 : Der Regler hat sogenannte Tickmarks. Das sind kleine Striche, die sich an der Seite neben dem Schieberegler befinden (unten bzw. rechts).

Bit 3 : Tickmarks an der gegenüberliegenden Seite anbringen (oben bzw. links).

Bit 4 : Der Reglerknopf hat die Form eines Rechtecks (ohne Spitze, die auf die Tickmarks zeigt). Wenn dieses Bit gesetzt ist, sind Bit 2 und 3 unwirksam, der Schieberegler wird also immer ohne Tickmarks angezeigt.

T gibt die Anzahl der Tickmarks an. Damit überhaupt Tickmarks angezeigt werden, müssen Sie das Control-Rechteck (X,Y,W,H) gross genug wählen, so dass die Tickmarks mit hineinpassen und ausserdem Bit 2 bei F setzen.

Achtung: Wenn die Controls senkrecht stehen, steigt bei Schiebebalken der Wert des Controls um so weiter, je weiter unten sich der Schieber befindet, während es bei Reglern genau umgekehrt ist.

Con_Scrollbar funktioniert auch bei älteren Mac OS Versionen, allerdings ohne Live-Feedback, während Con_Slider und Con_Littelarrows erst ab System 8.0 verfügbar sind.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

Def_Dialog Dialog1,"Scrollbars und Sliders",1
 'Horizontaler Schiebebalken.
 Con_Scrollbar Scroll1,20,20,160,16,0,-256,256
 'Vertikaler Schiebebalken.
 Con_Scrollbar Scroll2,200,20,16,160,0,-256,256
 'Horizontaler Schieberegler.
 Con_Slider Slider1,20,50,160,16,0,0,512
 'Horizontaler Schieberegler mit Tickmarks unten.
 Con_Slider Slider2,20,80,160,32,%101,0,0,9,10,0
 'Horizontaler Schieberegler mit Tickmarks oben.
 Con_Slider Slider3,20,110,160,32,%1101,5,-10,10,21,0
 'Vertikaler Schieberegler mit rechteckigem Knopf ohne Tickmarks.
 Con_Slider Slider4,230,20,16,160,%10001,3,0,10,0,0
 'Kleine Pfeile.
 Con_Littlearrows Arrow1,30,150,0,0,10
 Con_Button Exit_Button,160,200,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Wenn Sie das Beispielprogramm starten, öffnet sich eine Dialogbox mit verschiedenen Schiebebalken und Reglern, die in der üblichen Weise bedient werden können. Dies hat natürlich keine weiteren Auswirkungen, da noch keine Action-Funktionen definiert wurden. Wie man sinnvoll auf die Aktionen des Anwenders reagiert zeigen wir weiter unten.


6.3.5 Fortschrittsanzeigen

Hierbei handelt es sich um Elemente, die dazu dienen, den Fortschritt bei einer länger dauernden Operation anzuzeigen. Bei den Fortschrittsanzeigen unterscheidet man zwischen unbestimmten Anzeigen, die dem Anwender nur mitteilen, dass eine etwas länger dauernde Operation ausgeführt wird und den bestimmten Anzeigen, die den Anwender zu jedem Zeitpunkt erkennen lassen, wieviel der Arbeit schon erledigt ist.

Mit der Control Library können Sie halbautomatisch verwaltete Fortschrittsanzeigen definieren, die Ihren eigenen Programmieraufwand gering halten:
Con_Progressbar R Con,X,Y,W[,F,V,Mi,Ma]
Fortschrittsbalken definieren.
Con_Chasingarrows R Con,X,Y[,F]
Control mit rotierenden Pfeilen definieren.
Fortschrittsbalken haben eine fest definierte Höhe und können nur horizontal angelegt werden. Darum gibt es bei Con_Progressbar keinen Parameter für die Höhe. Lässt man die letzten vier Parameter weg, wird ein undeterminierter Fortschrittsbalken angelegt. Dieser sieht aus wie eine rotierende Welle und sollte immer dann verwendet werden, wenn die Dauer einer Operation unbekannt ist.
Wie wir weiter unten noch zeigen werden, kann man mit einer speziellen Prozedur auch einen determinierten Fortschrittsbalken in einen undeterminierten umwandeln und umgekehrt. Bei einem undeterminierten Fortschrittsbalken werden die letzten vier Parameter auf
F=1, V=-32768, Mi=-32768, Ma=32767 gesetzt.

Bei den Chasingarrows ist auch die Breite fest vorgegeben, so dass Sie nur noch die Position und gegebenenfalls das Sichtbarkeitsflag angeben müssen.

Beide Objekte haben keine Action-Funktion, da Sie ja nicht angeklickt werden können und sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

Def_Dialog Dialog1,"Fortschrittsanzeigen",1
 'Undeterminierter Fortschrittsbalken.
 Con_Progressbar Progress1,20,20,160
 'Determinierter Fortschrittsbalken.
 Con_Progressbar Progress2,20,50,160,1,100,0,1000
 'Rotierende Pfeile.
 Con_Chasingarrows Chasing1,20,80
 Con_Button Exit_Button,100,120,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Der Fortschrittsbalken steht bei diesem Beispiel fest auf 10%. Ein determinierter Fortschrittsbalken macht natürlich nur dann Sinn, wenn man die Länge des Balkens variieren kann, um den Fortschritt anzuzeigen. Wie das geht wird weiter unten erklärt.

6.3.6 Icons und Bilder

Mit Icons und Bildern können Sie das Layout Ihrer Dialogboxen und Fenster verbessern, so dass eine für den Anwender leichter zu bedienende und übersichtlichere Benutzerschnittstelle entsteht.

Um Icons und Bilder in Dialogboxen und Fenstern darzustellen, gibt es die folgenden Prozeduren:
Con_Icon R Con,X,Y,W,H,Mi,Ma
Con_Icon R Con,X,Y,W,H,F,Mi,Ma,Act
Icon definieren. Quelle kann auch eine 'PICT' Resource sein.
Con_Imagewell R Con,X,Y,W,H,Mi,Ma
Con_Imagewell R Con,X,Y,W,H,F,Mi,Ma,Act
Imagewell mit Bild oder Icon definieren.
Bei allen Prozeduren müssen Sie neben der Position auch immer die gewünschte Breite und Höhe angeben. Das Bild bzw. Icon wird dann dem durch W und H vorgegebenen Format angepasst. Bei Imagewells werden Icons selbst nicht vergrössert, sondern zentriert in dem durch W und H bestimmten Rahmen dargestellt.

Wenn ein Icon oder Imagewell angeklickt wird, ruft EasyGem normalerweise sofort Ihre Action-Funktion auf und zwar schon beim Drücken der Maustaste, nicht erst beim Loslassen über dem Objekt. Wenn Bit 1 bei
F gesetzt ist, wird dadurch das sogenannte Autotracking aktiviert. Das bedeuted, dass im Falle von Con_Icon das Objekt als highlited dargestellt wird und ausserdem bei beiden Objekttypen Ihre Action-Funktion erst aufgerufen wird, wenn der Anwender die Maus über dem Objekt loslässt.

Mit
Mi können Sie bestimmen, welcher Resource-Typ verwendet werden soll:

Mi = 1
: Icon-Suite-Resource (z.B 'ICN#', 'ic14', 'ic18').
Mi = 2 : Einzel-Icon-Resource vom Typ 'cicn'.
Mi = 3 : Picture-Resource vom Typ 'PICT'. Dieser Typ hat gegenüber den Icon-Varianten den Vorteil, dass Pictures nicht auf feste Grössen beschränkt sind.

In
Ma übergeben Sie die Resource-Id des gewünschten Objektes (Icon-Suite, Einzel-Icon oder Picture).

Beide Objekte sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

Def_Dialog Dialog1,"Icons und Bilder",1
 'Stop-Icon ohne Autotrack.
 Con_Icon Icon1,26,20,32,32,2,0
 'Note-Icon ohne Autotrack.
 Con_Icon Icon2,76,20,32,32,2,1
 'Caution-Icon mit Autotrack.
 Con_Icon Icon3,126,20,32,32,%11,2,2,0
 'Imagewell mit Folder-Icon ohne Autotrack.
 Con_Imagewell Image1,20,70,44,44,1,-3999
 'Imagewell mit Disk-Icon ohne Autotrack.
 Con_Imagewell Image2,70,70,44,44,1,-3998
 'Imagewell mit Mülltonnen-Icon und Autotrack.
 Con_Imagewell Image3,120,70,44,44,%11,1,-3993,0
 'Mac OS Bild ohne Autotrack.
 Con_Icon Pict1,180,20,100,100,3,-16506
 Con_Button Exit_Button,80,140,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Hinweis: In dem Beispielprogramm werden Nummern von Resourcen benutzt, die zu Icons und Bilder von Typ 'PICT' gehören, welche sich in der System-Datei befinden. Die System-Datei hat den Namen "System", befindet sich im System-Ordner und enthält das Betriebssystem. Alle Resourcen in der System-Datei sind auch für andere Programme zugänglich. Sie brauchen nur die entsprechende Nummer anzugeben.

Wenn Sie sich einen Überblick über die in der System-Datei vorhandenen Resourcen verschaffen möchten, machen Sie sich aus Sicherheitsgründen am besten zunächst eine Kopie von dieser Datei und öffnen die Kopie dann mit "ResEdit" oder einem anderen Resource-Editor.

6.3.7 Uhrzeit und Datum

Uhrzeit und Datumsanzeigen werden in vielen Programmen benötigt. Damit Sie als Programmierer das Rad nicht immer wieder neu erfinden müssen, haben wir in die Control Library einfach zu benutzende Befehle eingebaut, um Uhrzeit und Datum anzuzeigen oder zu editieren.

Die Prozeduren dafür sind:
Con_Clock R Con,X,Y,F,T
Con_Clock R Con,X,Y,W,H,F,T,Act
Control mit Uhr oder Datum definieren.
Diese Prozeduren stellen eine Uhr bzw. das Datum in digitaler Form dar. Über die Bits 1 und 2 in F und vier verschiedenen Varianten (0<=T<=3) können Sie Anzeigen mit verschiedenen Eigenschaften generieren:

Beginnen wir mit
F:

Bit 1 : Wenn dieses Bit gesetzt ist, ist die Anzeige nicht editierbar.
Bit 2 : Dieses Bit bewirkt, dass die Anzeige ständig aktualisiert wird. Die Uhr läuft also mit der Systemuhr.

Für
T können Sie die folgenden Werte angeben:

T=0 : Es wird die Uhrzeit in Stunden und Minuten angezeigt.
T=1 : Es wird die Uhrzeit in Stunden, Minuten und Sekunden angezeigt.
T=2 : Es wird das Datum in Tag,Monat und Jahr angezeigt.
T=3 : Es wird das Datum in Monat und Jahr angezeigt.

Achtung: Die Einstellungen in einer editierbaren Anzeige werden sofort auf die Systemuhr übertragen, sobald der Anwender die Anzeige verlässt.

Am besten sehen Sie sich an dem nachfolgenden Beispiel mal an, wie die einzelnen Variationen aussehen.

Die Uhr- und Datumsanzeigen sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init

Def_Dialog Dialog1,"Uhrzeit und Datum",1
 'Editierbare Uhr mit Stunden und Minuten ohne Live-Time.
 Con_Clock Clock1,20,20,1,0
 'Editierbares Datum mit Monat und Jahr ohne Live-Time.
 Con_Clock Clock2,140,20,1,3
 'Editierbare Uhr mit Stunden, Minuten, Sekunden und Live-Time.
 Con_Clock Clock3,20,60,%101,1
 'Editierbares Datum mit Tag, Monat und Jahr und Live-Time.
 Con_Clock Clock4,140,60,%101,2
 'Nicht editierbare Uhr mit Stunden, Minuten, Sekunden und Live-Time.
 Con_Clock Clock5,20,100,%111,1
 'Nicht editierbares Datum mit Tag, Monat, Jahr und Live-Time.
 Con_Clock Clock6,140,100,%111,2
 Con_Button Exit_Button,160,140,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END


6.3.8 Sonstige Controls

In diesem Kapitel stellen wir drei weitere Controls vor, die auch erst Mac OS 8.0 verfügbar sind:
Con_Separator R Con,X,Y,W,H[,F]
Trennlinie definieren.
Con_Popuparrow R Con,X,Y[,F],T,Act
Popup-Pfeil definieren.
Con_Triangle R Con,X,Y[,F],V,T,Act
Aufschluss-Dreieck definieren (kleines Dreieck, das sich beim Anklicken um 90 Grad dreht).
Mit Con_Separator können Sie eine Trennlinie definieren, um das Layout in Ihren Dialogboxen und Fenstern zu optimieren. Wenn W>H ist, erhalten Sie eine horizontale Trennlinie, sonst eine vertikale Linie. Die Breite der Linie ist dabei fest vorgegeben, während die Länge mit W bzw. H bestimmt wird.

Con_Popuparrow erzeugt einen einzelnen Popup-Pfeil. Diesen können Sie benutzen, um andere Controls mit einem Popup-Menüs auszustatten. Das Popup-Menü müssen Sie natürlich vorher selbst definieren und in Ihrer Action-Funktion dann mit dem Befehl M_Show_Popup aus der Menü Library aufrufen. Dieser Control-Typ ist darum auch nur dann sinnvoll, wenn Sie tatsächlich eine Action-Funktion definiert haben, denn sonst passiert ja nichts, wenn der Anwender den Popup-Pfeil anklickt.

Mit
T wählen Sie unter acht verschiedenen Pfeilformen:

T=0 : Grosser Pfeil, der nach rechts zeigt.
T=1 : Grosser Pfeil, der nach links zeigt.
T=2 : Grosser Pfeil, der nach oben zeigt.
T=3 : Grosser Pfeil, der nach unten zeigt.
T=4 : Kleiner Pfeil, der nach rechts zeigt.
T=5 : Kleiner Pfeil, der nach links zeigt.
T=6 : Kleiner Pfeil, der nach oben zeigt.
T=7 : Kleiner Pfeil, der nach unten zeigt.
Mit Con_Triangle definieren Sie kleine Dreiecke, die zwei Zustände (V=0 bzw. V=1) haben. Sie kennen diese Aufschluss-Dreiecke sicherlich schon vom Finder. Wenn Sie dort für die Dateianzeige die Listendarstellung wählen, befindet sich vor den Ordnern immer ein kleines Dreieck. Wenn Sie dieses Dreieck anklicken, wird der Ordner aufgeschlossen und die darin enthaltenen Dateien und Unterordner werden eingerückt im gleichen Fenster unter dem Ordnernamen dargestellt. Das Dreieck selbst wird dabei um 90 Grad gedreht.
Dieses automatische Drehen können Sie bei Ihren eigenen Dreiecken einschalten, indem Sie Bit 1 von
F setzen. Dann wird nämlich das sogenannte Autotracking aktiviert und das Dreieck beim Anklicken automatisch um 90 Grad gedreht dargestellt. Nochmaliges Anklicken dreht das Dreieck wieder zurück.

Mit
T legen Sie fest, in welche Richtung das Dreieck im Normalzustand (V=0) zeigen soll:

T=0 : Dreieck zeigt nach rechts.
T=1 : Dreieck zeigt nach links.

Auch dieses Control ist nur sinnvoll, wenn Sie eine geeignete Action-Funktion definieren, die die gewüschte Operation, also das Aufschliessen von Irgendetwas auch tatsächlich durchführt.

Alle drei Controls sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
 M_Entry "Beenden/Q",Quit_Program
End_Menu
Def_Popup Text_Size
 M_Entry "8",Points_8
 M_Entry "9",Points_9
 M_Entry "10",Points_10
 M_Entry "12",Points_12
 M_Entry "14",Points_14
End_Popup

Def_Dialog Dialog1,"Sonstige Controls",1
 'Vertikale Trennlinie.
 Con_Separator Separator1,140,10,4,80
 Con_Edit Edit1,20,20,100,60,"Dieser Text kann editiert werden."
 'Grosser, nach unten zeigender Popup-Pfeil.
 Con_Popuparrow Arrow1,90,90,3,&FN My_Popup(,)
 Con_Button Exit_Button,160,60,"Beenden",%111,0
 'Horizontale Trennlinie.
 Con_Separator Separator2,10,100,230,4
 'Aufschluss-Dreieck mit Autotracking
 'Anfangswert auf geöffnet, Typ rechts.
 Con_Triangle Triangle1,20,110,%11,1,0,&FN My_Disclosure(,)
 Con_Static Static1,40,110,"Mehr Optionen"
 Con_Checkbox Checkbox1,20,140,"Option 1",0
 Con_Checkbox Checkbox2,20,160,"Option 2",0
End_Dialog
Win_Getvirt Dialog1,0,Dialog1_W,Dialog1_H
Easy_Dialog Dialog1
Easy_Exit
END

DEF FN My_Popup(Con,Part):LOCAL Item
 SELECT Con
  CASE Arrow1:M_Show_Popup Text_Size,MOUSEX,MOUSEY,Item
 END_SELECT
END_FN
DEF FN My_Disclosure(Con,Part):LOCAL W,H
 SELECT Con
  CASE Triangle1:Win_Getwork Dialog1,0,W,H
   IF H=Dialog1_H
    THEN Win_Setwork Dialog1,0,Dialog1_W,140
    ELSE Win_Setwork Dialog1,0,Dialog1_W,Dialog1_H
   ENDIF
 END_SELECT
END_FN
Nach dem Starten des Programms öffnet sich eine Dialogbox, die mit zwei Trennlinien in drei Bereiche eingeteilt ist. Im linken, oberen Feld befindet sich ein editierbarer Textrahmen mit einem nach unten zeigenden Popup-Pfeil. Wenn Sie auf diesen Pfeil klicken, wird die Action-Funktion My_Popup aufgerufen, die dann die Darstellung des Popup-Menüs übernimmt. Das Auswählen bestimmter Textgrössen hat allerdings noch keine Auswirkungen auf den angezeigten Text, da wir dafür Prozeduren benötigen würden, die erst später besprochen werden.

Im unteren Bereich sehen Sie ein Aufschluss-Dreick im geöffneten Zustand, also nach unten zeigend. Durch Anklicken dieses Dreiecks können Sie die beideren unteren Optionen aus- bzw. einblenden.

Hinweis: Korrekterweise müsste man auch den Text hinter dem Dreieck zwischen "Mehr Optionen" und Weniger Optionen" hin- und herschalten. Darauf haben wir hier verzichtet, da die dafür benötigten Prozeduren noch nicht vorgestellt wurden.


6.4 Control-Gruppen

Ab Mac OS 8.0 ist es möglich, mehrere Controls zu einer Control-Gruppe zusammenzufassen. Einen speziellen Gruppentyp kennen Sie bereits aus der Dialog Library. Dort werden nämlich Radiobuttons, die in derselben Zeile liegen, automatisch von EasyGem zu einer Gruppe zusammengefasst. Erst dadurch wird es möglich, dass alle anderen Knöpfe herausspringen, wenn einer angeklickt wird. Die in einer Radio-Gruppe zusammengefassten Knöpfe sind also in ihrem Verhalten voneinander abhängig.
Mit Mac OS 8.0 wurden weitere Gruppentypen eingeführt, die zum einen eine übersichtlichere Gestaltung von Dialogboxen ermöglichen, zum anderen aber auch die Arbeit für den Programmierer erleichtern, da er zum Beispiel mit einem einzigen Befehl eine ganze Gruppe verschieben oder deren Sichtbarkeitsstatus verändern kann.

6.4.1 Radiogruppen und allgemeine Control-Gruppen

Wir beginnen mit folgenden Prozeduren zur Definition von Radiogruppen, sowie primären und sekundären Control-Gruppen:
Con_Def_Radiogroup R Con,X,Y,W,H[,F]
Definition einer Radio-Gruppe einleiten.
Con_Def_Primgroup R Con,X,Y,W,H,T$[,V,T]
Con_Def_Primgroup R Con,X,Y,W,H,T$,Mi,Ma,T
Con_Def_Primgroup R Con,X,Y,W,H,T$,F,V,Mi,Ma,T,Act
Definition einer primären Gruppe beginnen.
Con_Def_Secgroup R Con,X,Y,W,H,T$,T[,V,T]
Con_Def_Secgroup R Con,X,Y,W,H,T$,Mi,Ma,T
Con_Def_Secgroup R Con,X,Y,W,H,T$,F,V,Mi,Ma,T,Act
Definition einer sekundären Gruppe beginnen.
Con_End_Group
Gruppendefinition beenden.
Bei allen Gruppen-Befehlen müssen Sie das durch (X,Y,W,H) bestimmte Rechteck angeben. Dies sollte so gewählt werden, dass alle Controls, die zu der Gruppe gehören, in dieses Rechteck passen. Ausserdem sollten Sie ringsherum noch etwas Platz einkalkulieren, damit die Einzel-Controls nicht so am Rand kleben.

Mit
Con_Def_Radiogroup leiten Sie die Definition einer Radio-Gruppe ein. Alle nachfolgenden Con_Radiobutton Befehle gehören zu dieser Gruppe. Auch Bevel-Buttons können Sie dafür verwenden. Dazu müssen Sie bei der Definition der Bevelbuttons Bit 4 von F setzen. Die einzelnen Knöpfe können beliebig angeordnet werden. Die Definition wird mit Con_End_Group abgeschlossen.

Im Unterschied zu der Radio-Gruppen sind die primären und sekundären Gruppen auch optisch begrenzt. Das Verhalten beider Gruppen ist identisch, Sie sollten aber immer erst eine primäre Gruppe verwenden und nur dann, wenn Sie innerhalb der primären Gruppe weitere Untergruppen benötigen, auf sekundäre Gruppen zurückgreifen.

Mit
T können Sie unter drei Varianten dieser Gruppen wählen:

T=0 : Es wird nur der in T$ übergebene Text angezeigt.
T=1 : Die Gruppe hat zusätzlich eine Checkbox in der Titelzeile. Mit V bestimmen Sie, ob die Box gechecked ist (0<=V<=1).
T=2 : Die Gruppe hat zusätzlich ein Popup-Menü in der Titelzeile. In Mi müssen Sie dabei die Identifikationsnummer eines Popup-Menüs übergeben, während Ma die Breite des Popup-Titels festlegt.

Eine Gruppen-Definition muss immer mit
Con_End_Group abgeschlossen werden. Die einzelnen Gruppen können auch ineinander geschachtelt werden.

Gruppen-Controls sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
  M_Entry "Beenden/Q",Quit_Program
End_Menu
Def_Popup Currency
 M_Entry "Dollar",Dollar
 M_Entry "Euro",Euro
 M_Entry "Yen",Yen
 M_Entry "Pfund",Pound
End_Popup

Def_Dialog Dialog1,"Gruppen-Controls",1
 'Primäre Gruppe mit Titel.
 Con_Def_Primgroup Prime1,20,20,100,90,"Farbe"
  'Radio-Gruppe eingebettet in eine primäre Gruppe.
  Con_Def_Radiogroup Radio1,30,40,100,60
   Con_Radiobutton Red,30,40,"Rot"
   Con_Radiobutton Green,30,60,"Grün"
   Con_Radiobutton Blue,30,80,"Blau"
  Con_End_Group
 Con_End_Group
 'Primäre Gruppe mit Checkbox.
 Con_Def_Primgroup Options,20,130,140,70,"Such-Optionen",1,1
  Con_Checkbox Case_Sens,30,150,"Gross/klein",0
  Con_Checkbox Wrap_Around,30,170,"Im Kreis",1
 Con_End_Group
 Con_Def_Primgroup Prime2,180,20,240,150,"Ausgabe"
  Con_Checkbox Vat,190,40,"Umsatzsteuer",1
  'Sekundäre Gruppe mit Pupup-Menü.
  Con_Def_Secgroup Sec1,200,70,200,80,"Währung",Currency,70,2
   Con_Checkbox Roundings,210,100,"Ergebnis runden",1
   Con_Checkbox Separators,210,120,"Tausender-Separatoren",0
  Con_End_Group
 Con_End_Group
 Con_Button Exit_Button,280,190,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Das Beispiel zeigt vier Control-Gruppen, wobei eine sekundäre Gruppe in einer primären enthalten ist. An diesem Beispiel können Sie sehr schön die verschiedenen Varianten (mit Text, Checkbox, Popup-Menü) und den optischen Unterschied zwischen primären und sekundären Gruppen erkennen.


6.4.2 Plakatflächen und Fensterköpfe

Aus der Window Library kennen Sie ja bereits die Info-Zeile, in der Sie einen Text anzeigen können, der vom eigentlichen Fensterinhalt unberührt bleibt (z.B. die aktuellen Maus-Koordinaten). Die Control Library bietet nun spezielle Controls, die nur dazu dienen, für andere Objekte einen Hintergrund zu bilden. Im Prinzip handelt es sich dabei auch um Gruppen-Controls, da Sie mit einem Definitionsbefehl beginnen und mit
Con_End_Group abgeschlossen werden müssen.

Die Prozeduren dafür lauten:
Con_Def_Placard R Con,X,Y,W,H[,F]
Definition einer Plakatfläche einleiten.
Con_Def_Header R Con,X,Y,W,H[,F],T
Definition eines Fensterkopfes beginnen.
In beiden Fällen haben die Controls selbst keine Funktionalität. Es wird einfach nur eine umrandete Fläche gezeichnet. Diese müssen Sie dann mit weiteren Controls füllen. Achten Sie dabei darauf, dass diese Controls innerhalb des vorgegebenen Rechtecks liegen.

Bei
Con_Def_Header können Sie über T noch zwischen zwei Varianten wählen:

T=0 : Der Fensterkopf hat eine dicke untere Begrenzungslinie.
T=1 : Der Fensterkopf hat eine dünne untere Begrenzungslinie. Diese Variante sollte man benutzen, wenn man mehrere Fensterköpfe untereinander anordnen möchte. Dann sind diese nur durch eine dünne Linie getrennt, während der Letzte durch eine dicke Linie (T=0) vom Rest des Fensters abgetrennt ist.

Beide Controls sind erst ab System 8.0 verfügbar.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
  M_Entry "Beenden/Q",Quit_Program
End_Menu
N$="Plakatflächen und Fensterköpfe"
K=%1100111111111111
Gwin_Open Win1,100,100,-320,-200,640,400,N$,"",K
Win_Infoheight Win1,40
Win_Setflags Win1,%111:'Full-Redraw einschalten, Hintergrund nicht löschen.
Draw_Pattern Win1
Def_Controls Win1
 Con_Def_Header Header1,0,0,656,20,1
  Con_Static Static1,50,2,"Zufalls-Muster"
 Con_End_Group
 Con_Def_Header Header2,0,20,100,20,0
  Con_Static Static2,20,22,"X= 0"
 Con_End_Group
 Con_Def_Header Header3,100,20,100,20,0
  Con_Static Static3,120,22,"y= 0"
 Con_End_Group
 Con_Def_Header Header4,200,20,456,20,0
 Con_End_Group
 Con_Def_Placard Placard1,20,60,130,100
  Con_Bevelbutton Bevel1,30,70,"Neues Muster",1,1,&FN My_Action(,)
  Con_Static Static4,30,100,110,50,"Plakatfläche für weitere Controls."
 Con_End_Group
End_Controls

M_Show Menu_One:'Menü darstellen.
REPEAT
 Ev_Msk=-1:Easy_Mesag Entry,Buffer$,Ev_Msk,Mx,My,Mb,Shift,Clicks,Kbrd
 IF Entry
  THEN
   SELECT Entry
    CASE Quit_Program,CVIL("quit"):Quit_Program
    CASE CVIL("oapp"):Win_Reopen Win1:'Fenster nach Programmstart öffnen.
   END_SELECT
  ELSE Win_Domessages Buffer$,&FN Close_Action()
 ENDIF
UNTIL 0

'Zufallsmuster erzeugen.
DEF PROC Draw_Pattern(Win):LOCAL X,Y,W,H
 Win_Getvirt Win,X,Y,W,H
 Gwin_Activate Win
 MODE =1:FILL STYLE =1,1
 FOR J=Y TO Y+H-20 STEP 20
  FOR I=X TO X+W-20 STEP 20
   FILL COLOR =RND(256)
   PBOX I,J,20,20
  NEXT I
 NEXT J
 Gwin_Disactivate
END_PROC
DEF FN My_Action(Con,Part)
 LOCAL Win=FN Win_Whichtop
 Draw_Pattern Win
 Win_Redraw Win
END_FN
DEF FN Close_Action(Win):LOCAL R=1
 Easy_Alert 1,"[2][Wollen Sie das Programm|wirklich beenden?][ Ja |Nein]",R
 IF R=1 THEN Quit_Program ELSE RETURN 0
END_FN
DEF PROC Quit_Program
 Easy_Exit :END
END_PROC
Das Beispiel öffnet ein Grafikfenster und erzeugt in diesem Fenster ein Zufallsmuster. Damit alle Controls des Fensterkopfes hineinpassen, wird die Infozeile auf 40 Pixel verbreitert. Die Controls des Fensterkopfes werden mit statischen Texten gefüllt. Diese könnten später zur Laufzeit des Programms modifiziert werden, um z.B. die aktuelle Position der Maus anzuzeigen. Die dafür benötigten Prozeduren werden weiter unten besprochen.

Im Fensterinnern wird eine Plakatfläche angelegt. Diese kann weitere Controls enthalten (in diesem Fall einen Bevelbutton und einen statischen Text). Bitte beachten Sie, dass Controls, die sich direkt im Fenster befinden, immer über dem eigentlichen Fensterinhalt dargestellt werden. Dadurch wird ein Teil des Fensterinhalts stets durch diese Controls verdeckt. Von Ausnahmefällen abgesehen empfiehlt es sich daher, zunächst die Infozeile ausreichend zu verbreitern und dann alle Fenster-Controls in der Infozeile zu definieren.
Wenn Sie dennoch Controls im Fensterinnern definieren wollen, müssen Sie unbedingt mit
Win_Setflags das Scroll-Verhalten modifizieren, da sonst die Controls beim Scrollen verschoben würden.


6.4.3 Reiter

Reiter sind ein beliebtes Mittel, um die Elemente einer Dialogbox in verschiedene Gruppen einzuteilen. Dabei werden die Titel aller Gruppen wie Reiter auf einer Karteikarte oberhalb der Gruppen in einer Reihe angezeigt. Von allen Gruppen ist immer nur eine aktiv und es sind auch nur die Controls dieser Reitergruppe sichtbar. Der Anwender kann durch Anklicken der Reiter zwischen den einzelnen Gruppen wechseln.
Auch Reiter sind Gruppen-Controls, die die einzelnen Kartenseiten als Untergruppen enthalten.

Für die Reiter-Definition gibt es folgende Prozeduren:
Con_Def_Tab R Con,X,Y,W,H,V,T
Con_Def_Tab R Con,X,Y,W,H,F,V,T,Act
Reiter-Definition einleiten.
Con_Def_Tabgroup R Con,T$[,Ma]
Definition einer einzelnen Reitergruppe beginnen.
Con_End_Tab
Reiter-Definition abschliessen.
Schon bei Con_Def_Tab legen Sie die Position und Grösse der Reiter einschliesslich der zugehörigen Kartenfläche mit (X,Y,W,H) fest. Die Anzahl der Reitergruppen müssen Sie in V übergeben. Mit T schliesslich können Sie zwischen zwei Varianten unterscheiden:

T=0 : Die Titel der Reitergruppen werden in normaler Grösse dargestellt.
T=1 : Die Titel der Reitergruppen werden verkleinert dargestellt.

Bei
Con_Def_Tabgroup brauchen Sie die Grösse der Reitergruppen nicht noch einmal anzugeben, da diese immer exakt so gross eingestellt werden, dass sie genau in die Kartenfläche passen. T$ enthält den Titel der Reitergruppe und in Ma können Sie optional die Resource-Id einer 'cicn' Resource übergeben. Dieses Icon wird dann vor dem Text in der Titelzeile dargestellt.
Nach dem Aufruf von
Con_Def_Tabgroup definieren Sie dann mit den zuvor besprochenen Befehlen alle Controls, die in dieser Gruppe dargestellt werden sollen. Danach müssen Sie die Reitergruppen-Definition mit Con_End_Group abschliessen.

Wenn alle Reitergruppen definiert sind, wird die ganze Reiter-Definition mit
Con_End_Tab abgeschlossen.

Reiter-Controls können erst ab System 8.1 benutzt werden.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Dialog Dialog1,-1,-1,320,290,"Tab Control",1
 Con_Def_Tab Objects,4,4,300,200,3,0:'Reiter mit 3 Reitergruppen, normale Grösse.
  Con_Def_Tabgroup Buttons,"Buttons":'Untergruppe für Buttons.
   Con_Bevelbutton Bevel1,20,40,"Small Bevel Push Button",%1,0,0
   Con_Bevelbutton Bevel2,20,70,"Normal Bevel Toggle Button",%1001,1,0
   Con_Bevelbutton Bevel3,20,100,"Normal Bevel Sticky Button",%10001,0,0
   Con_Bevelbutton Bevel4,20,130,"Large Bevel Offset Button",$401,0,0
  Con_End_Group
  Con_Def_Tabgroup Texts,"Texte":'Reitergruppe für Texte.
   Con_Static Static1,20,40,"Dies ist ein statischer Text ohne Umbruch."
   Con_Static Static2,20,60,100,60,"Dies ist ein statischer Text mit Umbruch."
   Con_Edit Edit1,20,120,270,60,"Dieser Text kann editiert werden."
   Con_Static Static3,160,60,"Passwort eingeben:"
   Con_Editpassword Edit2,160,80,130,20
  Con_End_Group
  Con_Def_Tabgroup Sliders,"Slider":'Reitergruppe für Slider.
   Con_Slider Slider1,20,50,160,16,0,0,512
   Con_Slider Slider2,20,80,160,32,%101,0,0,9,10,0
   Con_Slider Slider3,20,110,160,32,%1101,5,-10,10,21,0
   Con_Slider Slider4,230,40,16,150,%10001,3,0,10,0,0
  Con_End_Group
 Con_End_Tab
 Con_Button Exit_Button,220,225,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Das Programm erzeugt drei Reiter mit den zugehörigen Reitergruppen. In jeder Gruppe werden Controls eines bestimmten Typs dargestellt (Bevelbuttons, Texte und Sliders). Dies dient nur zu Demonstrationszwecken. In der Praxis würde man natürlich die Gruppen nicht nach Controltyp sondern nach Verwendungszweck aufteilen.

6.5 Control-Parameter abfragen und setzen

6.5.1 Basis-Parameter abfragen

Nachdem wir nun alle Controls vorgestellt haben, wollen wir jetzt erklären, wie man die zu Anfang dieses Kapitels vorgestellten Standardparameter abfragen kann. Man möchte ja z.B. nach dem Verlassen einer modalen Dialogbox wissen, welche Checkboxes, Radiobutton usw. angeklickt wurden, welche Texte der Anwender eingegeben hat, oder auf welchem Wert ein Schieberegler steht.

Dafür gibt es die folgenden Prozeduren und Funktionen:
Con_Getborder Con,R X,R Y[,R W,R H]
Con_Getborder Con,0,R W,R H
Position und/oder Grösse eines Controls abfragen.
FN Con_Gettext$(Con)
Control-Text abfragen.
FN Con_Getvalue(Con)
Control-Wert abfragen.
FN Con_Getminimum(Con)
Control-Minimum abfragen.
FN Con_Getmaximum(Con)
Control-Maximum abfragen.
Allen hier besprochenen Prozeduren müssen Sie in Con die Control-Identifikationsnummer des Controls übergeben, für das Sie die entsrechenden Parameter erfahren möchten. Zu jedem Control wird Ihnen ja bei der Definition eine Control-Identifikationsnummer von EasyGem mitgeteilt.

Con_Getborder
funktioniert genauso wie die Prozedur Win_Getborder, die Sie ja schon aus der Window Library kennen. Es werden die Aussenmasse des Controls zurückgeliefert. Die Angaben sind in lokalen Koordinaten, also relativ zur linken oberen Ecke des Fensters, für das der Control definiert wurde. Es gibt drei Varianten dieses Befehls, mit denen man entweder nur die Position, nur die Grösse oder alles zusammen abfragen kann.

Falls der Control einen Text hat, können Sie diesen mit
FN Con_Gettext$ ermitteln. Zum Beispiel bei allen Text-Controls, aber auch bei Buttons, Checkboxes, Radiobuttons oder Reitergruppen.

Den aktuellen Wert eines Controls ermitteln Sie mit
FN Con_Getvalue. Bei Buttons, Checkboxes und Radiobutton kann dieser Wert nur 0 (nicht selektiert) oder 1 (selektiert) betragen. Schieberegler, Scrollbalken und Fortschrittsbalken dagegen können maximal Werte zwischen -32768 und 32767 annehmen, während bei den meisten anderen Controls der Wert immer 0 ist (z.B. rotierende Pfeile, Fensterköpfe und Plakatflächen).
Bei Popup-Menüs können Sie mit
FN Con_Getvalue ermitteln, welchen Menüeintrag der Anwender ausgewählt hat. Dabei wird die Positionsnummer (beginnend mit 1) innerhalb des Popup-Menüs zurückgeliefert.

FN Con_Getminimum und FN Con_Getmaximum können nur bei Schiebereglern, Scrollbalken und Fortschrittsbalken sinnvoll verwendet werden. Mit diesen Funktionen können Sie ermitteln, zwischen welchen Grenzen der Anwender den Control einstellen kann.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
  M_Entry "Modale Dialogbox",Modal_Dialog
  M_Line_Entry
  M_Entry "Beenden/Q",Quit_Program
End_Menu
Def_Popup Currency
 M_Entry "Dollar",Dollar
 M_Entry "Euro",Euro
 M_Entry "Yen",Yen
 M_Entry "Pfund",Pound
End_Popup
Def_Dialog Dialog1,"Controls abfragen",1
 Con_Checkbox Checkbox1,20,20,"Checkbox 1",1
 Con_Checkbox Checkbox2,20,40,"Checkbox 2",0
 Con_Static Static1,140,20,"Passwort:"
 Con_Editpassword Edit1,140,40,80,20
 Con_Popup Popup1,20,70,"Währung:",Currency
 Con_Scrollbar Scroll1,20,110,160,16,0,-256,256
 Con_Slider Slider1,20,140,160,32,%101,3,0,9,10,0
 Con_Button Cancel_Button,20,190,"Abbruch",%101,0
 Con_Button Ok_Button,160,190," OK ",%111,&FN My_Action(,)
End_Dialog
'Textfenster für Protokollzwecke öffnen.
Twin_Open Win1,20,41,-640,-400,80,100,"Protokoll","",G_All

M_Show Menu_One:'Menü darstellen.
REPEAT
 Ev_Msk=-1:Easy_Mesag Entry,Buffer$,Ev_Msk,Mx,My,Mb,Shift,Clicks,Kbrd
 IF Entry
  THEN
   SELECT Entry
    CASE Quit_Program,CVIL("quit"):Quit_Program
    CASE Modal_Dialog,CVIL("oapp"):Easy_Dialog Dialog1
   END_SELECT
  ELSE Win_Domessages Buffer$
 ENDIF
UNTIL 0

'Diese Funktion wird aufgerufen, wenn der Anwender [ OK ] anklickt.
DEF FN My_Action(Con,Part)
 Twin_Print Win1,"Checkbox 1 ="+STR$(FN Con_Getvalue(Checkbox1))
 Twin_Print Win1,"Checkbox 2 ="+STR$(FN Con_Getvalue(Checkbox2))
 Twin_Print Win1,"Passwort = "+FN Con_Gettext$(Edit1)
 Twin_Print Win1,"Währung ="+STR$(FN Con_Getvalue(Popup1))
 Twin_Print Win1,"Schiebebalken ="+STR$(FN Con_Getvalue(Scroll1))
 Twin_Print Win1,"Schieberegler ="+STR$(FN Con_Getvalue(Slider1))
 Twin_Print Win1
END_PROC

DEF PROC Quit_Program
 Easy_Exit :END
END_PROC
Das Programm erzeugt eine modale Dialogbox mit verschiedenen Controls. Wenn Sie die Box durch Anklicken des [OK] Buttons verlassen, wird die Funktion My_Action aufgerufen, in der die Werte bzw. Texte der einzelnen Controls in das am Programmanfang geöffnete Textfenster ausgegeben werden.
Über das Menü können Sie die Dialogbox erneut öffnen und die Einstellungen verändern.


6.5.2 Basis-Parameter setzen

Natürlich reicht es nicht, die Werte eines Controls nur abfragen zu können, man muss sie auch zur Laufzeit des Programms dynamisch verändern können. So kann man z.B. Buttons oder Checkboxes in Abhängigkeit von den Aktionen des Anwenders auf bestimmte Werte setzen (selektiert oder nicht selektiert) oder einen Fortschrittsbalken entsprechend dem Voranschreiten einer Operation ständig aktualisieren.

Zum Setzen der Standard-Parameter gibt es die folgenden Prozeduren:
Con_Setborder Con,X,Y[,W,H]
Con_Setborder Con,0,W,H
Position und/oder Grösse eines Controls setzen.
Con_Settext Con,T$
Control-Text setzen.
Con_Setvalue Con,V
Control-Wert setzen.
Con_Setminimum Con,Mi
Control-Minimum setzen.
Con_Setmaximum Con,Ma
Control-Maximum setzen.
Con_Setaction Con,Act
Action-Funktion setzen.
Con_Setfontstyle Con,Fo,Si,Fa,Mo,Ju,Fc,Bc
Font-Attribute setzen.
Die ersten 5 Prozeduren funktionieren dabei genauso wie die entsprechenden Prozeduren und Funktionen zum Abfragen der Control-Parameter.

Mit
Con_Setaction können Sie nachträglich die Action-Funktion eines Controls verändern. Das dürfte allerdings nur in speziellen Fällen erforderlich sein.

Etwas genauer besprechen müssen wir
Con_Setfontstyle. Dieser Befehl wirkt auf alle Controls, die einen Text enthalten. Mit ihm ist es möglich, die Textattribute nachträglich zu verändern. Sie können das zum Beispiel verwenden, um einen statischen Text vergrössert und unterstrichen darzustellen, damit er als Überschrift wirkt. Die Texte in den Buttons sollten normalerweise nicht verändert werden, damit die Oberfläche Ihres Programms den Einstellungen des Appearance-Managers im Mac OS entspricht.

Die Parameter hinter Con_Setfontstyle haben folgende Bedeutung:

Fo : Font-Identificationsnummer (gleiche Bedeutung wie bei Set_Text_Font aus der Extension Library).
Hinweis: Wenn Sie diese Nummer nicht kennen, sondern nur den Namen eines Fonts, können Sie die Funktion FN Get_Font_Number aus der Extension Library verwenden, um die Font-Identificationsnummer zu ermitteln.
Si : Fontgrösse in Punkten (gleiche Bedeutung wie bei Set_Text_Size aus der Extension Library).
Fa : Fontstil (gleiche Bedeutung wie bei Set_Text_Face aus der Extension Library)
Mo
: Verknüpfungsmodus (gleiche Bedeutung wie bei Set_Text_Mode aus der Extension Library).
Ju : Textausrichtung. Für Ju können folgende Werte eingesetzt werden:

Ju=0 : Default-Schriftrichtung
Ju=1 : Zentriert
Ju=2 : Linksbündig
Ju=3 : Rechtsbündig

Fc : Index der Textfarbe (gleiche Bedeutung wie bei Set_Text_Fore_Color aus der Extension Library).
Bc : Index der Hintergrundfarbe (gleiche Bedeutung wie bei Set_Text_Back_Color aus der Extension Library).

Hinweis: Wenn Sie unter den 256 Farben aus der Omikron Basic Palette keine geeignete Farbe finden, können Sie jede dieser Farben mit Set_Indexed_Color aus der Extension Library auf jeden beliebigen Farbton setzen.

Wenn einzelne Werte nicht verändert werden sollen, übergeben Sie -1 als Parameter.

Achtung: Wenn Sie Attribute angeben, die vergrössernd wirken, kann es sein, dass der Text nicht mehr in das Control-Rechteck passt. In diesem Fall müssen Sie das Rechteck mit Con_Setborder vergrössern oder schon bei der Definition ein ausreichend grosses Rechteck angeben.

Con_Setfontstyle steht erst ab System 8.0 zur Verfügung, während die übrigen Prozeduren in diesem Kapitel auch bei älteren Mac OS Versionen funktionieren.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Dialog Dialog1,"Über dieses Programm",1
 Con_Static Static1,20,20,100,30,"Copyright:"
 '14 Punkte, fett, unterstrichen, blau.
 Con_Setfontstyle Static1,-1,14,5,-1,-1,4,-1
 Con_Static Static2,20,50,140,20,"Berkhan-Software"
 Con_Setfontstyle Static2,-1,-1,1,-1,-1,-1,-1:'Fett.
 Con_Static Static3,20,70,"Alt-Isehagen 19"
 Con_Static Static4,20,90,"29386 Hankensbuettel"
 Con_Static Static5,20,110,"Germany"
 Con_Button Ok_Button,150,160," OK ",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Das Programm erzeugt eine modale Dialogbox mit einer sehr einfachen Copyright-Meldung. Dabei werden für die statischen Texte verschiedene Stilattribute und Farben verwendet.


6.6 Prozeduren und Funtionen für spezielle Controls

In diesem Kapitel besprechen wir Prozeduren und Funktionen, die jeweils nur auf ganz spezielle Controls anwendbar sind. Wenn diese Prozeduren und Funktionen für Control-Typen benutzt werden, für die sie nicht geeignet sind, erhalten Sie eine Fehlermeldung.
6.6.1 Bevelbuttons

Beginnen wir mit speziellen Befehlen für Bevelbuttons. Diese können ja neben dem Text auch noch Icons enthalten. Mit den folgenden Prozeduren können Sie die Position von Text und Grafik in einem Bevelbutton beeinflussen:
Con_Settextpos Con,Ju,X
Textalignment und Textoffset setzen.
Con_Setgrafpos Con,Ju,X,Y
Grafikalignment und Grafikoffset setzen.
Con_Settextplace Con,Ju
Textposition relativ zur Grafik setzen.
Mit Con_Settextpos können Sie bestimmen, an welcher Stelle in einem Bevelbutton der zugehörige Text dargestellt wird. Dabei können Sie in Ju Werte zwischen 0 und 3 übergeben:

Ju=0 : Default-Schriftrichtung
Ju=1 : Zentriert
Ju=2 : Linksbündig
Ju=3 : Rechtsbündig

Mit
X kann zusätzlich ein horizontaler Offset angegeben werden, der immer von der Kante gerechnet wird, an die der Text anliegt. Bei zentrierter Darstellung wird der Offset ignoriert.
Con_Setgrafpos funktioniert ähnlich wie Con_Settextpos, nur dass Grafiken in Bevelbuttons zusätzlich auch vertikal positioniert werden können. Darum gibt es für Ju weitere Werte und in Y können Sie einen vertikalen Offset übergeben.

Ju=0 : Default-Systemrichtung
Ju=1 : Zentriert
Ju=2 : Links
Ju=3 : Rechts
Ju=4 : Oben
Ju=5 : Unten
Ju=6 : Oben links
Ju=7 : Unten links
Ju=8 : Oben rechts
Ju=9 : Unten rechts
Mit Con_Settextplace schliesslich können Sie die Position des Textes relativ zu einer gleichzeitig vorhandenen Grafik einstellen. Dazu übergeben Sie in Ju folgende Werte:

Ju=0 : Default-Systemposition
Ju=1 : Normale Positionierung
Ju=2 : Rechts von der Grafik
Ju=3 : Links von der Grafik
Ju=4 : Unter der Grafik
Ju=5 : Über der Grafik

Alle 3 Prozeduren sind ab System 8.0 verfügbar.

6.6.2 Text-Controls

Auch für Text-Controls gibt es spezielle Prozeduren und Funktionen, die es z.B. ermöglichen, ein Textstück als Block zu markieren oder festzustellen, in welchen Text-Control sich der Cursor gerade befindet. Einige dieser Funktionen lassen sich auch auf andere Controls anwenden, die einen editierbaren Text enthalten (z.B. Uhren-Controls).

Für Text-Controls gibt es folgende Spezial-Funtionen:
FN Con_Getkeyfocus(Win)
Feststellen, in welchen Control sich der Cursor befindet.
Con_Setkeyfocus Con
Cursor in einen bestimmten Control setzen.
Con_Clearkeyfocus Win
Cursor entfernen.
Con_Getselect Con,R S,R E
Block abfragen.
Con_Setselect Con,S,E
Block setzen.
Con_Setkeyfilter Con,Fil
Key-Filter Funktion setzen.
Zunächst wollen wir den Begriff "Key-Focus" erklären. Wenn sich in einem Fenster Controls befinden, die eine Texteingabe ermöglichen, kann einer von diesen Controls dadurch vor den anderen ausgezeichnet sein, dass sich alle Tastatureingaben auf diesen Control fokussieren. Dieser Text-Control hat dann den "Key-Focus".
Sie erkennen einen Control mit Key-Focus an dem blinkenden Cursor. Ab System 8.0 wird zusätzlich noch eine farbige Umrandung um den Control gezeichnet.

Mit
FN Con_Getkeyfocus können Sie nun feststellen, welcher Control im Fenster Win den Key-Focus hat. Die Funktion liefert eine Control-Identifikationsnummer zurück oder 0, wenn kein Control in diesem Fenster den Key-Focus hat.

Con_Setkeyfocus setzt entsprechend den Key-Focus auf einen bestimmten Control. Man kann diesen Befehl z.B. benutzen, um schon beim Öffnen einer Dialogbox ein bestimmtes Textfeld für die Eingabe vorzugeben. Der darin enthaltene Text wird dann auch gleich selektiert dargestellt.
Diese Prozedur kann bei editierbaren Text- und Uhren-Controls angewand werden.

Con_Clearkeyfocus löscht den Key-Focus in dem Fenster mit der Nummer Win. Das kann natürlich auch eine Dialogbox sein.
Bei editierbaren Textfeldern hat der Anwender die Möglichkeit, einen Block zu markieren. Damit Sie herausfinden können, welcher Teil des Textes markiert ist, gibt es die Prozedur Con_Getselect. Sie liefert in S und E den Start- bzw. Endpunkt des markierten Textes zurück. Die Zählung beginnt dabei mit 0.

Ganz analog arbeitet
Con_Setselect. Damit können Sie einen Teil des Textes als Block markieren, indem Sie in S und E den Start- bzw. Endpunkt des gewünschten Bereichs übergeben. Wenn S und E identisch sind, wird kein Block angezeigt, sondern der Cursor an diese Position gesetzt.
Häufig stellt sich das Problem, dass man bei bestimmten Eingabefeldern nicht alle Zeichen zulassen möchte. Zum Beispiel sollte der Anwender keine Buchstaben und Sonderzeichen eingeben können, wenn in einem Eingabefeld nur Zahlen sinnvoll sind.
Mit
Con_Setkeyfilter können Sie alle Eingaben selektiv kontrollieren. Dazu definieren Sie sich eine Filterfunktion und übergeben die Adresse dieser Filterfunktion in der Variablen Fil an Con_Setkeyfilter. Die Funktion muss wie folgt aufgebaut sein:

FN My_Keyfilter(Con,A,V,M)

Wenn der Anwender jetzt eine Taste drückt und für den Control, der den Key-Focus hat, eine Filterfunktion definiert wurde, wird diese Funktion aufgerufen und es werden ihr in
Con die Control-Identifikationsnummer, in A der ASCII-Code, in V der virtuelle Key-Code und in M der Zustand der Modifier-Keys übergeben. Ihre Funktion kann jetzt prüfen, ob die gedrückte Taste für diesen Control ein zulässiges Zeichen ergibt oder ob Sie das Zeichen in ein anderes konvertieren möchten (z.B. Komma in Punkt). In jedem Fall muss Ihre Funktion den ASCII-Code des gewünschten Zeichens zurückgeben oder null, wenn der Tastendruck ignoriert werden soll.

Man kann eine Filterfunktion natürlich auch noch anders verwenden, z.B. um den eingegebenen Wert zu übernehmen, wenn der Anwender [Return] drückt oder um Cursorbewegungen durchzuführen, die standardmässig nicht unterstützt werden.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Dialog Dialog1,"Editierbare Texte",1
 Con_Static Static1,20,20,"Nur ganze Zahlen"
 Con_Edit Edit1,160,20,80,20,"320"
 Con_Setkeyfilter Edit1,&FN My_Keyfilter(,,,)
 Con_Static Static2,20,50,"Gebrochene Zahlen"
 Con_Edit Edit2,160,50,80,20,"-1.234"
 Con_Setkeyfilter Edit2,&FN My_Keyfilter(,,,)
 Con_Static Static3,20,80,"Max 10 Buchstaben"
 Con_Edit Edit3,160,80,80,20,"XYZ"
 Con_Setkeyfilter Edit3%L,&FN My_Keyfilter(,,,)
 Con_Button Execute,160,120," OK ",%111,0
End_Dialog
Con_Setkeyfocus Edit1:'Key-Focus auf das erste Textfeld setzen.
Easy_Dialog Dialog1
Easy_Exit
END

DEF FN My_Keyfilter(Con,A,V,M):LOCAL R
 SELECT Con
  CASE Edit1:'Nur Zahlen durchlassen.
   IF A>=48 AND A<=57 THEN R=A ELSE R=0
  CASE Edit2
   SELECT A
    CASE 43,45,46,48 TO 57
    R=A:'Plus, Minus, Dezimalpunkt und Zahlen durchlassen.
    CASE 44:R=46:'Komma in Punkt wandeln.
    DEFAULT :R=0
   END_SELECT
  CASE Edit3
   IF LEN(FN Con_Gettext$(Edit3))<10
    THEN 'Maximal 10 Zeichen erlauben.
     SELECT A
      CASE 65 TO 90:R=A:'Grossbuchstaben durchlassen.
      CASE 97 TO 122:R=A-32:'Kleinbuchstaben in Grossbuchstaben wandeln.
      DEFAULT :R=0
     END_SELECT
    ELSE R=0
   ENDIF
 END_SELECT
RETURN R
DEF PROC Quit_Program
 Easy_Exit :END
END_PROC
Das Programm demonstriert, wie Sie mit einer Key-Filterfunktion die Eingabe in editierbaren Textfeldern ganz individuell beeinflussen können.
Ein weiteres Beispiel finden Sie in
Kapitel 3.5. Es zeigt, wie man die Standardfunktionen des Bearbeiten-Menüs mit den hier vorgestellten Funktionen und Prozeduren realisieren kann.

6.6.3 Fortschrittsbalken

In Kapitel 6.3.5 haben wir ja bereits die seit System 8.0 verfügbaren Fortschrittsbalken vorgestellt. Nun ist es in der Praxis so, dass man manchmal nicht weiss, wie lange ein Vorgang noch dauert. Das kann man am besten dadurch ausdrücken, dass man einen determinierten Fortschrittsbalken in einen undeterminierten wandelt.

Zum Wechsel zwischen beiden Zuständen dienen:
FN Con_Getprogressbar(Con)
Feststellen, ob es sich um einen determinierten oder undeterminierten Fortschrittsbalken handelt.
Con_Setprogressbar Con,M
Zwischen determiniertem und undeterminiertem Fortschrittsbalken umschalten.
FN Con_Getprogressbar gibt als Funktionswert null zurück, wenn sich der Fortschrittsbalken im determinierten Zustand befindet, sonst eins.

Entsprechend können Sie mit
Con_Setprogressbar zwischen den beiden Typen hin- und herschalten.

M=0 : determiniert
M=1 : undeterminiert

Beide Statements stehen erst ab System 8.0 zur Verfügung.

6.6.4 Schiebebalken und Schieberegler

Bei Schiebebalken und Schiebereglern hat der Anwender verschiedene Möglichkeiten, den Wert des Controls zu ändern. Zum einen kann er den Schieber mit der Maus packen und verschieben, zum anderen kann er aber auch auf die Pfeile oder auf den Bereich neben dem Schieber klicken. Dabei wird der Wert des Controls um feste Schrittweiten verändert.

Um diese Werte abzufragen bzw. einzustellen gibt es folgende Prozeduren:
Con_Getstep Con,R S1,R S2
Schrittweiten abfragen.
Con_Setstep Con,S1,S2
Schrittweiten einstellen.
FN Con_Getviewsize(Con)
Grösse des Schiebers abfragen.
Con_Setviewsize Con,S
Grösse des Schiebers einstellen.
Dabei haben S1 und S2 die folgenden Bedeutungen:

S1 : Schrittweite, die beim Anklicken der Pfeile verwendet werden soll.
S2 : Schrittweite, die verwendet werden soll, wenn der Anwender neben den Schieber klickt.

Con_Getstep und Con_Setstep können nur für Schiebebalken und Schieberegler verwendet werden, sonst erhalten Sie eine Fehlermeldung.

Ab Mac OS 8.5 gibt es proportionale Schiebebalken. Dabei ist die Grösse des Schiebers nicht mehr konstant, sondern kann entsprechend dem Verhältnis von angezeigten zu insgesamt vorhandenen Daten eingestellt werden. Sie werden dieses vielleicht schon bei den EasyGem Fenstern beobachtet haben. Hier wird nämlich die Grösse der Schieber bei den horizontalen und vertikalen Schiebebalken automatisch von EasyGem dem Verhältnis von Sichtausschnitt zu virtueller Fenstergrösse angepasst, so dass der Anwender sofort eine Vorstellung davon bekommt, wieviele Daten noch virtuell vorhanden sind.
Das Gleiche können Sie nun bei Ihren eigenen Schiebebalken mit
Con_Setviewsize machen. Wenn z.B. H_Work die auf dem Bildschirm sichtbare und H_Virt die virtuelle Höhe einer Datenmenge darstellen, müssen Sie S=H_Work(Ma-Mi)\(H_Virt-H_Work) setzen, wobei Ma der maximale und Mi der minimale Controlwert ist. Diese Formel vereinfacht sich wesentlich, wenn Sie stets Ma=H_Virt-H_Work und Mi=0 einstellen. Dann gilt nämlich auch S=H_Work.

Achtung: Wenn H_Virt=H_Work ist, darf diese Formel nicht benutzt werden (Division durch Null). Statt dessen sollten Sie mit Con_Deactivate den Schiebebalken deaktivieren.

Mit
FN Con_Getviewsize können Sie die aktuelle Einstellung abfragen.

Beide Statements funktionieren nur bei Schiebebalken und sind erst ab System 8.5 verfügbar.

6.6.5 Uhren- und Datumsanzeigen

Mit der Control Library haben Sie ja die Möglichkeit, Uhr- und Datumsanzeigen in verschiedenen Varianten zu definieren. Natürlich möchte man diese Controls dann auch auf eine bestimmte Zeit oder ein bestimmtes Datum einstellen können bzw. die aktuellen Einstellungen abfragen können.

Dafür gibt es zwei Prozeduren:
Con_Getclock Con,R H,R M,R S,R D,R Mo,R Y
Uhrzeit und Datum abfragen.
Con_Setclock Con,H,M,S,D,Mo,Y
Uhrzeit und Datum einstellen.
Die Parameter haben die folgenden Bedeutungen:

H : Stunde (0<=H<=23).
M : Minute (0<=M<=59).
S : Sekunde (0<=S<=59).
D : Tag.
Mo : Monat.
Y : Jahr (-30081<=Y<=29940).

Beide Prozeduren dürfen nur für Uhr- und Datumsanzeigen verwendet werden und sind erst ab System 8.0 verfügbar.

6.6.6 Menüs

Kommen wir jetzt zu Controls mit Popup-Menüs. Hier benötigt man eine Funktion, mit der man herausfinden kann, welcher Popup-Eintrag zuletzt angeklickt wurde. Ausserdem sollte es möglich sein, während der Laufzeit des Programms einem Control ein anderes Popup-Menü zuzuweisen.

Für beides gibt es in der Control Library geeignete Statements:
FN Con_Getmenuentry(Con)
Abfragen, welcher Menüeintrag zuletzt angeklickt wurde.
Con_Setmenu Con,Id
Popup-Menü zuordnen.
In Id übergeben Sie die Menü-Identifikationsnummer eines Popup-Menüs, das Sie natürlich vorher definiert haben müssen.

Beide Statements dürfen nur für Standard-Popupbuttons und Bevelbuttons mit Popup-Menü verwendet werden.
FN Con_Getmenuentry für Bevelbuttons steht ab System 8.0 zur Verfügung, während für Con_Setmenu System 8.1 erforderlich ist.

6.6.7 Icons und Bilder

Von der Arbeit mit dem Finder wissen Sie sicherlich, dass ein und dasselbe Icon ganz unterschiedlich dargestellt werden kann. So sieht ein geöffneter Ordner anders aus als ein geschlossener oder ein selektierter. Um dieses sogenannte Transformverhalten abzufragen bzw. einzustellen, gibt es in der Control Library die beiden Statements:
FN Con_Gettransform(Con)
Transformmodus abfragen.
Con_Settransform Con,T
Transformmodus setzen.
Für den Transformmodus sind folgende Werte möglich:

T=$1 : Nicht anwählbar.
T=$2 : Offline.
T=$3 : Geöffnet.

Wenn zu diesen drei Werten jeweils
$4000 addiert wird, ist das Objekt zusätzlich selektiert. Ausserdem kann man noch $100 bis $700 addieren. Dann wird das Objekt entsprechend der im Finder eingestellten Labelfarbe für Ordner und Dateien eingefärbt.
Zum Beispiel würde
T=$4203 bewirken, dass das Objekt als geöffnet, selektiert und in der Labelfarbe 2 dargestellt würde.

Beide Statements dürfen nur für Controls vom Typ Bevelbutton, Imagewell und Icon verwendet werden und stehen ab System 8.0 zur Verfügung.

6.6.8 Inhalt bei Bevelbuttons, Imagewells und Reitergruppen

Einige Controls können ja neben einem Text auch noch ein Icon oder ein Bild enthalten. Damit Sie zur Laufzeit Ihres Programms den Inhalt austauschen können, gibt es die Prozedur:
Con_Setcontent Con,T,Id
Control-Inhalt setzen.
Dabei bestimmt der Parameter T, in welcher Form der neue Inhalt vorliegt, während in Id die Nummer der gewünschten Resource übergeben wird:

T=1 : Id enthält die Nummer einer Icon-Suite-Resource (z.B 'ICN#', 'ic14', 'ic18').
T=2 : Id enthält die Nummer einer Einzel-Icon-Resource vom Typ 'cicn'.
T=3 : Id enthält die Nummer einer Picture-Resource vom Typ 'PICT'.

Mit dieser Prozedur können Sie den Inhalt von Bevelbuttons, Imagewells und Reitergruppen (nur das Icon in der Titelzeile) verändern. Für Bevelbuttons und Imagewells genügt System 8.0, während Sie für Reitergruppen System 8.1 benötigen.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
'Menüleiste definieren, damit Popup-Menüs funktionieren.
Def_Menu Menu_One," Copyright ",Copyright
 M_Title "Datei",File_Menu
  M_Entry "Beenden/Q",Quit_Program
End_Menu
Def_Popup Icons
 M_Entry "Mülltonne",Trash
 M_Entry "Programm",Program
 M_Entry "Diskette",Floppy_Disk
 M_Entry "Ordner",Folder
 M_Entry "Datei",File
End_Popup
Def_Popup Transfers
 M_Entry "Normal",Normal
 M_Entry "Offline",Offline
 M_Entry "Nicht anwählbar",Disabled
 M_Entry "Geöffnet",Opened
End_Popup
Def_Popup Labels
 M_Entry "Kein Etikett",No_Label
 M_Entry "Etikett 1",Label1
 M_Entry "Etikett 2",Label2
 M_Entry "Etikett 3",Label3
 M_Entry "Etikett 4",Label4
 M_Entry "Etikett 5",Label5
 M_Entry "Etikett 6",Label6
 M_Entry "Etikett 7",Label7
End_Popup


My_Action=&FN My_Action(,)
Def_Dialog Dialog1,"Icon-Transfer-Modes",1
 Con_Bevelpopup Popup1,20,20,140,20,"Icon-Suites",1,Icons,0,0,1,My_Action
 Con_Checkbox Checkbox1,20,50,140,20,"Selektiert",1,0,My_Action
 Con_Bevelpopup Popup2,20,80,140,20,"Transfer-Modes",1,Transfers,0,0,1,My_Action
 Con_Bevelpopup Popup3,20,110,140,20,"Etiketten",1,Labels,0,0,1,My_Action
 Con_Imagewell Image1,180,20,100,100,1,1,-3993,0:'Mülltonne.
 Con_Button Exit_Button,200,160,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END

'Dieses Programm verwendet eine gemeinsame Action-Funktion für
'mehrere Controls. Die Unterscheidung erfolgt über die Control-
'Identifikationsnummer in Con.
DEF FN My_Action(Con,Part):LOCAL A,B
 SELECT Con
  CASE Popup1:'Hier wird zwischen den verschiedenen Icons umgeschaltet.
   A=FN Con_Getmenuentry(Popup1)
   SELECT A
    CASE Trash:Con_Setcontent Image1,1,-3993
    CASE Program:Con_Setcontent Image1,1,-3996
    CASE Floppy_Disk:Con_Setcontent Image1,1,-3998
    CASE Folder:Con_Setcontent Image1,1,-3999
    CASE File:Con_Setcontent Image1,1,-4000
   END_SELECT
  CASE Checkbox1:'Checkbox-Zustand sofort auswerten.
   A=FN Con_Getvalue(Checkbox1):B=FN Con_Gettransform(Image1)
   IF A
    THEN Con_Settransform Image1,B OR $4000
    ELSE Con_Settransform Image1,B AND NOT $4000
   ENDIF
  CASE Popup2:'Nur den Transform-Modus ändern.
   A=FN Con_Getmenuentry(Popup2):B=FN Con_Gettransform(Image1)
   SELECT A
    CASE Normal:Con_Settransform Image1,B AND $FFF0
    CASE Offline:Con_Settransform Image1,B AND $FFF0 OR $1
    CASE Disabled:Con_Settransform Image1,B AND $FFF0 OR $2
    CASE Opened:Con_Settransform Image1,B AND $FFF0 OR $3
   END_SELECT
  CASE Popup3:'Nur das Etikett ändern.
   A=FN Con_Getmenuentry(Popup3):B=FN Con_Gettransform(Image1)
   SELECT A
    CASE No_Label:Con_Settransform Image1,B AND $F0FF
    CASE Label1:Con_Settransform Image1,B AND $F0FF OR $100
    CASE Label2:Con_Settransform Image1,B AND $F0FF OR $200
    CASE Label3:Con_Settransform Image1,B AND $F0FF OR $300
    CASE Label4:Con_Settransform Image1,B AND $F0FF OR $400
    CASE Label5:Con_Settransform Image1,B AND $F0FF OR $500
    CASE Label6:Con_Settransform Image1,B AND $F0FF OR $600
    CASE Label7:Con_Settransform Image1,B AND $F0FF OR $700
   END_SELECT
 END_SELECT
END_FN
DEF PROC Quit_Program
 Easy_Exit :END
END_PROC
Mit dem ersten Popup-Menü können Sie unter verschiedenen Icons auswählen, die dann in dem Imagewell angezeigt werden. Die Checkbox und die anderen Popup-Menüs erlauben die Einstellung verschiedener Transfer-Modes.
Über eine gemeinsame Action-Funktion werden die vom Anwender gemachten Änderungen sofort realisiert.


Hinweis:
In dem Beispielprogramm werden Nummern von Icon-Suite-Resourcen benutzt, die sich in der System-Datei befinden. Die System-Datei hat den Namen "System", befindet sich im System-Ordner und enthält das Betriebssystem. Alle Resourcen in der System-Datei sind auch für andere Programme zugänglich. Sie brauchen nur die entsprechende Nummer anzugeben.

Wenn Sie sich einen Überblick über die in der System-Datei vorhandenen Resourcen verschaffen möchten, machen Sie sich aus Sicherheitsgründen am besten zunächst eine Kopie von dieser Datei und öffnen die Kopie dann mit "ResEdit" oder einem anderen Resource-Editor.


6.7 Control-Darstellung

Aus der Menu Library kennen Sie ja bereits die Möglichkeit, dass ein Eintrag disabled, also nicht anwählbar sein kann. Die gleiche Möglichkeit haben Sie auch für Controls. Daneben gibt es für Controls noch weitere Darstellungsformen, die mit folgenden Prozeduren eingestellt werden können:
Con_Show Con
Control sichtbar machen.
Con_Hide Con
Control verstecken.
Con_Activate Con
Control anwählbar machen.
Con_Deactivate Con
Control nicht anwählbar machen.
Con_Hilite Con,Part
Control oder einen Teil davon hervorheben.
Die ersten vier Prozeduren sind im wesentlichen selbsterklärend, etwas genauer erläutern müssen wir aber der Parameter Part bei Con_Hilite. Hierin können Sie den sogenannten Part-Code übergeben, der festlegt, welcher Teil des Controls hervorgehoben bzw. welche Darstellungsform gewählt werden soll.

Folgende Werte sind für
Part möglich:

Part=0 : Kein Teil (Control wird normal dargestellt).
Part=1 : Label (Titelzeile bei Reitergruppen).
Part=2 : Menü.
Part=4 : Triangle (Aufschlussdreieck).
Part=5 : Editierbarer Text.
Part=6 : Picture.
Part=7 : Icon.
Part=8 : Uhr und Datumsanzeigen.
Part=10 : Button.
Part=11 : Checkbox.
Part=12 : Radiobutton.
Part=20 : Pfeil nach oben bzw. links (bei Schiebebalken und kleinen Pfeilen).
Part=21 : Pfeil nach unten bzw. rechts (bei Schiebebalken und kleinen Pfeilen).
Part=22 : Seite nach oben bzw. links (bei Schiebebalken und Schiebereglern).
Part=23 : Seite nach unten bzw. rechts (bei Schiebebalken und Schiebereglern).
Part=26 : Imagewell.
Part=27 : Radiogruppe.
Part=129 : Schieber (bei Schiebebalken und Schiebereglern).
Part=255 : Nicht anwählbar.

Die Part-Codes 0 und 255 bewirken das Gleiche wie
Con_Activate und Con_Deactivate. Damit können Sie bestimmte Controls in Ihrer Dialogbox nicht anwählbar machen, weil sie z.B. für die gerade verwendete Operation keine sinnvolle Bedeutung haben.

Hinweis: Der Part-Code wird auch im zweiten Parameter einer von Ihnen definierten Action-Funktion zurückgegeben. Damit können Sie z.B. feststellen, ob der Anwender bei einem Schiebebalken auf die Pfeile oder auf den Schieber geklickt hat.
Beispiel:
COMPILER "MIN_SIZE 1000000"
COMPILER "BAS_MEM 1000000"
COMPILER "Warnings off"

Easy_Init
Def_Dialog Dialog1,"Control-Darstellung",1
 Con_Def_Primgroup Prime1,20,20,200,90,"Vorhandene Funktionen"
  Con_Bevelbutton Bevel1,40,40,"Funktion 1",1,1,0
  Con_Bevelbutton Bevel2,40,70,"Funktion 2",1,1,0
 Con_End_Group
 Con_Def_Primgroup Prime2,20,130,200,90,"Geplante Funktionen"
  Con_Bevelbutton Bevel3,40,150,"Funktion 3",1,1,0
  Con_Bevelbutton Bevel4,40,180,"Funktion 4",1,1,0
 Con_End_Group
Con_Deactivate Prime2:'Zweite Gruppe samt Inhalt deaktivieren.
Con_Button Exit_Button,140,240,"Beenden",%111,0
End_Dialog
Easy_Dialog Dialog1
Easy_Exit
END
Die Dialogbox enthält zwei Gruppen mit jeweils zwei Bevelbuttons. Die beiden Buttons stehen symbolisch für Funktionen, die in der aktuellen Version noch nicht vorhanden, für eine zukünftige Version aber geplant sind. Sie sind darum nicht anwählbar. Bitte beachten Sie, dass mit dem Deaktivieren der Gruppe auch der gesamte Inhalt deaktiviert wird.


6.8 Sonstige Control-Funktionen

In diesem Kapitel stellen wir noch einige weitere Prozeduren und Funktionen vor, die vor allem für den fortgeschrittenen Anwender nützlich sein können.

Im einzelnen sind dies:
Con_Find Win,X,Y,R Con,R Part
Control-Identifikationsnummer und Part-Code ermitteln.
Con_Redraw Con
Control neu zeichnen.
Con_Dispose Con
Control löschen.
FN Con_Handle(Con)
Control-Handle ermitteln.
Beginnen wir mit Con_Find. Diese Prozedur ermöglicht es, festzustellen, ob sich im Fenster Win an der Stelle (X,Y) ein Control befindet. Wenn das der Fall ist, werden die Control-Identifikationsnummer und der Part-Code zurückgegeben, sonst sind beide Werte null. Die Position muss in lokalen Koordinaten des zu untersuchenden Fensters angegeben werden.

Mit
Con_Redraw können gezielt einen Control neu zeichnen. Das wird normalerweise automatisch von EasyGem erledigt, so dass dieser Befehl nur in Ausnahmefällen zum Einsatz kommen dürfte.

Das Gleiche gilt für
Con_Dispose. Wenn ein Fenster geschlossen wird, löscht EasyGem die dafür definierten Controls automatisch, so dass der davon belegte Speicher wieder frei wird.

Die Funktion
FN Con_Handle ist nur für Profis von Bedeutung. Sie liefert das vom Mac OS vergebene Control-Handle zurück. Damit können Sie dann auf die EasyGem Controls direkt auch die Funktionen des Mac OS anwenden. Eine detaillierte Beschreibung der Mac OS Funktionen für Controls finden Sie in "Inside Macintosh, Macintosh Toolbox Essentials" und "Inside Macintosh, Control Manager".
Bitte beachten Sie auch das Programm "StarrySky.BAS" im DEMO-Ordner. Es zeigt unter anderem, wie man zur Laufzeit des Programms Controls mit der Maus im Fenster verschieben kann.



Referenzliste Utility Library -blättern- Referenzliste Control Library

Inhalt | Start



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