hi,
warum einfach wenn man es auch kompliziert machen kann ...
also ... ein "einfaches"
SubscribeEvent() reicht nicht aus. Ich kann zwar damit "den" Event erreichen
aber es gibt ja noch "andere" ... alle activeX laufen ja auch noch durch "ihren"
COMDefaultHandler.
Der "Effekt" war unter anderem das "alles" für ihn ein
BeforeClick Event war, egal was ich "getroffen"
hatte. Ich will aber nur "
Meine PushPin" und
Waypoints haben.
Nun hab ich mir also doch einen eigenen
COMDefaultHandler eingebaut und schon kam das
nächste "Problem" ... ich brauche die "nDispID" dafür !?
hm ... was ist das nun schon wieder ... zum Glück fand ich mal was im Xbase++ Help File
:isEventPublished( <cName> ) --> nDISPID
na ... aber das hab ich doch ...
Code: Alles auswählen
cEventName := "SelectionChange"
xVar := oApp:oMap:isEventPublished(cEventName)
IF xVar <> Nil
lSuccess := oApp:oMap:SubscribeEvent(xVar,{| NewSelection, OldSelection|;
oApp:MPSelectionChange(NewSelection, OldSelection) })
MPDISPID_SelectionChange := xVar
ENDIF
MPDISPID_ ist nun wiederum ein Element aus einem Array welche ich über #xtranslate anspreche
Code: Alles auswählen
#xtranslate MPDISPID_AfterRedraw => DispID[\1]
#xtranslate MPDISPID_AfterViewChange => DispID[\2]
#xtranslate MPDISPID_BeforeClick => DispID[\3]
#xtranslate MPDISPID_BeforeClose => DispID[\4]
#xtranslate MPDISPID_BeforeDblClick => DispID[\5]
#xtranslate MPDISPID_BeforeSave => DispID[\6]
#xtranslate MPDISPID_DataMapChange => DispID[\7]
#xtranslate MPDISPID_MouseDown => DispID[\8]
#xtranslate MPDISPID_MouseMove => DispID[\9]
#xtranslate MPDISPID_MouseUp => DispID[\10]
#xtranslate MPDISPID_New => DispID[\11]
#xtranslate MPDISPID_NewDataSet => DispID[\12]
#xtranslate MPDISPID_Open => DispID[\13]
#xtranslate MPDISPID_Quit => DispID[\14]
#xtranslate MPDISPID_ReadyStateChange => DispID[\15]
#xtranslate MPDISPID_RouteAfterCalculate => DispID[\16]
#xtranslate MPDISPID_RouteAfterOptimize => DispID[\17]
#xtranslate MPDISPID_SelectionChange => DispID[\18]
STATIC DispID := {}
AADD( DispID, ARRAY( 18 ) )
MPDISPID_AfterRedraw := NIL
MPDISPID_AfterViewChange := NIL
MPDISPID_BeforeClick := NIL
MPDISPID_BeforeClose := NIL
MPDISPID_BeforeDblClick := NIL
MPDISPID_BeforeSave := NIL
MPDISPID_DataMapChange := NIL
MPDISPID_MouseDown := NIL
MPDISPID_MouseMove := NIL
MPDISPID_MouseUp := NIL
MPDISPID_New := NIL
MPDISPID_NewDataSet := NIL
MPDISPID_Open := NIL
MPDISPID_Quit := NIL
MPDISPID_ReadyStateChange := NIL
MPDISPID_RouteAfterCalculate := NIL
MPDISPID_RouteAfterOptimize := NIL
MPDISPID_SelectionChange := NIL
METHOD XbMap:COMDefaultHandler( nDISPID, mp1, mp2, mp3, mp4, mp5, ;
mp6, mp7, mp8, mp9, mp10 )
DO CASE
CASE nDISPID == MPDISPID_AfterRedraw
CASE nDISPID == MPDISPID_AfterViewChange
CASE nDISPID == MPDISPID_BeforeClick
PostAppEvent( xbeE_BeforeClick , mp1, mp2, self )
CASE nDISPID == MPDISPID_BeforeClose
CASE nDISPID == MPDISPID_BeforeDblClick
PostAppEvent( xbeE_BeforeDblClick , mp1, mp2, self )
CASE nDISPID == MPDISPID_BeforeSave
CASE nDISPID == MPDISPID_DataMapChange
CASE nDISPID == MPDISPID_MouseDown
CASE nDISPID == MPDISPID_MouseMove
CASE nDISPID == MPDISPID_MouseUp
CASE nDISPID == MPDISPID_New
CASE nDISPID == MPDISPID_NewDataSet
CASE nDISPID == MPDISPID_Open
CASE nDISPID == MPDISPID_Quit
CASE nDISPID == MPDISPID_ReadyStateChange
CASE nDISPID == MPDISPID_RouteAfterCalculate
CASE nDISPID == MPDISPID_RouteAfterOptimize
CASE nDISPID == MPDISPID_SelectionChange
PostAppEvent( xbeE_SelectionChange ,mp1, mp2, self )
OTHERWISE
xReturn := ::oMap:COMDefaultHandler( nDISPID, @mp1, @mp2,;
@mp3, @mp4, @mp5, @mp6,;
@mp7, @mp8, @mp9, @mp10 )
ENDCASE
hatte ich schon gesagt das wir noch einige USERDEF Events brauchen ... ?
der
COMDefaultHandler sollte "nur" den COM Event "handle´n", aber bloss nichts in die
(zeitkritische) Schleife schreiben, sondern ein PostAppEvent() an die Xbase++ Application
schicken !!!
Code: Alles auswählen
#define xbeE_AfterRedraw xbeP_User+11
#define xbeE_AfterViewChange xbeP_User+12
#define xbeE_BeforeClick xbeP_User+13
#define xbeE_BeforeClose xbeP_User+14
#define xbeE_BeforeDblClick xbeP_User+15
#define xbeE_BeforeSave xbeP_User+16
#define xbeE_DataMapChange xbeP_User+17
#define xbeE_MouseDown xbeP_User+18
#define xbeE_MouseMove xbeP_User+19
#define xbeE_MouseUp xbeP_User+20
#define xbeE_New xbeP_User+21
#define xbeE_NewDataSet xbeP_User+22
#define xbeE_Open xbeP_User+23
#define xbeE_Quit xbeP_User+24
#define xbeE_ReadyStateChange xbeP_User+25
#define xbeE_RouteAfterCalculate xbeP_User+26
#define xbeE_RouteAfterOptimize xbeP_User+27
#define xbeE_SelectionChange xbeP_User+28
METHOD XbMap:HandleEvent( nEvent, mp1, mp2 )
DO CASE
CASE nEvent == xbeE_AfterRedraw
CASE nEvent == xbeE_AfterViewChange
CASE nEvent == xbeE_BeforeClick
::MPBeforeClick(mp1, mp2 )
IF ValType(::MPBeforeClick) == "B"
Eval( ::MPBeforeClick, mp1, mp2, self )
ENDIF
CASE nEvent == xbeE_BeforeClose
CASE nEvent == xbeE_BeforeDblClick
CASE nEvent == xbeE_BeforeSave
CASE nEvent == xbeE_DataMapChange
CASE nEvent == xbeE_MouseDown
CASE nEvent == xbeE_MouseMove
CASE nEvent == xbeE_MouseUp
CASE nEvent == xbeE_New
CASE nEvent == xbeE_NewDataSet
CASE nEvent == xbeE_Open
CASE nEvent == xbeE_Quit
CASE nEvent == xbeE_ReadyStateChange
CASE nEvent == xbeE_RouteAfterCalculate
CASE nEvent == xbeE_RouteAfterOptimize
CASE nEvent == xbeE_SelectionChange
::MPSelectionChange(mp1, mp2 )
IF ValType(::MPSelectionChange) == "B"
Eval( ::MPSelectionChange, mp1, mp2, self )
ENDIF
OTHERWISE
RETURN ::oMap:HandleEvent( nEvent, mp1, mp2 )
ENDCASE
wir haben also den COM Event "abgefangen" und an unseren Xbase++ HandleEvent() weiter-
gereicht wo wir nun unsere Methode ausführen können.
Code: Alles auswählen
METHOD XbMap:MPBeforeClick(Button, Shift, X, Y, Cancel)
LOCAL oLoc
oLoc := ::oMap:ActiveMap:XYToLocation(X,Y)
oLoc:GoTo()
RETURN self
...
METHOD XbMap:MPSelectionChange(NewSelection, OldSelection)
LOCAL oLoc
LOCAL cName
LOCAL cSeek
IF VALTYPE(NewSelection) = "O"
// bei einem hierarchisch aufgebauten OOP System kann das Item
// von verschiedenen Interface genutzt werden.
cName := UPPER( NewSelection:interfaceName() )
// Ich brauche :
// o:PushPin:Location() oder o:Waypoint:Location()
IF cName = "PUSHPIN" .OR. cName = "WAYPOINT"
oLoc := NewSelection:Location()
oLoc:GoTo()
cSeek := oLoc:Name()
// übertrage Kunden ID ins SLE
::oDlgMap:oSeek:setdata( cSeek )
ELSE
* MSGBOX("Object ist "+cName)
ENDIF
ENDIF
RETURN self
so und nun bin ich endlich langsam da wo ich hin wollte. jetzt muss ich "nur noch" die restlichen
Events mit Code "auffüllen" um die "maximal mögliche" Kontrolle über das activeX zu bekommen.