Seite 1 von 2

Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 16:28
von IngoM
Hallo,

ich betreue eine sehr alte Clipper-Anwendung, die nach nur geringen Anpassungen, erfolgreich mit XBase übersetzt wurde.
Das Programm läuft auch schon längere Zeit ohne Störungen und auch stabiler als die alte Version. Genutzt wird der Konsole-Modus, es wird mit /PM:VIO gelinkt.
Jetzt geht es um Fragen im Umfeld der Bedienung, vielleicht habe ich auch etwas im Rahmen der Umstellung übersehen.

In den Eingabefeldern kann man nicht erkennen, ob man sich im Einfüge- oder Überschreibmodus befindet; früher hat sich hier der Cursor verändert.
Geht so etwas auch unter XBase? Gibt es alternativ die Möglichkeit, den Status der Einfügetaste am unteren Bildschirmrand anzuzeigen?

In einer anderen Anwendung möchte ich den Status der NUMLOCK-Taste abfragen; gibt es hier eine Lösung?

Sollten das für Euch dumme Fragen sein, seht es mir bitte nach, ich stehe noch am Anfang mit XBase.

Vielen Dank für Eure Hilfe
Ingo

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 16:30
von Tom
Hallo, Ingo.

AppKeyState() heißt die Funktion. Such mal danach in der Doku und/oder im Forum.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 17:00
von IngoM
Hallo Tom,

Danke für die prompte Antwort; ich werde mich mal damit beschäftigen.
Hast Du auch eine Information zum Cursorverhalten?

Viele Grüße, Ingo

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 17:07
von Martin Altmann
Moin Ingo,
dafür gibt es die Funktion SetCursor(...) - schau Dir dazu mal die Hilfe an.

Viele Grüße,
Martin

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 17:27
von IngoM
Hallo Martin,

SETCURSOR() kenne ich auch schon von Clipper; dort wurde der Cursor im Einfügemodus von einem Unterstrich zu einem Block.
Diese Funktionalität fehlt mir jetzt; genau dafür suche ich einen Ersatz.

Eine Nebenfrage, wie funktioniert die Hilfe unter Windows 10 64bit?

Viele Grüße, Ingo

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 17:34
von Martin Altmann
Hallo Ingo,
es gibt .chm-Dateien von Alaska, die ersetzen die alten.hlp-Dateien.
Für die Art des Cursors gibst du als Parameter mit, welcher genommen werden soll - z.B. SC_NORMAL für den Unterstrich oder SC_SPECIAL1 für einen ganzen Block (Du musst die setcurs.ch einbinden).

Viele Grüße,
Martin

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 20:44
von IngoM
Hallo Martin,

in der Hilfedatei fand ich ein Beispiel zum Thema Cursor im Einfügemodus. Im folgenden Code funktioniert es aber nicht.
Scoreboard zeigt den Status der Einfügetaste an, der Cursor ändert sich aber nicht.

Code: Alles auswählen

#include "Setcurs.ch"
SET SCOREBOARD ON
eingabe=SPACE(20)
      @ 5,10  SAY  " Eingabe: "  GET eingabe
      SetCursor( IIf( ReadInsert(), SC_SPECIAL2, SC_NORMAL) )
      READ
Return

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Do, 20. Apr 2017 23:15
von Martin Altmann
Das ermittelt ja auch nur den Zustand des Einfügemodus zum Zeitpunkt, wenn das Read aktiv wird!
Du müsstest in den keyhandler rein, und beim drücken der INS-Taste sowohl den Cursor als auch den Einfüge/Überschreibmodus umschalten.

Viele Grüße,
Martin

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 0:44
von AUGE_OHR
IngoM hat geschrieben:... es wird mit /PM:VIO gelinkt.

In den Eingabefeldern kann man nicht erkennen, ob man sich im Einfüge- oder Überschreibmodus befindet; früher hat sich hier der Cursor verändert.
hm ... mache eine Kopie von \SOURCE\SYS\GetSys.prg

Code: Alles auswählen

   // Tasten zum Editieren
   CASE nKey == K_INS                  
        Set( _SET_INSERT, !Set(_SET_INSERT) )
        DispScoreboard()

PROCEDURE DispScoreboard()
   IF Set( _SET_SCOREBOARD )
      Eval( SCORE_BLOCK, Row(), Col(), ;
            IIf( Set(_SET_INSERT), NAT_MSG_INSERT_ON, NAT_MSG_INSERT_OFF) ;
          )

      // hier erweitern
      SetCursor( IIf( ReadInsert(), SC_SPECIAL2, SC_NORMAL) )
   ENDIF
RETURN
danach bindest du die geänderte GetSys.prg in dein *.XPJ ein.
! Note : wenn du die Mouse aktivierst benötigst du die \SOURCE\SYS\GetSysX.prg

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 7:47
von IngoM
Hallo Jimmy,

