Tastenzustand EINFG/NUMLOCK anzeigen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Viele Grüße
Ingo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag von Tom »

Hallo, Ingo.

AppKeyState() heißt die Funktion. Such mal danach in der Doku und/oder im Forum.
Herzlich,
Tom
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Viele Grüße
Ingo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag von Martin Altmann »

Moin Ingo,
dafür gibt es die Funktion SetCursor(...) - schau Dir dazu mal die Hilfe an.

Viele Grüße,
Martin
:grommit:
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.
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Viele Grüße
Ingo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
:grommit:
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.
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Viele Grüße
Ingo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
:grommit:
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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
gruss by OHR
Jimmy
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag von IngoM »

Hallo Jimmy,

in meiner XBASE-Installation gibt es diese Datei nicht.
Wo kann ich die Datei herbekommen?
Viele Grüße
Ingo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
:grommit:
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.
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag von IngoM »

Hallo Martin,

ich habe die aktuelle 2.x Build 779 vom 31.03.2017.
Viele Grüße
Ingo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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) 227-mal heruntergeladen
weiter Sourcen könntest du bei https://harbour.github.io/the-oasis/ finden. Stichwort : Menu, Mouse oder Screensaver
gruss by OHR
Jimmy
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
Viele Grüße
Ingo
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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?
Viele Grüße
Ingo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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.
gruss by OHR
Jimmy
IngoM
UDF-Programmierer
UDF-Programmierer
Beiträge: 51
Registriert: Di, 09. Jul 2013 9:23

Re: Tastenzustand EINFG/NUMLOCK anzeigen

Beitrag 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?
Viele Grüße
Ingo
Antworten