Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Moderator: Moderatoren
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Warum funktioniert folgende Zeile nicht:
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| tdLaunchPad('MultiLanguage', mp1,mp2,oXbp) } )
Muss da noch etwas berücksichtigt werden, muss das in jedem EventLoop extra abgefragt werden?
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| tdLaunchPad('MultiLanguage', mp1,mp2,oXbp) } )
Muss da noch etwas berücksichtigt werden, muss das in jedem EventLoop extra abgefragt werden?
Gruß
Markus
Markus
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Was erwartest du denn und was passiert wenn du was tust ?
So wie ich die Zeile verstehe, ordnest du den Codeblock der Tastatur Strg+F1 zu.
Da wird man zunächst nichts sehen. Wenn man Strg+F1 drückt, sollte deine Message aufgehen.
So wie ich die Zeile verstehe, ordnest du den Codeblock der Tastatur Strg+F1 zu.
Da wird man zunächst nichts sehen. Wenn man Strg+F1 drückt, sollte deine Message aufgehen.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9358
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Das erklärt die Doku m.E. relativ eindeutig. Es gibt einige Funktionalitäten, die das automatisch berücksichtigen, aber:
In allen anderen Fällen kann der Codeblock mit SetAppEvent() abgefragt werden und muss anschließend durch Aufruf von Eval() ausgeführt werden.
Und zwar in der Eventloop. Siehe Beispiel in der Doku.
In allen anderen Fällen kann der Codeblock mit SetAppEvent() abgefragt werden und muss anschließend durch Aufruf von Eval() ausgeführt werden.
Und zwar in der Eventloop. Siehe Beispiel in der Doku.
Herzlich,
Tom
Tom
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Ich habe zum Testen in Mainprogramm folgenden Zeilen hinzugefügt:
(Wobei ich der Meinung war, die erste Zeile sollte reichen um die Function tdLaunchPad() aufzurufen:)
(Wobei ich der Meinung war, die erste Zeile sollte reichen um die Function tdLaunchPad() aufzurufen:)
Code: Alles auswählen
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| tdLaunchPad('MultiLanguage', mp1,mp2,oXbp) } )
...
******* primary event loop
DO WHILE nEvent <> xbeP_Quit
nEvent := AppEvent(@mp1,@mp2,@oXbp)
IF (bBlock := SetAppEvent(nEvent)) <> NIL // for testing only
Eval( bBlock, mp1, mp2, oXbp )
DebugPrint("EVAL")
ENDIF // for testing only
if nEvent == (xbeP_User + 1)
DebugPrint("xbeP_User+1")
// Put the CRT and the exe in the foreground
// see the explanation below on function ReceiverWndProc()
DllExecuteCall( _tfpSetForegroundWindow_ , SetAppWindow():GetHwnd() )
else
oXbp:HandleEvent( nEvent, mp1, mp2 )
end
ENDDO
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
wenn du SetKey() verwendest geht das durch das GET System.satmax hat geschrieben:Ich habe zum Testen in Mainprogramm folgenden Zeilen hinzugefügt:
(Wobei ich der Meinung war, die erste Zeile sollte reichen um die Function tdLaunchPad() aufzurufen:)
Wenn du SetAppEvent() verwendet wird der Event in die Queue geschoben welche du mit AppEvent() wieder "ausliest"
Frage : was hast du als (xbeP_User + 1) definiert ?satmax hat geschrieben:Code: Alles auswählen
if nEvent == (xbeP_User + 1) DebugPrint("xbeP_User+1") // Put the CRT and the exe in the foreground // see the explanation below on function ReceiverWndProc() DllExecuteCall( _tfpSetForegroundWindow_ , SetAppWindow():GetHwnd() )
woher hast du "_tfpSetForegroundWindow_" ?
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Hallo Jimmy,
kommt aus Deinen Beispielen.
TestWmCopyData.zip:
An andere Stelle gibts dann ein:
kommt aus Deinen Beispielen.
TestWmCopyData.zip:
Code: Alles auswählen
_tfpSetForegroundWindow_ := DllPrepareCall(GetHUser32(),DLL_STDCALL,"SetForegroundWindow")
Code: Alles auswählen
// SetForegroundWindow() not always work from external threads of
// the destination window so we post a custom Xbase++ event and call
// SetForegroundWindow() from the CRT main loop
PostAppEvent(xbeP_User + 1 ,0,0,SetAppWindow())
Gruß
Markus
Markus
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Ich hätte erartet das beim drücken auf die Strg+F1 Taste mein Funktion aufgerufen wird, aber das ist eben nicht der Fall.brandelh hat geschrieben:Was erwartest du denn und was passiert wenn du was tust ?
So wie ich die Zeile verstehe, ordnest du den Codeblock der Tastatur Strg+F1 zu.
Da wird man zunächst nichts sehen. Wenn man Strg+F1 drückt, sollte deine Message aufgehen.
Gruß
Markus
Markus
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Ich wollte nur klarstellen, dass man genauer schreiben muss was man meint !
Und Tom hatte völlig Recht, dass im unteren Absatz der Hilfe genau erklärt ist, dass SetAppKey() und SetAppEvent() je nach Programmzustand anders reagiert.
In der Hilfe steht das mit Beispiel drinn. Ich hatte nur den ersten Absatz gelesen
So wie ich das sehe wird aus READ oder MENU etc. direkt der Codeblock ausgeführt, im anderen Fall musst du mit eval() den Codeblock selbst aufrufen.
Im Prinzip ist das ja so wie im alten clipper auch, SET KEY TO ... funktionierte auch nur in READ, Menu etc. nie in einfachen Schleifen.
Dort musste man mit INKEY das Ereignis erkennen und auslösen.
Und Tom hatte völlig Recht, dass im unteren Absatz der Hilfe genau erklärt ist, dass SetAppKey() und SetAppEvent() je nach Programmzustand anders reagiert.
In der Hilfe steht das mit Beispiel drinn. Ich hatte nur den ersten Absatz gelesen
So wie ich das sehe wird aus READ oder MENU etc. direkt der Codeblock ausgeführt, im anderen Fall musst du mit eval() den Codeblock selbst aufrufen.
Im Prinzip ist das ja so wie im alten clipper auch, SET KEY TO ... funktionierte auch nur in READ, Menu etc. nie in einfachen Schleifen.
Dort musste man mit INKEY das Ereignis erkennen und auslösen.
Gruß
Hubert
Hubert
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Ich möchte gerne eine F Taste Programmglobal einer bestimmten Funktion zuordnen.
Folgendes habe ich versucht:
Offensichtlich habe ich da einen Denkfehler, warum funktioniert hier keine der Keyboard Tasten, der Mausklick aber schon?
Folgendes habe ich versucht:
Code: Alles auswählen
// keine der folgenden 4 Zeilen bewirkt etwas:
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F1') } )
SetAppEvent( xbeK_CTRL_F2 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F2') } )
SetAppEvent( xbeK_F3 , { |mp1,mp2,oXbp| MsgBox('Test F3') } )
bBlock := SetKey( xbeK_CTRL_F2, { |mp1,mp2,oXbp| MsgBox('SetKey') } )
// diese Zeile funktioniert:
SetAppEvent( xbeM_LbClick , { |mp1,mp2,oXbp| MsgBox('Test Maus') } )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp, 0 )
IF (bBlock := SetAppEvent(nEvent)) <> NIL
Eval( bBlock, mp1, mp2, oXbp )
ELSEIF nEvent < xbeB_Event
DebugPrint( nEvent )
ELSEIF nEvent == xbeM_RbClick
QUIT
ENDIF
ENDDO
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
hi,
Ich persönlich halte nicht viel von SetAppEvent() denn es "könnte" in jeder Event-Loop reagieren.
auch ist xbeK_* nicht die Konstante für einen Event sondern der "Wert" einer Taste.der Event ist "xbeP_*" und mp1 ist der "Wert" der Taste
hm ... bei mir funktioniert dein Code ?!satmax hat geschrieben:Offensichtlich habe ich da einen Denkfehler, warum funktioniert hier keine der Keyboard Tasten, der Mausklick aber schon?
Ich persönlich halte nicht viel von SetAppEvent() denn es "könnte" in jeder Event-Loop reagieren.
auch ist xbeK_* nicht die Konstante für einen Event sondern der "Wert" einer Taste.
Code: Alles auswählen
CASE nEvent == xbeP_Keyboard .AND. mp1 = xbeK_ESC
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Wenn Du also zB. F3 drückst kommt die Meldung!?
Normal würde ich das auch so nicht verwenden. Die Idee war eher so etwas wie einen Service HOT-Key zu machen. Damit ich im Supportfall eine bestimmte Tastenkombi drücke und etwas nachsehen kann, da sollte dann jeder Event Loop reagieren.
Was ist der richtige Weg für einen Hotkey like F1?
Normal würde ich das auch so nicht verwenden. Die Idee war eher so etwas wie einen Service HOT-Key zu machen. Damit ich im Supportfall eine bestimmte Tastenkombi drücke und etwas nachsehen kann, da sollte dann jeder Event Loop reagieren.
Was ist der richtige Weg für einen Hotkey like F1?
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
JAsatmax hat geschrieben:Wenn Du also zB. F3 drückst kommt die Meldung!?
F1 ist ja ein "Sonderfall" weil da gewöhnlich die "Hilfe" dran hängt (siehe XbpHelp() und xbeP_HelpRequest Event )satmax hat geschrieben:Was ist der richtige Weg für einen Hotkey like F1?
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Wie kann das wieder sein, warum geht das bei mir nicht? Compileroption oder Xbase++ V2?
Code: Alles auswählen
[PROJECT]
COMPILE = xpp
COMPILE_FLAGS = -q -w
DEBUG = yes
GUI = yes
LINKER = alink
LINK_FLAGS =
RC_COMPILE = arc
RC_FLAGS = -v
PROJECT.XPJ
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
ich habe deinen Code so verwendetsatmax hat geschrieben:Wie kann das wieder sein, warum geht das bei mir nicht? Compileroption oder Xbase++ V2?
Code: Alles auswählen
#include "Appevent.ch"
PROCEDURE MAIN
LOCAL mp1, mp2, oXbp, nEvent
LOCAL bBlock
CLS
// use Mouse Events xbeM_*
SetMouse(.T.)
// keine der folgenden 4 Zeilen bewirkt etwas:
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F1') } )
SetAppEvent( xbeK_CTRL_F2 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F2') } )
SetAppEvent( xbeK_F3 , { |mp1,mp2,oXbp| MsgBox('Test F3') } )
// geändert auf F4 damit man einen Unterschied hat ... funktionier eh nicht "so"
bBlock := SetKey( xbeK_F4, { |mp1,mp2,oXbp| MsgBox('SetKey') } )
// diese Zeile funktioniert:
SetAppEvent( xbeM_LbClick , { |mp1,mp2,oXbp| MsgBox('Test Maus') } )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp, 0 )
IF (bBlock := SetAppEvent(nEvent)) <> NIL
Eval( bBlock, mp1, mp2, oXbp )
ELSEIF nEvent < xbeB_Event
* DebugPrint( nEvent )
? chr( nEvent )
ELSEIF nEvent == xbeM_RbClick
QUIT
ENDIF
ENDDO
RETURN
Alink Test1 /PM:PM
und das kommt dabei raus
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
OK Jimmy, mit Deinem Source geht es bei mir auch. Ab dem Zeitpunkt wo ein XpbDialog ins Spiel kommt geht es nicht mehr:
Ist das so, gibt es eventuell eine Alternative?
Code: Alles auswählen
FUNCTION Main()
LOCAL oDlg, mp1, mp2, nEvent, oXbp, bBlock
oDlg := XbpDialog():new(,,,,, .F. )
oDlg:taskList := .T.
oDlg:clientSize := { 1024, 600 }
oDlg:drawingArea:clipChildren := .T.
oDlg:title := 'Test'
oDlg:create()
oDlg:drawingArea:setFontCompoundName( '9.Arial' )
CenterControl( oDlg )
SetAppWindow( oDlg )
oDlg:show()
SetAppFocus(oDlg)
// keine der folgenden 4 Zeilen bewirkt etwas:
SetAppEvent( xbeK_CTRL_F1 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F1') } )
SetAppEvent( xbeK_CTRL_F2 , { |mp1,mp2,oXbp| MsgBox('Test Strg+F2') } )
SetAppEvent( xbeK_F3 , { |mp1,mp2,oXbp| MsgBox('Test F3') } )
bBlock := SetKey( xbeK_CTRL_F2, { |mp1,mp2,oXbp| MsgBox('SetKey') } )
SetAppEvent( xbeK_F2 , { |mp1,mp2,oXbp| MsgBox('Test F2') } )
// das funktioniert:
SetAppEvent( xbeM_LbClick , { |mp1,mp2,oXbp| MsgBox('Test Maus') } )
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp, 0 )
IF (bBlock := SetAppEvent(nEvent)) <> NIL
Eval( bBlock, mp1, mp2, oXbp )
ELSEIF nEvent < xbeB_Event
DebugPrint( nEvent )
ELSEIF nEvent == xbeM_RbClick
QUIT
ENDIF
ENDDO
QUIT
RETURN NIL
Gruß
Markus
Markus
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2934
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Ohne jetzt weg. Zeitmangels den ganzen Beitrag gelesen zu haben, aber sollte der Event für SetAppEvent nicht nur xbeP_Keyboard sein und an diesen Codeblock werden dann die Parameter mp1 und mp2 übergeben ?
Viele Grüße
Wolfgang
Wolfgang
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Kurz : SetAppEvent() ist nicht für FULL-GUI gedacht wie man denken könnte.satmax hat geschrieben:Ab dem Zeitpunkt wo ein XpbDialog ins Spiel kommt geht es nicht mehr:
unter Full-GUI ist bei einem Tastendruck der Event immer xbeP_Keyboard (1048580) und mp1 der "Wert" (z.b. xbeK_F3 = 65650)
du benötigst also beides um Tastendruck unter FULL-GUI auszuwerten
Code: Alles auswählen
CASE nEvent == xbeP_Keyboard .AND. mp1 = xbeK_F3
wenn die Controls einen Tastendruck nicht selbst auswerten ( wie ein o:Keyboard Slot ) dann wird es an den "Parent" weitergeleitet.
der "Parent" bei meinen native Controls ist ein XbpStatic der es durch die Xbase++ Queue weiterleitet an das "Fenster" was nun sein "Parent" ist.
Durch das Prinzip sind überhaupt erst "Fenster" möglich was typisch für Windows ist.
btw.
Wenn man ein PostAppEvent(xbeP_Keyboard,xbeK_*,,oXbp) verschickt ist der 4th. Parameter (oXbp) gewöhnlich das "Fenster".
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Frage zu SetAppEvent( xbeK_CTRL_F1 , ...
Danke Jimmy, das hätte Alaska auch gleich in die Hilfe schreiben können.Kurz : SetAppEvent() ist nicht für FULL-GUI gedacht wie man denken könnte.
Gruß
Markus
Markus