in meiner XBASE-Installation gibt es diese Datei nicht.
Wo kann ich die Datei herbekommen?

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 7:57
von Martin Altmann
Sorry - aber das kann ich mir nur sehr schwer vorstellen!
Im Verzeichnis .\XPPW32\SOURCE\SYS\ findest Du sie.
Wenn nicht - welche Version nutzt Du denn???

Viele Grüße,
Martin

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 9:51
von IngoM
Hallo Martin,

ich habe die aktuelle 2.x Build 779 vom 31.03.2017.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 9:56
von Jan
Hallo Ingo,

in der 2.0 findest Du die Datei unter C:\Users\{Benutzername}\Documents\Xbase++\source\runtime\sys

Und das mit dem Cursor ändern mache ich in VIO-Programmen regelmäßig. Das klappt eindeutig. Wie Martin schon schrieb machst Du das aber an der falschen Stelle. Entweder Du machst das wie er vorschlug. Oder in der Zeile vor dem GET.

Jan

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 10:15
von IngoM
Hallo Jan,

Danke für den Hinweis, ich habe im ALASKA-Verzeichnis gesucht.
Ich versuche mal den Vorschlag von Jimmy und Martin umzusetzen.

Nur zum Verständnis: Ich möchte den Cursor nicht ständig umschalten, ich möchte erreichen, dass das in Abhängigkeit von der Einfügen-Taste geschieht.
Unter Clipper war das Standardverhalten ein Unterstrich, der beim Drücken der Taste zum Halbblock wurde. Unter XBase ist es offensichtlich nicht so.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 10:57
von IngoM
In der Beschreibung zu READINSERT() fand ich den folgenden Hinweis:

Code: Alles auswählen

// In the example, a very frequent use of
// ReadInsert() is illustrated:
//
//     Toggling the cursor form and insert mode
//     automatically when the insert key is pressed.
//
// In insert mode, a full block cursor is displayed; in
// overwrite mode, the cursor is a normal underscore.
// This occurs in a code block which is executed when the insert key
// is pressed. MemoEdit() is used as the data input function.

   #include "Inkey.ch"
   #include "Setcurs.ch"

   PROCEDURE Main
      LOCAL cText, bBlock

      cText  := MemoRead("TEST.TXT")

      bBlock := ;
         {|| SetCursor( ;                         // Changes cursor form
              IIf( ReadInsert( ! ReadInsert() ),; // Inserts .T.|.F.
                   SC_NORMAL, SC_SPECIAL1 ;       // value for
             )   ) ;                              // Setcursor()
         }


      SET SCOREBOARD OFF
      SetKey( K_INS, bBlock )         // Assigns code block to key
      cText := MemoEdit( cText, 5, 5, 20, 75 )    // Edits
      MemoWrit( "TEST.TXT", cText )

      SET SCOREBOARD ON
      SetKey( K_INS, NIL )                        // Reset

   RETURN
Damit verhält sich die EINFG-Taste wieder wie unter Clipper.

Vielen Dank für Eure Hilfe.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 20:53
von IngoM
Wie kann ich, bei Verwendung des Beispiels, verhindern, dass der Cursor sich auch während eines MENU TO ändert?
Ich schalte ihn zwar vorher mit SET CURSOR OFF aus, aber beim Drücken der EINFG-Taste erscheint wieder ein Block-Cursor.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Fr, 21. Apr 2017 23:53
von AUGE_OHR
IngoM hat geschrieben:Wie kann ich, bei Verwendung des Beispiels, verhindern, dass der Cursor sich auch während eines MENU TO ändert?
kurze Version : du musst dir selbst eine Function __MenuTo() schreiben

---

in Xbase++ wird die STD.CH eingebunden welche verschiedene anderer *.CH wie prompt.ch einbindet.
in der \INCLUDE\prompt.ch steht

Code: Alles auswählen

