F10 Taste springt immer ins Dateimenü
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
F10 Taste springt immer ins Dateimenü
Immer wenn man in einem xclass oder xbasefenster F10 drückt, wird immer ins Dateimenü gesprungen. Selbst wenn man für F10 über den keyboard slot was anderes programmiert hat. Kann man das irgendwie abschalten?
- Martin Altmann
- Foren-Administrator
- Beiträge: 16521
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Nun,
das Thema hatten wir hier schon und das hat nichts mit XClass++ zu tun!
Ist SWB und funktioniert genauso auch in anderen Programmen.
Viele Grüße,
Martin
das Thema hatten wir hier schon und das hat nichts mit XClass++ zu tun!
Ist SWB und funktioniert genauso auch in anderen Programmen.
Viele Grüße,
Martin
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.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
nicht nur xclass auch xbasebrandelh hat geschrieben:Hi,
die IBM SAA Architektur sah F10 für Menü vor.
XClass scheint das eingebaut zu haben.
Entweder über ein SetAppEvent() oder in den Keyboard-Methoden.
Du hast doch den Quellcode von XClass oder hat sich das geändert ?
Dort wird die Antwort zu finden sein.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Ich hab das gleiche Problem vor kurzem auch gehabt. Weil ich die F10-Taste in einem Projekt umbiegen und auf eine eigene Funktion umbiegen wollte. Das hat mich fast zum Wahnsinn getrieben, weil immer die Windows-Funktion wieder durchgeschlagen ist und F10 einfach nicht das gemacht hat, was ich wollte. Wie Hubert vorgeschlagen hat, versuch es mit der Event-Schleife. Zur Not kannst Du das da ja auch totlegen.
Das hat in der Tat nichts mit Xbase oder sonstwas zu tun, sondern ist Windows-Fundament.
Jan
Das hat in der Tat nichts mit Xbase oder sonstwas zu tun, sondern ist Windows-Fundament.
Jan
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Setappevent und die keyboardmethoden bringen zwar den Aufruf,aber ins Dateimenü wird trotzdem gesprungen.Jan hat geschrieben:Ich hab das gleiche Problem vor kurzem auch gehabt. Weil ich die F10-Taste in einem Projekt umbiegen und auf eine eigene Funktion umbiegen wollte. Das hat mich fast zum Wahnsinn getrieben, weil immer die Windows-Funktion wieder durchgeschlagen ist und F10 einfach nicht das gemacht hat, was ich wollte. Wie Hubert vorgeschlagen hat, versuch es mit der Event-Schleife. Zur Not kannst Du das da ja auch totlegen.
Das hat in der Tat nichts mit Xbase oder sonstwas zu tun, sondern ist Windows-Fundament.
Jan
Es gibt doch aber Programme, die f10 nicht bieten, also muss das ja irgendwo im Programm zu verbieten gehen.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hi,
es war mir entgangen, dass dies nun automatisch von Xbase++ unterstützt wird. Bei der F1 Taste mache ich ähnliches, das hatte ich auch schon mal geschrieben ... blos wo
Der Trick besteht darin den handelevent() Aufruf zu blockieren, die genauen Defines bitte aus AppEvent.ch holen, die weiß ich nicht aus dem Kopf und ich bin schon auf dem Sprung ...
am Besten hier nach F1 suchen dann findest du den genauen Code
es war mir entgangen, dass dies nun automatisch von Xbase++ unterstützt wird. Bei der F1 Taste mache ich ähnliches, das hatte ich auch schon mal geschrieben ... blos wo
Der Trick besteht darin den handelevent() Aufruf zu blockieren, die genauen Defines bitte aus AppEvent.ch holen, die weiß ich nicht aus dem Kopf und ich bin schon auf dem Sprung ...
Code: Alles auswählen
nEvent := AppEvent(...)
if nEvent = Xbp ... Keyboard event ?
do case
case mp1 = Xbp ... Taste F10 ... dann blockieren
nEvent := NONE // Kürzel für keinen Event
...
if nEvent # NONE
oXbp:handleevent(....)
endif
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Kommt das mit in die Main?brandelh hat geschrieben:Hi,
es war mir entgangen, dass dies nun automatisch von Xbase++ unterstützt wird. Bei der F1 Taste mache ich ähnliches, das hatte ich auch schon mal geschrieben ... blos wo
Der Trick besteht darin den handelevent() Aufruf zu blockieren, die genauen Defines bitte aus AppEvent.ch holen, die weiß ich nicht aus dem Kopf und ich bin schon auf dem Sprung ...
am Besten hier nach F1 suchen dann findest du den genauen CodeCode: Alles auswählen
nEvent := AppEvent(...) if nEvent = Xbp ... Keyboard event ? do case case mp1 = Xbp ... Taste F10 ... dann blockieren nEvent := NONE // Kürzel für keinen Event ... if nEvent # NONE oXbp:handleevent(....) endif
F10 ist übrigens xbeK_F10
Und brandelh: Was kommt denn in Appevent und handleevent?
Ich hatte nie was damit zu tun.
Wenn ich das so in die main einbaue, treten jede Menge Compilerfehler auf. Sicher bedingt durch xclass.
nEvent := AppEvent(@mp1,@mp2,@oXbp,0)
if nEvent = XbeK_F10
do case
case mp1 = XbeK_F10
nEvent := NONE // Kürzel für keinen Event
case mp1 !=xbEK_F10
nevent:=nevent
enddo
endif
if nEvent # NONE
oXbp:handleevent(nevent,mp1,mp2)
endif
- Martin Altmann
- Foren-Administrator
- Beiträge: 16521
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Stevie,
bei XClass ist das alles zum Glück viel einfacher!
Schau Dir mal die AddEventKey()-Methode an:
Klappt wunderbar...
Viele Grüße,
Martin
bei XClass ist das alles zum Glück viel einfacher!
Schau Dir mal die AddEventKey()-Methode an:
Code: Alles auswählen
::AddEventKey( xbeK_F10, { || ::nrbeleg(), datausles( ::editControls, ::alteWerte, .t. ), ::Ansprung() } ) // <F10> ruft Prozedur ansprung auf
Viele Grüße,
Martin
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.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Bei mir nichtMartin Altmann hat geschrieben:Hallo Stevie,
bei XClass ist das alles zum Glück viel einfacher!
Schau Dir mal die AddEventKey()-Methode an:Klappt wunderbar...Code: Alles auswählen
::AddEventKey( xbeK_F10, { || ::nrbeleg(), datausles( ::editControls, ::alteWerte, .t. ), ::Ansprung() } ) // <F10> ruft Prozedur ansprung auf
Viele Grüße,
Martin
Hab ne Mdi-Anwendung in der ein Dialog geöffnet wird. In diesem müsste das normalerweise dann so funktionieren.
Hauptfenster ist oApp
oDlg:AddEventKey( xbeK_F10, { ||akt(XbeK_F10)})
Proc akt(nkey)
local cColor,aZust
if nkey==xbeK_F1
dsconfirmbox(getapp():drawingArea,str(nkey), "F1", XBPMB_OK)
endif
if nkey==xbeK_F10
dsconfirmbox(getapp():drawingArea,str(nkey), "F10", XBPMB_OK)
endif
if nkey==xbeK_F8
dsconfirmbox(getapp():drawingArea,str(nkey), "F8", XBPMB_OK)
endif
return
Er springt weiterhin nur ins Menü. Wenn die Funktion bspw. mit F8 über xkeyboard aufgerufen wird, klappts. AddEventkey klappt aber weder mit f8 oder mit f10. Wenn ich das über xkeyboard mache, funktioniert zwar f10. Er springt aber gleichzeitig auch ins Menü.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16521
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Stevie,
hmm - dann liegt das vielleicht bei mir daran, dass ich nur modale Dialoge benutze.
Ist ein Fenster offen, kann bei mir kein Menüpunkt angewählt werden.
Viele Grüße,
Martin
hmm - dann liegt das vielleicht bei mir daran, dass ich nur modale Dialoge benutze.
Ist ein Fenster offen, kann bei mir kein Menüpunkt angewählt werden.
Viele Grüße,
Martin
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.
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Daran kanns liegen. Nur Addeventkey funktioniert auch im Hauptfenster ohne geöffnete Fenster nicht.Martin Altmann hat geschrieben:Hallo Stevie,
hmm - dann liegt das vielleicht bei mir daran, dass ich nur modale Dialoge benutze.
Ist ein Fenster offen, kann bei mir kein Menüpunkt angewählt werden.
Viele Grüße,
Martin
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2936
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 13 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Das ist falsch.stevie hat geschrieben: nEvent := AppEvent(@mp1,@mp2,@oXbp,0)
if nEvent = XbeK_F10
do case
case mp1 = XbeK_F10
nEvent := NONE // Kürzel für keinen Event
case mp1 !=xbEK_F10
nevent:=nevent
enddo
endif
if nEvent # NONE
oXbp:handleevent(nevent,mp1,mp2)
endif
Muss lauten:
Code: Alles auswählen
if nEvent = XbeP_Keyboard
do case
case mp1 = XbeK_F10
........
Viele Grüße
Wolfgang
Wolfgang
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Ich habe jetzt statt Appexec()Wolfgang Ciriack hat geschrieben:Das ist falsch.stevie hat geschrieben: nEvent := AppEvent(@mp1,@mp2,@oXbp,0)
if nEvent = XbeK_F10
do case
case mp1 = XbeK_F10
nEvent := NONE // Kürzel für keinen Event
case mp1 !=xbEK_F10
nevent:=nevent
enddo
endif
if nEvent # NONE
oXbp:handleevent(nevent,mp1,mp2)
endif
Muss lauten:Code: Alles auswählen
if nEvent = XbeP_Keyboard do case case mp1 = XbeK_F10 ........
DO WHILE .T.
nEvent := AppEvent(@mp1,@mp2,@oXbp,0)
if nEvent == XbeP_Keyboard
if mp1 = XbeK_F10
nEvent := NONE // Kürzel für keinen Event
endif
endif
if nEvent # NONE
oXbp:handleevent(nEvent,mp1,mp2)
endif
ENDDO
in das xclass-Fenster aufgenommen.
Bei if nEvent ==xbeP_Keyboard wird während des Starts der Anwendung gemeldet, dass die Variable nicht existiert. Dann muss ja da noch was falsch sein.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Stevie,
Du musst am Anfang ein einbauen. Dann findet der auch die Variable.
Und formatier doch Deinen Code mal, ist wirklich besser zu lesen dann.
Jan
Du musst am Anfang ein
Code: Alles auswählen
# include "appevent.ch"
Und formatier doch Deinen Code mal, ist wirklich besser zu lesen dann.
Jan
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
wenn das so einfach wäre...Jan hat geschrieben:Stevie,
Du musst am Anfang eineinbauen. Dann findet der auch die Variable.Code: Alles auswählen
# include "appevent.ch"
Und formatier doch Deinen Code mal, ist wirklich besser zu lesen dann.
Jan
Übrigens sie wird includet und ist trotzdem unbekannt. Hab sie sogar vorher nochmal definiert. Versuchs jetz mit der Zahl 1048580. NONE hab ich mit 0 definieren müssen. Dann funktioniert F10 nicht. Wie kann ich denn nun F10 für den einzelnen Dialog im Hauptfenster erlauben?
Habs jetz so:
#define NONE 0
DO WHILE nEvent != xbeP_Close
nEvent := AppEvent(@mp1,@mp2,@oXbp)
if nEvent == 1048580
if mp1 = 65657
nEvent := NONE // Kürzel für keinen Event
endif
endif
if nEvent # NONE
oXbp:handleevent(nEvent,mp1,mp2)
endif
ENDDO
Das soll aber nur fürs Hauptfenster gelten. Ich will ja schließlich im Childfenster F10 für meine Zwecke nutzen.
-
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: Do, 15. Nov 2007 11:40
- Wohnort: Krefeld
- Kontaktdaten:
Hallo,
die alternative zum Verändern der Eventloop wäre es, das ganze direkt in der Fensterklasse zu machen. So kannst du für jedes Fenster (bzw. sogar jedes Visuelle Objekt) einzeln bestimmen was es an Tasten/(bzw. Events) bearbeiten kann. So könntest du dir relativ einfach eine Fensterklasse bauen der du übergibst welche Tasten funktionieren und was sie auslösen.
Wichtig: für Tasten die du nicht bearbeiten möchtest musst du die Keyboard Methode deiner Superklasse aufrufen
Gruß,
Jannik
die alternative zum Verändern der Eventloop wäre es, das ganze direkt in der Fensterklasse zu machen. So kannst du für jedes Fenster (bzw. sogar jedes Visuelle Objekt) einzeln bestimmen was es an Tasten/(bzw. Events) bearbeiten kann. So könntest du dir relativ einfach eine Fensterklasse bauen der du übergibst welche Tasten funktionieren und was sie auslösen.
Wichtig: für Tasten die du nicht bearbeiten möchtest musst du die Keyboard Methode deiner Superklasse aufrufen
Code: Alles auswählen
CLASS MeinDialog FROM dsDialog
EXPORTED:
METHOD ;
keyboard(nKey)
ENDCLASS
METHOD MeinDialog:keyboard( nKey)
IF nKey == xbeK_ESC
MsgBox("ESC gedrückt")
ELSEIF nKey == xbeK_F10
MsgBox("F10 gedrückt")
ELSE
::dsDialog:keyboard(nKey)
ENDIF
RETURN(SELF)
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo stefi,
ich habe kein XClass und kann es daher nicht überprüfen.
Ich denke aber, dass der F10 Event direkt im MDI Hauptfenster so belegt ist, da ja alle unverarbeiteten Events zum Schluss dort landen. Wenn XClass eine eigene Eventloop hat, muss man natürlich diese abändern oder besser wie von Janik gezeigt Das zu blockierende Fenster ableiten und die Keyboardmethode überarbeiten.
ich habe kein XClass und kann es daher nicht überprüfen.
Ich denke aber, dass der F10 Event direkt im MDI Hauptfenster so belegt ist, da ja alle unverarbeiteten Events zum Schluss dort landen. Wenn XClass eine eigene Eventloop hat, muss man natürlich diese abändern oder besser wie von Janik gezeigt Das zu blockierende Fenster ableiten und die Keyboardmethode überarbeiten.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
Ich heiße, wenn schon stevie, oder halt Stefan.brandelh hat geschrieben:Hallo stefi,
besser wie von Janik gezeigt Das zu blockierende Fenster ableiten und die Keyboardmethode überarbeiten.
Jetzt gehts.
Code: Alles auswählen
CLASS Dlg from dsdialog
var mp1,mp2,obj,nkey
Exported
Method create,keyboard,init
endclass
Method Dlg:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)
::dsdialog:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)
return self
Method Dlg:Create(oParent, oOwner, aPos, aSize, aPP, lVisible)
::dsdialog:Create(oParent, oOwner, aPos, aSize, aPP, lVisible)
return self
Method Dlg:keyboard(nkey)
akt(nkey) //hier übergebe ich den Knopf an die Fkt. akt, welche dann je nach Taste entsprechendes ausführt.
return self
-
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: Do, 15. Nov 2007 11:40
- Wohnort: Krefeld
- Kontaktdaten:
Hallo Stevie,
nur noch so als kleiner Tipp. Wenn du in den create() und init() Methoden nichts anderes mehr machen willst kannst du dir die auch sparen.
Wenn du sie nicht erneut deklarierst werden "automatisch" die create(), und init() Klassen deiner Superklasse (hier dsdialog) benutzt.
Du rufst ja in deinen eigenen create() und init ()Methoden nur die create() und init() Methoden deiner Superklasse auf.
nur noch so als kleiner Tipp. Wenn du in den create() und init() Methoden nichts anderes mehr machen willst kannst du dir die auch sparen.
Wenn du sie nicht erneut deklarierst werden "automatisch" die create(), und init() Klassen deiner Superklasse (hier dsdialog) benutzt.
Du rufst ja in deinen eigenen create() und init ()Methoden nur die create() und init() Methoden deiner Superklasse auf.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
-
- Rekursionen-Architekt
- Beiträge: 417
- Registriert: Mo, 17. Sep 2007 18:20
- Wohnort: Senftenberg
- Kontaktdaten:
das wusste ich nicht. ich hatte es ohne init probiert, ging aber nich. deswegen hatte ich beide. hab aber beides jetz rausgenommen und dann klappts auch.J.Renseler hat geschrieben:Hallo Stevie,
nur noch so als kleiner Tipp. Wenn du in den create() und init() Methoden nichts anderes mehr machen willst kannst du dir die auch sparen.
Wenn du sie nicht erneut deklarierst werden "automatisch" die create(), und init() Klassen deiner Superklasse (hier dsdialog) benutzt.
Du rufst ja in deinen eigenen create() und init ()Methoden nur die create() und init() Methoden deiner Superklasse auf.
Was ich noch rausgefunden habe, das Kontextmenü kann man erlauben, wenn man für contextmenukey 0 setzt, funktioniert das Kontextmenü auch. Sonst würde bei F10 das Kontextmenü (bei mir vom Browser) geöffnet