Programmieren mit dBASE PLUS: Das Menü "Fenster"

Aus Wikibooks

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