SetAppEvent() / SLE / SetInputFocus

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

SetAppEvent() / SLE / SetInputFocus

Beitrag von AUGE_OHR »

hi,

ich versuche, im GUI mode, einem SLE per SetAppEvent() die F2 Taste
zuzuordnen und zwar dann wenn das SLE den Focus bekommt.

Code: Alles auswählen

   ::oSLE1    := XbpSLE():new( ::drawingArea, , {52,108}, {80,20}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   ::oSLE1:tabStop := .T.
   ::oSLE1:setInputfocus  := {|| SetAppEvent(xbeK_F2, { || PostAppEvent(xbeP_Activate,,,::PB1) } )  }
   ::oSLE1:KillInputfocus := {|| SetAppEvent(xbeK_F2, { || NIL } )}

   ::PB1      := XbpPushButton():new( ::drawingArea, , {144,100}, {100,32}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   ::PB1:caption := "Pushbutton"
   ::PB1:activate := {|| MSGBOX("Hello World") }

...
zum "auswerten" hab ich dann in meiner Eventloop :

Code: Alles auswählen

      nEvent := AppEvent ( @mp1, @mp2, @oXbp )
      IF (bBlock := SetAppEvent(nEvent)) <> NIL
         Eval( bBlock, mp1, mp2, oXbp )
      ENDIF
aber ich bekomme F2 nicht zum arbeiten ... :(

jemand eine Idee was verkehrt ist ?

gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Jimmy,

versuch doch Folgendes einmal:

Code: Alles auswählen

::lSLE1_Focus := .F.

::oSLE1 := XbpSLE():new( ::drawingArea, , {52,108}, {80,20}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) 
::oSLE1:tabStop := .T. 
::oSLE1:setInputfocus := { || ::lSLE1_Focus := .T. } 
::oSLE1:KillInputfocus := { || ::lSLE1_Focus := .F. } 

::PB1 := XbpPushButton():new( ::drawingArea, , {144,100}, {100,32}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } ) 
::PB1:caption := "Pushbutton" 
::PB1:activate := {|| MSGBOX("Hello World") } 

... und im EventLoop:

Code: Alles auswählen

nEvent := AppEvent ( @mp1, @mp2, @oXbp ) 

if ::lSLE1_Focus .and. nEvent == xbeP_Keyboard .and. mp1 == xbeK_F2
  Eval( ::PB1:activate )
endif
Ich habe es nicht ausprobiert, aber ich denke, es müsste funktionieren.

Tschüs,
Sören
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Sören hat geschrieben:
versuch doch Folgendes einmal:

Code: Alles auswählen

::lSLE1_Focus := .F.
::oSLE1:setInputfocus := { || ::lSLE1_Focus := .T. } 
::oSLE1:KillInputfocus := { || ::lSLE1_Focus := .F. } 
du hast ja SetAppEvent() "entfernt"
Sören hat geschrieben: ... und im EventLoop:

Code: Alles auswählen

nEvent := AppEvent ( @mp1, @mp2, @oXbp ) 

if ::lSLE1_Focus .and. nEvent == xbeP_Keyboard .and. mp1 == xbeK_F2
  Eval( ::PB1:activate )
endif
Ich habe es nicht ausprobiert, aber ich denke, es müsste funktionieren.
ja ... aber das ist nur 1 Pushbutton und auf der Maske sind "viele"...

es müsste doch auch mit SetAppEvent() gehen den zum "auswerten"
hab ich doch "IF (bBlock := SetAppEvent(nEvent)) <> NIL " in meinem
Eventloop ... oder ... ?

gruss by OHR
Jimmy

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
wie James gerade in der Newsgroup geschrieben hat, ist SetAppEvent() nicht in GUI-Anwendungen nutzbar!
Er schlägt Dir vor, den keyboard-Slot des SLEs zu nutzen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben:Hallo Jimmy,
wie James gerade in der Newsgroup geschrieben hat, ist SetAppEvent() nicht in GUI-Anwendungen nutzbar!
Er schlägt Dir vor, den keyboard-Slot des SLEs zu nutzen.

Viele Grüße,
Martin
yup, auch gerade gelesen und es ging mir ein Licht auf ...

schon ausprobiert : funktioniert (wenn man das "} )" Problem behebt.

hier nochmal der "richtige" Code

Code: Alles auswählen

oSLE1:Keyboard := {|nKey| IF(nKey =
           xbeK_F2,PostAppEvent(xbeP_Activate,,,::PB1) ,NIL  ) }
sollte man eine eigene Class von XbpSLE benutzen ( wie z.b. SLEPic)

Code: Alles auswählen

oSLE1:XbpSle:Keyboard := {|nKey| IF(nKey =
           xbeK_F2,PostAppEvent(xbeP_Activate,,,::PB1) ,NIL  ) }
weil man sonst seine :keyboard "überschreibt"

gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Jimmy,

Stimmt! Das ist die eleganteste Lösung!!!

Tschüs,
Sören
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo,

das konkrete Problem von Jimmy ist ja bereits gelöst worden, aber es wäre m. E. auch mit SetAppEvent() möglich gewesen.

Die Aussage, dass SetAppEvent() im GUI-Modus nicht funktioniert, stimmt nämlich nicht! (Das steht auch so nicht in der Doku.)

Jimmys ursprünglicher Code sah so aus:

Code: Alles auswählen

      nEvent := AppEvent ( @mp1, @mp2, @oXbp ) 
      IF (bBlock := SetAppEvent(nEvent)) <> NIL 
         Eval( bBlock, mp1, mp2, oXbp ) 
      ENDIF 
im GUI-Modus wird der Tastaturevent aber nicht in nEvent übergeben, sondern in mp1. Mit folgendem Code hätte es also geklappt:

Code: Alles auswählen

      nEvent := AppEvent ( @mp1, @mp2, @oXbp ) 
      IF (bBlock := SetAppEvent(mp1)) <> NIL 
         Eval( bBlock, mp1, mp2, oXbp ) 
      ENDIF 
Ich habe diesen konkreten Code nicht getestet, benutze aber in meiner reinen GUI-Anwendung ganz ähnliche Funktionen.

Freundliche Grüße

Hans
Antworten