shiftstate [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

shiftstate [gelöst]

Beitragvon haderlump » 29. Mär 2019, 03:29 shiftstate [gelöst]

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 29. Mär 2019, 19:18, insgesamt 1-mal geändert.
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon MacWomble » 29. Mär 2019, 07:14 Re: shiftstate

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.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon wp_xyz » 29. Mär 2019, 11:11 Re: shiftstate

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');
wp_xyz
 
Beiträge: 3085
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 29. Mär 2019, 11:55 Re: shiftstate

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
Ally
 
Beiträge: 142
Registriert: 11. Jun 2009, 08:25

Beitragvon haderlump » 29. Mär 2019, 19:17 Re: shiftstate [gelöst]

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
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon MacWomble » 30. Mär 2019, 08:23 Re: shiftstate [gelöst]

OK, das hatte ich anders interpretiert. :oops:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
Lazarusforum e. V.
 
Beiträge: 927
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19.2 Cinnamon / CodeTyphon 7.1 v. 18.02.2020/ FP 3.3.1 Rev 2002180516 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Ally » 30. Mär 2019, 09:32 Re: shiftstate [gelöst]

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
Ally
 
Beiträge: 142
Registriert: 11. Jun 2009, 08:25

Beitragvon haderlump » 31. Mär 2019, 21:10 Re: shiftstate [gelöst]

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.
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried