F-Tasten im Hybrid Mode
Moderator: Moderatoren
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
F-Tasten im Hybrid Mode
Hallo zusammen,
ich migriere eine Clipper-Anwendung auf xBase++.
Ich benutze in der Clipper-Anwendung die Funktionstasten F1 und F10. Diese sind aber durch Windows bereits vorbelegt.
Wie kann ich trotzdem "meine" Funktionstasten F1 und F10 weiterhin benutzen und damit die Windows-Werte überschreiben.
Natürlich kann ich die Funktionstasten anders belegen, machen die Belegung aber absolut unlogisch, wenn ich von F1 - F4 aufeinanderfolgende "Abfragen" starte und jetzt die F1 Taste auf F7 oder F8 liegt.
Gibt es hier einen kleinen, einfachen Befehl dafür ? In der Online Hilfe bin ich dazu nicht fündig geworden.
Gruß
Lutz
ich migriere eine Clipper-Anwendung auf xBase++.
Ich benutze in der Clipper-Anwendung die Funktionstasten F1 und F10. Diese sind aber durch Windows bereits vorbelegt.
Wie kann ich trotzdem "meine" Funktionstasten F1 und F10 weiterhin benutzen und damit die Windows-Werte überschreiben.
Natürlich kann ich die Funktionstasten anders belegen, machen die Belegung aber absolut unlogisch, wenn ich von F1 - F4 aufeinanderfolgende "Abfragen" starte und jetzt die F1 Taste auf F7 oder F8 liegt.
Gibt es hier einen kleinen, einfachen Befehl dafür ? In der Online Hilfe bin ich dazu nicht fündig geworden.
Gruß
Lutz
- 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: F-Tasten im Hybrid Mode
hi,
Die Frage ist was du nun eigendlich gemacht hast. Wenn du Cl*pper
Code "einfach" mit Xbase++ "compile/link" durchläufst so bekommst
du eine "VIO" Application. Du hast dann "nur " den "interen" Event Handler
sodas
"normal" funktioniert.
Wenn du aber die selbe Application mit /PM:PM "link"st dann hast du eine
Hybrid Anwendung und brauchst einen "eigenen" Eventloop.
Auch wird bei SETMOUSE(.T.) die GETSYSX.PRG benutzt wo eine Event-
loop drin ist.
besser als alles in die "Main" Eventloop zu packen ist jedoch der jeweilige
:Keyboard slot wo du nur noch :
abfragen würdest.
gruss by OHR
Jimmy
welcome in der Xbase++ worldLutz Rübe hat geschrieben: ich migriere eine Clipper-Anwendung auf xBase++.
wieso "vorbelegt" ? wie sieht dein Cl*pper code aus ?Lutz Rübe hat geschrieben: Ich benutze in der Clipper-Anwendung die Funktionstasten F1 und F10. Diese sind aber durch Windows bereits vorbelegt.
"eigendlich" sollte es "genauso" funktionieren ...Lutz Rübe hat geschrieben: Wie kann ich trotzdem "meine" Funktionstasten F1 und F10 weiterhin benutzen und damit die Windows-Werte überschreiben.
Die Frage ist was du nun eigendlich gemacht hast. Wenn du Cl*pper
Code "einfach" mit Xbase++ "compile/link" durchläufst so bekommst
du eine "VIO" Application. Du hast dann "nur " den "interen" Event Handler
sodas
Code: Alles auswählen
SETKEY(K_F12 , {|| TuMalWas() } )
Wenn du aber die selbe Application mit /PM:PM "link"st dann hast du eine
Hybrid Anwendung und brauchst einen "eigenen" Eventloop.
Code: Alles auswählen
CASE nEvent == xbeP_Keyboard .AND. mp1 = xbeK_F12
loop drin ist.
besser als alles in die "Main" Eventloop zu packen ist jedoch der jeweilige
:Keyboard slot wo du nur noch :
Code: Alles auswählen
CASE nKey = xbeK_F12
gruss by OHR
Jimmy
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Jimmy, danke für die schnelle Antwort.
Also um Deine Fragen zu beantworten:
ich arbeite (noch) mit dem "alten" DO CASE um die F-Tasten abzufragen und dann die Aktivitäten zu starten:
Das Programm ist hybrid, mit /PM:PM gelinkt.
Die F-Tasten F1 und F10 sind mit Windows-Funktionen belegt. F1 reagiert garnicht (Windows-Interner Hilfe-Aufruf ???) und die F10 Taste aktiviert die Menu-Bar. Alle anderen F-Tasten arbeiten einwandfrei !!!
Mit SetKey() arbeite ich (noch) nicht.
Gruß
Lutz[/code]
Also um Deine Fragen zu beantworten:
ich arbeite (noch) mit dem "alten" DO CASE um die F-Tasten abzufragen und dann die Aktivitäten zu starten:
Code: Alles auswählen
nKey := 0
DO WHILE nKey <> K_F9
nKey := inkey()
DO CASE
CASE nKey == K_F1
/* hier der weitere Code zum Abarbeiten F1 */
CASE nKey == K_Fn
/* Funktionstaste Fn wird abgearbeitet */
CASE nKey == K_F10
RETURN
ENDCASE
ENDDO
Die F-Tasten F1 und F10 sind mit Windows-Funktionen belegt. F1 reagiert garnicht (Windows-Interner Hilfe-Aufruf ???) und die F10 Taste aktiviert die Menu-Bar. Alle anderen F-Tasten arbeiten einwandfrei !!!
Mit SetKey() arbeite ich (noch) nicht.
Gruß
Lutz[/code]
- 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:
soweit ich mich erinnere muss auch im Hybridmodus (/PM:PM )Lutz Rübe hat geschrieben: ...
nKey := inkey()
...
Das Programm ist hybrid, mit /PM:PM gelinkt.
statt inkey() AppEvent() genutzt werden.
Sieh dir in der Onlinehilfe (bei 1.90 sind da neue Texte dazugekommen) unter AppEvent() nach. Dort gibt es ein Beispiel eines Eventloop, der im Prinzip das gleiche tut wie bei deinem alten DOS Clipperprogramm.
Ich meine, dass inkey() die von Windows vorbelegten Funktionstasten gar nicht mehr mitbekommt, AppEvent() aber schon.
So müsste es gehen, auch wenn ich dieses Beispiel aus einer GUI Anwendung geholt habe:
Code: Alles auswählen
DO WHILE .T.
nEvent := AppEvent( @mp1, @mp2, @oXbp)
do case
case nEvent = xbe_None // kann nur mit Timeout passieren
* nichts tun ist hier Standard
case nEvent = xbeP_Keyboard .and. mp1 == xbeK_F1
case nEvent = xbeP_Keyboard .and. mp1 == xbeK_F2
case nEvent = xbeP_Keyboard .and. mp1 == xbeK_F3
case nEvent = xbeP_Keyboard .and. mp1 == xbeK_F4
...
otherwise
oXbp:handleEvent( nEvent, mp1, mp2 )
endcase
ENDDO
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Hallo Lutz,
vorab ein kleiner Hinweis, der das "Kochen" der CPU verhindert:
Schreib statt nKey := inkey()
Dadurch "weiß" Windows, wann das xBase-Programm keine Rechenzeit benötigt.
Ich habe für die Benutzung der Funktionstaste F10 folgenden
Code benutzt:
Deine Routine könnte man wie folgt umschreiben (ungetestet):
Hierdurch werden den Funktionstasten die entsprechenden Funktionen zugeordnet und diese bei Tippen der entsprechenden Taste aufgerufen.
Durch den Befehl BREAK wird die obige Sequenz verlassen und somit auch die "Endlosschleife" beendet.
Falls benötigt, kann man auch innerhalb der zugeordneten Funktionen die bestehenden Zuordnungen der Funktionstasten für die Zeit der Abarbeitung des Programmcodes deaktivieren um Rekursionen zu vermeiden.
Ich hoffe, es klappt zu Deiner Zufriedenheit.
Uli
vorab ein kleiner Hinweis, der das "Kochen" der CPU verhindert:
Schreib statt nKey := inkey()
Code: Alles auswählen
nKey := inkey(0.1)
Ich habe für die Benutzung der Funktionstaste F10 folgenden
Code benutzt:
Code: Alles auswählen
SetAppEvent( xbeK_F10,{||F10TasteGetippt()} )
Code: Alles auswählen
bOldF1 := SetAppEvent( xbeK_F1 ,{||F1TasteGetippt() } )
..
bOldF10 := SetAppEvent( xbeK_F10,{||F10TasteGetippt()} )
BEGIN SEQUENCE
DO WHILE .T.
inkey(0.1)
ENDDO
END SEQUENCE
SetAppEvent( xbeK_F1 ,bOldF1 } )
..
SetAppEvent( xbeK_F10,bOldF10} )
.. /* weiterer Programmcode */
RETURN
PROCEDURE F1TasteGetippt()
/* hier der Code zum Abarbeiten F1 */
RETURN
..
PROCEDURE F10TasteGetippt()
BREAK
RETURN
Durch den Befehl BREAK wird die obige Sequenz verlassen und somit auch die "Endlosschleife" beendet.
Falls benötigt, kann man auch innerhalb der zugeordneten Funktionen die bestehenden Zuordnungen der Funktionstasten für die Zeit der Abarbeitung des Programmcodes deaktivieren um Rekursionen zu vermeiden.
Ich hoffe, es klappt zu Deiner Zufriedenheit.
Uli
- Lutz Rübe
- Rekursionen-Architekt
- Beiträge: 144
- Registriert: Mi, 02. Aug 2006 18:13
- Wohnort: 24536 Neumünster
- Danksagung erhalten: 6 Mal
- Kontaktdaten:
Danke an alle für Eure Tipps.
Ich habe in der Zwischenzeit weiter herum-experimentiert und bin selber zu folgender Lösung gekommen:
Wie Ihr seht, habe ich die erste Info bereits mit umgesetzt ( Inkey(0.1) ) auch die anderen Ratschläge werde ich beherzigen und entsprechend umsetzen.
Wahrscheinlich ist meine "Methode" nicht die günstigste bzw. richtigste, aber was wichtig für mich ist: sie funktioniert !!!
Danke nochmal. Ihr habt mir schon weitergeholfen.
Gruß
Lutz
Ich habe in der Zwischenzeit weiter herum-experimentiert und bin selber zu folgender Lösung gekommen:
Code: Alles auswählen
SET KEY K_F1 TO Inkey(0.1)
SET KEY K_F10 TO Inkey(0.1)
DO WHILE .T:
nKey := Inkey(0.1)
DO CASE
CASE nKey == K_F1
/* hier folgen die Anweisungen */
CASE nKey == K_Fn
/* hier folgen die Anweisungen für die Funktionstasten Fn */
CASE nKey == K_F10
Return
ENDCASE
ENDDO
Wahrscheinlich ist meine "Methode" nicht die günstigste bzw. richtigste, aber was wichtig für mich ist: sie funktioniert !!!
Danke nochmal. Ihr habt mir schon weitergeholfen.
Gruß
Lutz
- 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:
laut Handbuch ist es erst ein MUSS, wenn man die Maus einschaltet, aber ich denke es macht auch einen Unterschied bei den vorbelegten Funktionstasten bin mir aber nicht sicher.Lutz Rübe hat geschrieben:Hallo Hubert,
noch eine kurze Info für Dich:
das mit dem Ersetzen von Inkey() durch AppEvent() scheint kein muß zu sein, denn bei mir funktionieren noch alle Inkey()-Funktionen.
Gruß
Hubert
Hubert