Mit Hilfe von diesem Thread habe ich eine kleine Klasse gebaut, die Fensterchen und Menü erstellt:
viewtopic.php?p=344646
Die Schließfunktionalität, die sich per BindMenuEvent aus einer öffentlichen Prozedur des Moduls starten lässt, lässt sich leider nicht als Methode des Objekts einbinden. Habe ich einen Denkfehler bzw. was mache ich falsch? (siehe kommentierte Zeile am Quelltextende)
Code: Alles auswählen
declareModule window
declare new ()
declare close_ev ()
interface iWindow
queryInterface (*riid, *addr)
addRef ()
release ()
appendMenu ()
getMenu ()
close ()
endInterface
structure sWindow
*vTable
cntRef.i
objMutex.i
id.i
menu.i
endStructure
endDeclareModule
module window
procedure queryInterface (*this.sWindow, *riid, *addr)
procedureReturn $80004002
endprocedure
procedure addRef (*this.sWindow)
lockMutex (*this\objMutex)
*this\cntRef + 1
unlockMutex (*this\objMutex)
procedureReturn *this\cntRef
endprocedure
procedure release (*this.sWindow)
protected index, cnt
with *this
lockMutex (\objMutex)
if \cntRef = 0
freeMutex (\objMutex)
freeStructure (*this)
procedureReturn 0
else
\cntRef - 1
endIf
unlockMutex (\objMutex)
procedureReturn \cntRef
endWith
endprocedure
procedure new ()
protected *window.sWindow = allocateStructure (sWindow)
*window\vTable = ?virtualWindow
*window\objMutex = createMutex ()
*window\cntRef = 0
*window\id = openWindow (#pb_any,
#pb_ignore,
#pb_ignore,
640,
480,
"OOP window w/ menu",
#pb_window_systemMenu)
procedureReturn *window
endProcedure
procedure appendMenu (*this.sWindow) ; hier wird das Menü erstellt
*this\menu = createMenu (#pb_any, windowId (*this\id))
menuTitle ("&File")
menuItem (1, "Close")
endProcedure
procedure getMenu (*this.sWindow)
procedureReturn *this\menu
endProcedure
procedure close (*this.sWindow) ; eine Methode zum Selbstschließen
closeWindow (*this\id)
endProcedure
procedure close_ev () ; eine Prozedur des Moduls, die das Programm beendet
end
endProcedure
dataSection
virtualWindow:
data.i @queryInterface()
data.i @addRef()
data.i @release()
data.i @appendMenu()
data.i @getMenu()
data.i @close()
endDataSection
endModule
*window.window::iWindow = window::new ()
*window\appendMenu()
bindMenuEvent (*window\getMenu(), 1, window::@close_ev())
; bindMenuEvent (*window\getMenu(), 1, @*window\close()) ; diese Zeile will nicht !!
repeat : waitWindowEvent () : forEver
