Das dachte ich auch, aber schau mal das Beispiel an, bei einem CLICK werden nacheinander diese Events erzeugt:
Code: Alles auswählen
13:41:09 lbDown // Maus wird über Button gedrückt
13:41:09 lbUp // Maus wird losgelassen, auch wenn sie nicht mehr über dem Button ist :!: :!: :!:
13:41:09 lbClick // dieser wird nur ausgelöst, wenn lbUp über dem Button ausgeführt wurde :!:
13:41:09 Activate *** // dieser wird ausgelöst durch den lbClick im XbpPushButton
man kann auch einen lbDblClick erzeugen, wenn man schnell ist
das sieht dann so aus:
Code: Alles auswählen
13:44:08 lbDown
13:44:08 lbUp
13:44:08 lbClick
13:44:08 Activate ***
13:44:09 lbDblClick
13:44:09 lbUp
13:44:09 lbClick
13:44:09 Activate ***
ob das jetzt intern ein Fehler ist
Ich hatte früher den Fall auf einem älteren Rechner, dass er Tastatureingaben verzögert hat und somit die Tastaturmenüauswahl nicht richtig funktioniert hat,
damals habe ich eine Art von Prellsperre eingebaut, je nach Rechner mehr oder weniger, das war eine Fummelei.
Du kannst nach einem Activate Event eines PushButtons die nächte Sekunde die Activates dieses Puttons ignorieren.
Code: Alles auswählen
///////////////////////////////////////////////////////////////////////////////
//
// Function-oriented code created by the Xbase++ FormDesigner
// Creation date: 08.12.2014 Time: 13:06:40
//
///////////////////////////////////////////////////////////////////////////////
#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#PRAGMA LIBRARY( "ascom10.lib" )
procedure AppSys
return
PROCEDURE Main
LOCAL nEvent, mp1, mp2, aSize
LOCAL oDlg, oXbp, drawingArea, aEditControls := {}
IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
aSize := {0,0}
ELSE
aSize := {154,155}
ENDIF
oDlg := XbpDialog():new( AppDesktop(), , {636,703} , aSize, , .F.)
IF aSize[1] == 0 .AND. aSize[2] == 0
oDlg:ClientSize := {300,400}
ENDIF
oDlg:taskList := .T.
oDlg:title := "New form"
oDlg:create()
drawingArea := oDlg:drawingArea
drawingArea:setFontCompoundName( "8.Arial" )
oXbp := XbpMLE():new( drawingArea, , {16,50}, {280,300}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
oXbp:tabStop := .T.
oXbp:editable := .f.
oXbp:wordWrap := .t.
oXbp:horizScroll := .f.
oXbp:create()
logger(oXbp) // Logger initialisieren
oXbp := XbpPushButton():new( drawingArea, , {16,16}, {100,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
oXbp:caption := "Pushbutton"
oXbp:tabStop := .T.
oXbp:create()
oXbp:activate := {|| logger("Activate ***") }
oXbp:lbDblClick := {|| logger("lbDblClick") }
oXbp:lbClick := {|| logger("lbClick") }
oXbp:lbDown := {|| logger("lbDown") }
oXbp:lbUp := {|| logger("lbUp") }
CenterControl(oDlg)
oDlg:show()
SetAppFocus(oDlg)
nEvent := xbe_None
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
RETURN
function logger(cTxt)
static oLog := NIL
if valtype(cTxt)="O"
oLog := cTxt
else
oLog:setData( oLog:editBuffer()+chr(13)+chr(10)+time()+chr(9)+cTxt )
endif
RETURN NIL
PS: Ich habe das auf einem i5-2500 probiert,
der ist schnell