seltsames Verhalten einer abgeleiteten XbpMLE Klasse
Verfasst: So, 13. Aug 2017 18:24
So, das wird jetzt etwas komplizierter ...
Ich arbeite nicht direkt mit den Xbase-Parts, sondern habe von jeder Klasse eine eigene, abgeleitete Klasse, die ich über eine #TRANSLATE Anweisung einbinde:
d.h. in meinem Code verwende ich XbpMLE(), und die eingebundene .ch-Datei sorgt dafür, dass anstelle eines XbpMLE ein MyXbpMLE verwendet wird.
Die abgeleitete Klasse sieht so aus:
Hauptgrund für die Ableitungen sind Felder, die ich in den Xbase-Parts brauche, z.B. um ein Xbase-Part einem Feld in einer Tabelle zuordnen zu können. Der andere Grund liegt darin, dass ich beim Wechsel zu einem anderen Programm bei der Rückkehr zu meinem Programm das Xbase-Part aktivieren will, das vor dem Fokus-Wechsel aktiv war.
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?
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?