Programmieren mit dBASE PLUS: Das Menü "Fenster"
Allgemein
BearbeitenUm in dBase-Anwendungen ein Fenstermenü mit dem Funktionsumfang darzustellen, wie man es aus anderen Windows-Programmen gewohnt ist, ist ein wenig zusätzlicher Code erforderlich.
Vorarbeit
BearbeitenAls Vorarbeit muß man dafür sorgen, dass die Anwendung weiß, welche Form gerade aktiv ist. Dazu hängt man z. B. an _app eine benutzerdefinierte Variable, die jeweils einen Verweis auf das aktuelle Fensterobjekt enthält. Am besten setzt man die Funktionen onGotFocus bzw. onLostFocus in ein Basisformular:
function onGotFocus try _app.currentForm = this catch( Exception e ) endtry return
function onLostFocus try _app.currentForm = null catch( Exception e ) endtry return
Menübefehle
BearbeitenDer nachfolgende Code fügt die Menübefehle in das Fenstermenü ein:
this.MFENSTER = new MENU(this) with (this.MFENSTER) text = "&Fenster" endwith this.MFENSTER.MCASCADE = new MENU(this.MFENSTER) with (this.MFENSTER.MCASCADE) onClick = class::MCASCADE_ONCLICK text = "Ü&berlappend" endwith this.MFENSTER.MHORIZONTAL = new MENU(this.MFENSTER) with (this.MFENSTER.MHORIZONTAL) onClick = class::MHORIZONTAL_ONCLICK text = "&Horizontal anordnen" endwith this.MFENSTER.MVERTIKAL = new MENU(this.MFENSTER) with (this.MFENSTER.MVERTIKAL) onClick = class::MVERTIKAL_ONCLICK text = "&Vertikal anordnen" endwith this.MFENSTER.MSYMBOLE = new MENU(this.MFENSTER) with (this.MFENSTER.MSYMBOLE) onClick = class::MSYMBOLE_ONCLICK text = "&Symbole anordnen" endwith this.MFENSTER.MENUSEP = new MENU(this.MFENSTER) with (this.MFENSTER.MENUSEP) text = "" separator = true endwith this.MFENSTER.MCLOSE = new MENU(this.MFENSTER) with (this.MFENSTER.MCLOSE) onClick = class::MCLOSE_ONCLICK text = "Sch&ließen" shortCut = "Ctrl+F4" endwith this.MFENSTER.MALLESCHLIESSEN = new MENU(this.MFENSTER) with (this.MFENSTER.MALLESCHLIESSEN) onClick = {;close forms} text = "&Alle schließen" endwith
Kennzeichnung als Fenstermenü
BearbeitenDie nächste Zeile ist vor den eigentlichen Funktionsdefinitionen innerhalb der Menüklasse erforderlich. Damit wird erreicht, dass in dem Fenstermenü die jeweils geöffneten Fenster automatisch aufgeführt werden:
this.windowMenu = this.mfenster
Die Funktionsaufrufe
BearbeitenAPI-Funktionen
BearbeitenDa es in der Menüklasse kein onOpen usw. gibt, müssen wir die erforderlichen API-Aufrufe in eine kleine Funktion packen, die wir dann aufrufen, wenn sie gebraucht werden:
function init if type( "GetParent" ) # "FP" extern CHANDLE GetParent( CHANDLE ) User32 endif if type( "SendMessage" ) # "FP" extern CLONG SendMessage( CHANDLE, CINT, CWORD, CLONG ) User32 ; from "SendMessageA" endif return
Fensterbefehle
BearbeitenUnd hier die Funktionsaufrufe für die einzelnen Fensterbefehle:
function MCASCADE_onClick class::init() if type("_app.currentform") == "O" SendMessage(getParent(_app.currentform.hWnd), HToI("0227"), 0, 0) endif return function MHORIZONTAL_onClick class::init() if type("_app.currentform") == "O" SendMessage(getParent(_app.currentform.hWnd), HToI("0226"), 1, 0) endif return function MVERTIKAL_onClick class::init() if type("_app.currentform") == "O" SendMessage(getParent(_app.currentform.hWnd), HToI("0226"), 0, 0) endif return function MSYMBOLE_onClick class::init() if type("_app.currentform") == "O" SendMessage(getParent(_app.currentform.hWnd), HToI("0228"), 0, 0) endif return function MCLOSE_onClick if type('_app.currentForm') == 'O' local f f = _app.currentForm f.close() f.release() endif return
onInitMenu
BearbeitenDie Funktion onInitMenu wird automatisch immer dann aufgerufen, wenn das Menü angeklickt wird. Diese Funktion wird daher hauptsächlich dazu benutzt, die einzelnen Menübefehle aufgrund bestimmter Bedingungen aktiv oder inaktiv zu schalten:
function onInitMenu lEnabled = (type('_app.currentForm') # null) with(this.mfenster) mcascade.enabled = lEnabled mhorizontal.enabled = lEnabled mvertikal.enabled = lEnabled msymbole.enabled = lEnabled mclose.enabled = lEnabled malleschliessen.enabled = lEnabled endwith return