shiftstate [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

shiftstate [gelöst]

Beitrag von haderlump »

Hallo zusammen
ich muss den Status der Tasten wissen.
dazu habe ich mit

Code: Alles auswählen

lastshift =getKeyshitState 
den status abgefragt.
Ich möchte eine procedure aber nur aufrufen, wenn keine Tasten gedrückt sind.
Es gibt für TShiftstate jede Menge Angaben zB ssCtrl, ssShift usw.. Ich finde aber nichts was einer nicht gedrückten Taste entspricht ssNonund 0 habe ich schon ausprobiert.
Wo bekomme ich denn die Liste der möglichen Werte her?

Gruß Fritz
Zuletzt geändert von haderlump am Fr 29. Mär 2019, 19:18, insgesamt 1-mal geändert.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: shiftstate

Beitrag von MacWomble »

Ich verstehe nicht ganz, was du da vor hast. 'Keine Taste gedrückt' ist kein Event und sollte somit auch nichts auslösen können. :shock:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: shiftstate

Beitrag von wp_xyz »

haderlump hat geschrieben:Es gibt für TShiftstate jede Menge Angaben zB ssCtrl, ssShift usw.. [...] Wo bekomme ich denn die Liste der möglichen Werte her?

Wenn du in deinem Quelltext irgendwo das Wort "TShiftState" stehen hast, klicke mit gedrückter CTRL-Taste drauf, Lazarus öffnet die Unit, in der TShiftState definiert ist, und du findest in "classes":

Code: Alles auswählen

type
{ Types used by standard events }
  TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
    ssLeft, ssRight, ssMiddle, ssDouble,
    // Extra additions
    ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
    ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2);
 
{$packset 1}
  TShiftState = set of TShiftStateEnum;
{$packset default}

Da der Typ "TShiftState" eine Pascal-Menge ist ("set of TShiftStateEnum"), entspricht der Fall "Keine Taste gedrückt" einfach der leeren Menge:

Code: Alles auswählen

var
  shift: TShiftState;
...
  if shift = [] then ShowMessage('Keine Sondertaste gedrückt');

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: shiftstate

Beitrag von Ally »

Hallo haderlump,

folgendes könnte sein was du suchst. (ungetestet)
FormKeyDown und FormKeyUp sollten auf alle Tasten reagieren, also nicht nur auf Shift, Strg, Alt usw. sondern auch auf Ziffern, Buchstaben usw.

Code: Alles auswählen

var
  TasteGedrueckt: Boolean;
 
TasteGedrueckt := False;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  TasteGedrueckt := True;
end;
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  TasteGedrueckt := False;
end;
 
 
if not TasteGedrueckt then
  .......
  ....


Eventuell noch KeyPreview auf True setzen.

Gruß Roland

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: shiftstate [gelöst]

Beitrag von haderlump »

Danke wp_xyz das mit

Code: Alles auswählen

if shift = [] then
ist genau das was ich gesucht habe.

Ich hätte das Problem auch irgendwie anders lösen können, es geht mir aber auch einfach um das Verständnis der Materie.
Ich sag es immer wieder "hier werden sie geholfen !" Danke!!!!!!!!

Gruß Fritz

P.S. MacWombel.
Der Hintergrund. Ein Programm zur Steuerung einer Modelleisenbahn.
Kernstück ist ein Bild mit dem Gleisplan. Im Hintergrund gibt es ein Array, in dem Die Koordinaten der einzelnen Gleiselemente abgelegt sind. Ich klicke also z.B eine Weiche an, und bekomme Einen Pointer der auf den Datensatzt z,B, dieser Weiche zeigt.
Über dasHauptmMenü wird eine Steuerzahz festgelegt, die bestimmt, wie das Gleiselement zu behandeln ist. So gibt es z.B. die Steuerzahl 19. Diese bestimmt, dass das Element gesperrt oder entsperrt werden soll (z,B wegen Schaden nicht befahrbar.)
Wenn ich aber die Crtl Taste drücke, soll das Element nicht die übliche Behandlung erfahren, sondern es öffnet sich ein Fenster, das den ganzen Datensatz anzeigt.
und hier kommt mein (gelöstes) Problem ind Spiel. Nur wenn keine Sondertaste gedrückt ist soll die ursprüngliche Funktion(hier sperren) ausgeführt werden.
Gruß Fritz

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: shiftstate [gelöst]

Beitrag von MacWomble »

OK, das hatte ich anders interpretiert. :oops:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: shiftstate [gelöst]

Beitrag von Ally »

Ja, ich hatte das auch anders interpretiert.
Du hast ja geschrieben:
Ich möchte eine procedure aber nur aufrufen, wenn keine Tasten gedrückt sind.


Aber egal, Hauptsache das Problem ist gelöst. :)

Gruß Roland

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: shiftstate [gelöst]

Beitrag von haderlump »

Ich konnte nun durch das neu erworbene Wissen gleich ein paar andere Probleme auf elegante Weise lösen. Es ist so schön immer wieder was dazu zu lernen.

Antworten