Ich arbeite nicht direkt mit den Xbase-Parts, sondern habe von jeder Klasse eine eigene, abgeleitete Klasse, die ich über eine #TRANSLATE Anweisung einbinde:
Code: Alles auswählen
#TRANSLATE XbpMLE() => MyXbpMLE()
Die abgeleitete Klasse sieht so aus:
Code: Alles auswählen
CLASS MyXbpMLE FROM XbpMLE
EXPORTED:
VAR DataLinkName
VAR ChainSeq
VAR PartParent
VAR ShortCutKey
VAR ShortCutKeyHandler
VAR ValidateEntry
METHOD create
METHOD handleEvent
ENDCLASS
METHOD MyXbpMLE:create(oParentExt, oOwner, aPos, aSize, aPresParam, lVisible)
Local cClassName
Local oParent
IF oParentExt == NIL
oParent := self:setParent()
ELSE
oParent := oParentExt
ENDIF
WHILE .T.
cClassName := oParent:className()
IF cClassName == "MyXbpDialog"
self:PartParent := oParent
EXIT
ENDIF
oParent := oParent:setParent()
END
IF self:ShortCutKey = NIL
self:ShortCutKey := 0
ENDIF
self:XbpMLE:create(oParentExt, oOwner, aPos, aSize, aPresParam, lVisible)
RETURN (Self)
METHOD MyXbpMLE:handleEvent(nEvent, mp1, mp2)
DO CASE
CASE nEvent = xbeP_SetInputFocus
IF self:PartParent <> NIL
self:PartParent:LastElementWithFocus := self
ENDIF
self:XbpMLE:handleEvent(nEvent, mp1, mp2)
CASE nEvent = xbeP_KillInputFocus
self:XbpMLE:handleEvent(nEvent, mp1, mp2)
OTHERWISE
self:XbpMLE:handleEvent(nEvent, mp1, mp2)
ENDCASE
RETURN (Self)
Diese Systematik funktioniert unter 1.90 355 ohne Probleme, unter der 2.0 817 bekomme ich sehr seltsame Verhaltensweisen.
Aus einem Browse rufe ich einen XbpDialog auf, auf den ich mehrere Xbase-Parts lege:
Bewege ich jetzt die Maus über die XbpMLE (bzw. MyXbpMLE), werden sie ausgegraut, d.h. Vordergrundfarbe = Hintergrundfarbe:
Dieses Verhalten betrifft NUR XbpMLE, keine XbpSLE. Steht in dem XbpMLE ein Text, ist dieser nicht sichtbar, solange Vordergrundfarbe = Hintergrundfarbe.
Ich habe also im Debugger einmal überwacht, welche Events durch die Methode handleEvent laufen. Dabei gebe ich in Klammern an, ob das XbpMLE vor bzw. nach dem Event korrekt angezeigt wird.
1. Bewegen der Maus in das XbpMLE:
xbeM_Motion (OK / OK)
xbeM_Enter (OK / OK)
xbeM_Motion (OK / falsch)
2. Klick mit der linken Maustaste in das XbpMLE:
xbeM_LbDown (falsch / OK)
xbeM_Motion (OK / OK)
xbeM_LbUp (OK / OK)
xbeM_LbClick (OK / OK)
xbeP_SetInputFocus (OK / OK)
xbeP_KillInputFocus (OK / OK)
xbeP_Paint (OK / OK)
3. Herausbewegen der Maus aus dem XbpMLE
xbeM_Motion (falsch / falsch)
xbeM_Motion (falsch / falsch)
xbeM_Leave (falsch)
xbeM_Leave (falsch)
Ich habe auch einen Versuch gemacht, mit "echten" XbpMLE zu arbeiten (indem ich die #TRANSLATE-Anweisung auf Kommentar gesetzt habe und alles noch ein compiliert habe). Es wird das gleiche Verhalten gezeigt.
Dann habe ich versucht, das Verhalten mit einem kleinen Musterprogramm nachzubilden, aber dort verhalten sich die XbpMLE korrekt. Jetzt gehen mir langsam die Ideen aus, was ich machen/versuchen kann.
Hat einer von Euch eine Idee?