Programmieren mit dBASE PLUS: Das Menü "Fenster"
Allgemein
[Bearbeiten]Um 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
[Bearbeiten]Als 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
[Bearbeiten]Der 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ü
[Bearbeiten]Die 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
[Bearbeiten]API-Funktionen
[Bearbeiten]Da 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
[Bearbeiten]Und 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
[Bearbeiten]Die 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