F-Tasten im Hybrid Mode

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
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

Beitrag von Lutz Rübe »

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
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

Re: F-Tasten im Hybrid Mode

Beitrag von AUGE_OHR »

hi,
Lutz Rübe hat geschrieben: ich migriere eine Clipper-Anwendung auf xBase++.
welcome in der Xbase++ world
Lutz Rübe hat geschrieben: Ich benutze in der Clipper-Anwendung die Funktionstasten F1 und F10. Diese sind aber durch Windows bereits vorbelegt.
wieso "vorbelegt" ? wie sieht dein Cl*pper code aus ?
Lutz Rübe hat geschrieben: Wie kann ich trotzdem "meine" Funktionstasten F1 und F10 weiterhin benutzen und damit die Windows-Werte überschreiben.
"eigendlich" sollte es "genauso" funktionieren ...

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() } )
"normal" funktioniert.

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
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 :

Code: Alles auswählen

CASE nKey = xbeK_F12
abfragen würdest.

gruss by OHR
Jimmy
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

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:

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
      
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]
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Lutz Rübe hat geschrieben: ...
nKey := inkey()
...
Das Programm ist hybrid, mit /PM:PM gelinkt.
soweit ich mich erinnere muss auch im Hybridmodus (/PM:PM )
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
ACHTUNG ! Die Eventloop darf nicht lange aufgehalten werden, sonst blockiert das Programm. Bei GUI ist das sehr unschön !
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
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:

Beitrag von UliTs »

Hallo Lutz,

vorab ein kleiner Hinweis, der das "Kochen" der CPU verhindert:
Schreib statt nKey := inkey()

Code: Alles auswählen

nKey := inkey(0.1)
Dadurch "weiß" Windows, wann das xBase-Programm keine Rechenzeit benötigt.

Ich habe für die Benutzung der Funktionstaste F10 folgenden
Code benutzt:

Code: Alles auswählen

SetAppEvent( xbeK_F10,{||F10TasteGetippt()} )
Deine Routine könnte man wie folgt umschreiben (ungetestet):

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
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
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

Danke an alle für Eure Tipps.

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
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
Benutzeravatar
Lutz Rübe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 144
Registriert: Mi, 02. Aug 2006 18:13
Wohnort: 24536 Neumünster
Danksagung erhalten: 6 Mal
Kontaktdaten:

Beitrag von Lutz Rübe »

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.

Aber Du hast Recht, ich werde nach und nach alle Inkey()-s durch AppEvent() ersetzen.

Gruß
Lutz
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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.
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.
Gruß
Hubert
Antworten