#command  MENU TO <var> ;
      =>  <var> := _MenuTo(PromptList, <var>, UPPER(#<var>))
es gibt auch das Alaska Demo mit \SOURCE\samples\migrate\prompt\MenuTo.ch

Code: Alles auswählen

#command  MENU TO <var> ;
      =>  <var> := ButtonMenuTo(promptList, <var>, UPPER(#<var>))
das MenuTo.prg zeigt wie eine Xbase++ Hybrid Lösung aussehen könnte.

wenn du aber weiter beim Cl*pper Stil bleiben willst wäre ein Source aus 1992 (!!!) für dich interessant.
DFSRC.ZIP.ZIP
Cl*pper Source
(5.17 KiB) 229-mal heruntergeladen
weiter Sourcen könntest du bei https://harbour.github.io/the-oasis/ finden. Stichwort : Menu, Mouse oder Screensaver

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Sa, 22. Apr 2017 7:32
von IngoM
Hallo Jimmy,

Danke für den Vorschlag; allerdings wird das dann ziemlich aufwendig (für mich).

Gibt es bei der aktuell realisierten Variante nicht eine Möglichkeit, abzufragen, ob man sich innerhalb eines MENU TO befindet?
Dann könnte man in einem solchen Fall den Cursor einfach nicht umschalten.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Sa, 22. Apr 2017 19:40
von AUGE_OHR
IngoM hat geschrieben:Gibt es bei der aktuell realisierten Variante nicht eine Möglichkeit, abzufragen, ob man sich innerhalb eines MENU TO befindet?
das hätte ich dir vielleicht vor 25 Jahren beantworten können aber ich arbeite schon ewig nicht mehr mit PROMPT und MENU TO.

IMHO solltest du dich von solchen Kleinigkeiten nicht aufhalten lassen denn da warten noch ganz andere Hindernisse.

Tip : wenn du nur Cl*pper Source nach Xbase++ bringen willst dann schalte alles ab was Xbase++ "neu dazu" hat wie.

Code: Alles auswählen

SET OPTIMIZE OFF
SET RUSHMORE OFF
SET SMARTFILTER OFF

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Sa, 22. Apr 2017 19:48
von Jan
Ingo,

keine Ahnung, ob man das überhaupt abfragen kann. Ich würde etwas radikal einfach eine PUBLIC erstellen, und immer in Situationen, in denen der Cursor nicht umgestellt werden darf, z. B. auf .F. setzen. Hinterher sofort wieder auf .T. zurück. Und in der Schleife, wo dann umgestellt wird, jeweils diese PUBLIC abfragen - ein Umschalten darf nur dann erfolgen, wenn die auf .T. steht.

Jan

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: So, 23. Apr 2017 6:21
von IngoM
Hallo Jimmy,

die Schalter sind mir bekannt und werden auch berücksichtigt. Es lohnt sich für mich einfach nicht, das 30 Jahre alte Programm umzuschreiben.
Mit XBase kriege ich es einfacher auf den neuen Windows-Versionen zum Laufen.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: So, 23. Apr 2017 6:32
von IngoM
Hallo Jan,

das wäre eine Möglichkeit, bedeutet aber Einiges an Änderungen.
Ich muss erst einmal alle anderen CURSOR-Befehle anpassen, da jetzt in manchen Situationen der Cursor vom Tastenzustand abweicht.

ich frage mich eigentlich, warum XBase hier von Clipper abweicht. Zu sehen, ob man im Einfügemodus ist, empfinde ich als Basic.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: So, 23. Apr 2017 8:16
von IngoM
ich habe das alte Programm noch mal mit Clipper übersetzt.
Der Einfügezustand und die Cursorform wird auch nach einem SET CURSOR OFF und SET CURSOR ON wiederhergestellt.
Es gibt also einen deutlichen Unterschied im Verhalten; kann das jemand erklären?

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: So, 23. Apr 2017 21:16
von AUGE_OHR
hi,

Xbase+ ist zu 99% kompatible zu Cl*pper v5.2e ...

wie ich schon sagte solltest du dich mit solchen Kleinigkeiten nicht aufhalten sondern die Datenbank Funktionen deines Programm mit Xbase++ testen ob du da mit den 99% zurechtkommst.

wenn ein SEEK, GOTO oder SKIP ein Problem machst wirst du es, wegen dem Absturz, schnell merken.
wenn du aber FILTER oder RELATION hast könnte es sein das die zwar Ergebnisse liefern die aber unvollständig sind oder Unsinn liefern.

... und frage nicht nach der Geschwindigkeit Xbase++ vs. Cl*pper ... Xbase++ ist (viel) langsamer.

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Verfasst: Mo, 24. Apr 2017 8:26
von IngoM
Hallo Jimmy,

ich war nicht darauf gefasst, dass das fehlende Prozent Kompatibilität sich bei solchen Basisfunktionen auswirkt.

Dass einzelne Befehle oder Funktionen nicht vorhanden sind oder anders funktionieren, habe ich schon erlebt. Das ließ sich aber relativ leicht anpassen.
FILTER und RELATION benutze ich in den alten Programmen nicht. Hier würde ich aber erwarten, dass diese auch fehlerfrei funktionieren.
Gibt es Aussagen von Alaska, dass es hier Fehler gibt?

Gibt es eine Dokumentation der Funktionen, die in XBase anders funktionieren? Also, die Inkompatibilitäten zu Clipper, besonders bei den, nun mal besonders wichtigen, Datenbankfunktionen?