Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tastenbestätigung in Delphi (https://www.delphipraxis.net/151358-tastenbestaetigung-delphi.html)

TucTuc 14. Mai 2010 13:51


Tastenbestätigung in Delphi
 
Ich möchte gerne z.B. die "Caption" eines Labels mit einem druck einer voher festgelegten Taste änder müssen.

Also im Prinzip if a gedrückt then caption.label1 := 'tasta a wurde gedrückt'.

Letztendlich soll jedem Tastendruck auch ein Wert zugewiesen werden können.
Soll heißen wenn ich die Taste a Drücke soll das Programm eine Variable z.B. den Wert 20 zuweisen.

If a gedrückt then f:= 20.


Ich habe auch eine Liste gefunden in der die einzelnen Tastenbenennungen aufgeführt sind zum Beispiel für Pfeil auf vk_up. Aber leider weiß ich nicht wie ich dies verwenden kann.

Ich würde mich freuen wenn ihr mir weiterhelfen könntet.

MfG

TucTuc

rollstuhlfahrer 14. Mai 2010 13:57

Re: Tastenbestätigung in Delphi
 
also, da gibt es mehrere Möglichkeiten. Ich empfehle die Ereignisbasierte. Du setzt bei deiner Form KeyPreview auf TRUE. Dann nimmst du das Ereignis OnKeyDown (falls irgendetwas nicht stimmt, ist es OnKeyPressed). Hier bekommst du mitgeteilt, welche Taste gedrückt wurde.
Mit Hilfe von den Keycodes (VK_*) kannst du dann ermitteln, welche Taste gedrückt wurde und dann das entsprechende ausführen. Für Buchstaben sind es Ord('A') bis Ord('Z') (<-- NUR GRO?BUCHSTABEN) und für Zahlen sind es Ord('0') bis Ord('9'). Für alle anderen Tasten sind in der Unit Windows entsprechende Konstanten, die alle mit VK_ beginnen definiert.

Bernhard

Wolfgang Mix 14. Mai 2010 14:05

Re: Tastenbestätigung in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei die restlichen Tastaturcodes

TucTuc 14. Mai 2010 15:49

Re: Tastenbestätigung in Delphi
 
Schon mal vielen Dank für die Antworten aber wie deklariere ich den Bezeichner keypreview ist doch schließlich keine Variable?!

Könntet ihr mir ein Quellcode Beispiel geben?

Grüße

TucTuc

Kurt56 14. Mai 2010 15:54

Re: Tastenbestätigung in Delphi
 
Wenn du in der FORM die Einstellung=Eigenschaft "Keypreview" auf "true" gestellt hast,
kannst du das Ereignis "OnKeyPress" abfragen.

Dort ist der Tastencode, welcher gedrückt wurde.

(Mit dieser Prozedur kannst du die ENTER-Taste abfragen, um zum nächsten Feld zu springen)



Delphi-Quellcode:
procedure TMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
   begin
   if not(ActiveControl is TButton) and
      not(ActiveControl is TMemo) and
      not(ActiveControl is Tdbgrid) and
      not(ActiveControl is Tdbcheckbox) and
      not(ActiveControl is TdbMemo) then
        begin
        Key:=#0;
        Perform(WM_NextDlgCtl,0,0);
        end;
     {#8 : begin
        Key:=#0;
        Perform(WM_NextDlgCtl,1,0);
        end;}
   end;
end;
Die Entertaste =#13 springt zum nächsten Feld.
Die Rücktaste =#8 springt auf das vorherige Feld, ist aber im Beispiel auskommentiert

TucTuc 14. Mai 2010 16:59

Re: Tastenbestätigung in Delphi
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure Label2Click(Sender: TObject);
    procedure Label1Caption;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1; Taste: Word;

implementation

procedure Label1Caption;
begin
keypreview:=true;

if (Word = ord ('A')) then label1.caption := ('Taste A wurde gedrückt');
if (Word = ord ('B')) then label1.caption := ('Taste B wurde gedrückt');


end;


end.
{Fehler:

Nicht deklariete Bezeichner:

-keypreview
-label1
-caption }
[b]So hatte ich mir das eigentlich ungefähr gedacht aber warum funktioniert das nicht?

Grüße

TucTuc

[Edit=Matze][delphi]-Tags geschlossen. MfG Matze[/edit]

DeddyH 14. Mai 2010 17:04

Re: Tastenbestätigung in Delphi
 
:shock: sry, aber da ist ja fast alles falsch. Nochmal: setze im Objektinspektor die Eigenschaft KeyPreview Deines Formulars auf true. Wechsle dann auf den Reiter "Ereignisse" und mache einen Doppelklick neben "OnKeyPress". In den automatisch generierten Codeblock trägst Du dann den Code von Kurt56 ein.

rollstuhlfahrer 14. Mai 2010 18:36

Re: Tastenbestätigung in Delphi
 
Ich bin gerade etwas sozial, also habe ich dir deinen Code mal etwas angepasst.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure Label2Click(Sender: TObject);
    procedure Form1OnKeyPress(Sender: TObject; *: Word); // Diese Zeile wird von Delphi automatisch generiert: OI -> Form1 -> Ereignisse -> OnKeyPress -> Doppelklick daneben, wie für alle anderen Ereignisse.
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1; // Taste muss keine globals Variable sein. Das Ereignis gibt dir ja immer die Taste.

implementation

procedure TForm1.Label2Click(Sender: TObject)
begin
// k.A. was hier hin kommt. Deine Sache
end;

procedure TForm1.Form1OnKeyPress(Sender: TObject, var Key: Word); // Diese Zeile erzeugt Delphi übrigens auch automatisch
begin
  if (Key = ord ('A')) then label1.caption := ('Taste A wurde gedrückt');
  if (Key = ord ('B')) then label1.caption := ('Taste B wurde gedrückt');
end;

end.
Das mit dem KeyPreview scheinst du etwas falsch verstanden zu haben. OI -> Form -> Eigenschaften -> KeyPreview und dann die Combobox daneben auf TRUE stellen.

Bernhard

TucTuc 14. Mai 2010 19:23

Re: Tastenbestätigung in Delphi
 
Vielen Dank euch allen, muss das wenn ich morgen wieder Daheim bin testen. Und ich wusste nicht das man auch daneben Doppelklicken kann, wenn man draufklickt bekommt ja "Onclick" sprich die Aktion wird nur beim draufklicken ausgeführt, deshalb hatte ich das kompliziert. Man kann immer alles so einfach haben :wall:

Grüße

TucTuc

TucTuc 15. Mai 2010 16:59

Re: Tastenbestätigung in Delphi
 
Delphi-Quellcode:
unit Tastendruck_Testprogramm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure Form1OnKeyPress(Sender: TObject; var Key: Word);
    procedure Label2Click(Sender: TObject);
    procedure A(Sender: TObject; var Key: Char); // Diese Zeile wird von Delphi automatisch generiert: OI -> Form1 -> Ereignisse -> OnKeyPress -> Doppelklick daneben, wie für alle anderen Ereignisse.
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1; // Taste muss keine globals Variable sein. Das Ereignis gibt dir ja immer die Taste.

implementation

{$R *.DFM}


procedure TForm1.A(Sender: TObject; var Key: Char);
begin
label1.Caption := 'A was pressed';
end;

procedure TForm1.Form1OnKeyPress(Sender: TObject; var Key: Word); // Diese Zeile erzeugt Delphi übrigens auch automatisch
begin
  label1.caption := 'nichts';
  if (Key = ord ('A')) then label1.caption := ('Taste A wurde gedrückt');
  if (Key = ord ('B')) then label1.caption := ('Taste B wurde gedrückt') else label1.caption := ('Keine Taste gedrückt');
  if (Key = vk_up) then label1.caption := ('Taste pfeil hoch wurde gedrückt');
 
end;

procedure TForm1.Label2Click(Sender: TObject);
begin
label1.Caption := 'label2press';
end;

end.
Also wenn ich auf Label 2 klicke wird in Label 1 "label2pressed" angezeigt, wenn ich A drücke wird "A was pressed" angezeigt, die OnKeyPressed Procedure funktioniert allerdings nicht.
Jetzt bin ich absolut ratlos... :gruebel:
liegt das an der Win32 Anwendung von Delphi 2007 oder woran liegt das nun :'-(

[Edit=Matze][delphi]-Tags geschlossen. MfG Matze[/edit]

PhilmacFLy 15. Mai 2010 17:35

Re: Tastenbestätigung in Delphi
 
also das wenn du label 2 klickst das im label 1 angezeigt wird ist ganz klar das du label1.Caption zugewiesen hast nicht label2.caption und wenn du die procedure TForm1.A löscht sollte alles wie geplant gehen.

rollstuhlfahrer 15. Mai 2010 17:54

Re: Tastenbestätigung in Delphi
 
Punkt 1: Die Delphi-Tags kann man auch schließen. Dann wirds lesbarer.
Punkt 2: label1.caption := 'nichts'; <-- Diese Zeile ist sinnlos. Sie wird ja direkt danach wieder überschrieben. Delphi arbeitet nicht nach der Mache: Ich drücke eine Taste und im Quellcode springt Delphi an die richtige Stelle. Nein, du musst Delphi sagen, was die richtige Stelle ist und Delphi beherrscht glücklicherweise nur eine Ausführrichtung von OBEN NACH UNTEN.

Bernhard

Kurt56 15. Mai 2010 21:06

Re: Tastenbestätigung in Delphi
 
Also noch einmal:

Erstelle eine neue Anwendung mit einer FORM.
Plaziere auf diese Form ein Objekt vom Typ TEDIT <--also ein EINGABEFELD
Plaziere dann ein Feld vom Typ TLABEL <--also ein Anzeigefeld

Ändere die Eigenschaft von FORM1 -- Keypreview von false(Standard) auf true

wechsel auf die Ereignisse von Form1 und mache bei OnKeyPress einen Doppelklick.

Trage dort den folgenden Code ein:
Delphi-Quellcode:
if key = char('A') then label1.Caption:= 'Taste A gedrückt';
if key = char('B') then label1.Caption:= 'Taste B gedrückt';


------------------------------------
Der vollständige Code zu deinem Programm sieht nun so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = char('A') then label1.Caption:= 'Taste A gedrückt';
if key = char('B') then label1.Caption:= 'Taste B gedrückt';

end;

end.
------------------------- Starte das Programm----------------
Der Focus(Cursor) ist im Eingabefeld (Edit1)
-wenn du ein "A" eintippst, dann steht im Anzeigefeld (TLabel1) der Satz: 'Taste A gedrückt'
-wenn du ein "B" eintippst, dann steht im Anzeigefeld (TLabel1) der Satz: 'Taste B gedrückt'
doch wenn du eine andere Taste drückst, dann passiert NICHTS.

============= Zusatz=============
Wenn du auf das Eingabefeld drückst, so erscheinen im Objektinspektor die Eigenschaften/Ereignisse des Feldes EDIT1
Mache einen Doppelklick auf die Eigenschaft OnKeyPress des OBJEKTES EDIT1 und schreibe dort den Code
Delphi-Quellcode:
if not (key in [#65..#67,#8]) then
   begin
   key := #0;
   beep();
   end;
Starte das Programm.
Du wirst jetzt dsehen, dass du nur noch die Buchstaben "A", "B" und "C", sowie die Rücktaste eingeben kannst.
Bei allen anderen Zeichen erhältst Du einen Piepton, aber es erscheint NICHTS im Eingabefeld.

So kannst Du die Zeichen begrenzen, die eingegeben werden können.

Und nun viel Spaß beim Testen

TucTuc 16. Mai 2010 11:08

Re: Tastenbestätigung in Delphi
 
Also erstmal ein paar misverständnisse mit den labelanzeigen hatte ich mir schon so gedacht mit dem klicken und on key press zum testen
ich wollte das gerne ohne editfeld haben da lag mein problem wenn ich das über on key press mache geht das ohne editfeld aber ich scheine lediglicjh eine taste belegen zu können...
Ich möchte eifach das wenn ich eine taste drücke ein paar variablen werte geändert werden und dies in den labeln angezeigt wird...
ich wollte dasa mit tasten machen weil ich zu faul war eine microcontroller zu nehmen der dann die werte ausgibt...
also hab ich das funkmodul aus einer tastatur genommen und das in meine auswerte elektronik eingebaut...
jetzt bekomme ich für die gemessenen werte buchstaben...
und diese soll das delphi programm wieder in messwerte umwandeln und die gemessenen werte in labeln anzeigen

deshalb hätte ich das gerne wie das onkeypressevent also geht das gar nicht anders?
[quote]
also das wenn du label 2 klickst das im label 1 angezeigt wird ist ganz klar das du label1.Caption zugewiesen hast nicht label2.caption und wenn du die procedure TForm1.A löscht sollte alles wie geplant gehen.

das soll auch so

und die zuweisung in der key press prozedur die ja normalerweise direkt überschrieben wird sollte sein um zu testen ob die pocedure überhaupt ausgeführt wird...

hoffe ihr versteht jetzt was ich vorhabe und ja ich weiß warum nicht gleich so :wall:

grüße

tuctuc

Kurt56 16. Mai 2010 14:46

Re: Tastenbestätigung in Delphi
 
Mache ein MENÜ und belege die Menüpunkte mit dem Shortcut des Buchstabens, den Du ausgelesen bekommst.
Dann brauchst Du kein Editfeld.

TucTuc 23. Jun 2010 13:03

AW: Tastenbestätigung in Delphi
 
So es funktioniert ich war nur zu doof bzw. zu schwer von kapische...
Wie auch immer nocheinmal zusammengefasst für all die aderen die was ähnliches versuchen:

-Ziel war eine "Unsichtbare Tastenabfrage"

-Man klickt auf das Formular, so das es den Fokus hat
links im Objektinspektor müssten nun die Eigenschaften von TForm1 oder wie ihr es auch immer genannt habt stehen
=> dort klickt ihr auf Ereignisse/Aktions je nach Delphiversion und scrollt ein Stück herunter:

Dort findet ihr:

OnKeyDown Taste := wurde runter gedrückt
OnKeyPress Taste := wird gedrückt gehalten
OnKeyUP Taste := wird losgelassen

OnKeyPress hat als Wertebereich lediglich ein paar Asci-codes und unterscheidet dementsprechen auch nicht das Num_Pad von den Zahlen über den Buchstaben für meine Zwecke zu wenig verschiedene Tasten...

OnKeyUp und Down haben den selben Wertebereich und können im Prinzip jede Taste der Tastatur unterscheiden

einfach neben eins der 3 Events doppelklicken und es wird automatisch eine Prozedur in der Unit erstellt und nun könnt ihr mit den Tastencodes aus der Hilfe spieln

kleiner Auszug:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
      turnscore := 0;
//Inner-Bull Ring1:
      if key = vk_end then label1.caption := 'end';
      if key = vk_delete then turnscore := 50;
//Outer-Bull Ring2:
      if key = vk_delete then turnscore := 25;
//innen-einfach Ring3:
      if key = vk_delete then turnscore := 1;
      if key = vk_delete then turnscore := 2;
      if key = vk_delete then turnscore := 3;
      if key = vk_delete then turnscore := 4;
      if key = vk_delete then turnscore := 5;
      if key = vk_delete then turnscore := 6;
      if key = vk_delete then turnscore := 7;
      if key = vk_delete then turnscore := 8;
      if key = vk_delete then turnscore := 9;
      if key = vk_delete then turnscore := 10;
      if key = vk_delete then turnscore := 11;
      if key = vk_delete then turnscore := 12;
      if key = vk_delete then turnscore := 13;
      if key = vk_delete then turnscore := 14;
      if key = vk_delete then turnscore := 15;
      if key = vk_delete then turnscore := 16;
      if key = vk_delete then turnscore := 17;
      if key = vk_delete then turnscore := 18;
      if key = vk_delete then turnscore := 19;
      if key = vk_delete then turnscore := 20;

wen wundert was das sein soll nach dem ich bei meinem letzten projekt 3 pics zerschossen habe habe ich mir überlegt das Funkmodul einer kaputten logitechtastatur zu missbrauchen meiner meinung nach einfach wie genial jeder ausgelesene wert wird zu einem buchstaben oder buchstabensalat und kann dann zurückübersetzt werden und das auch noch kabellos...

viel spaß damit hoffe ist ne anregung für andere

viele grüße

TucTuc

PS: ja ich weiss groß kleinschreibung und rechtschreibung aber das wir überbewertet;-)

SirThornberry 23. Jun 2010 17:45

AW: Tastenbestätigung in Delphi
 
Zitat:

wen wundert was das sein soll nach dem ich bei meinem letzten projekt 3 pics zerschossen habe habe ich mir überlegt das Funkmodul einer kaputten logitechtastatur zu missbrauchen meiner meinung nach einfach wie genial jeder ausgelesene wert wird zu einem buchstaben oder buchstabensalat und kann dann zurückübersetzt werden und das auch noch kabellos...
Irgendwie verstehe ich genau NICHTS von dem Satz der scheinbar nicht mal ein Satz ist.

Warum verwendest du in deinem Quelltext nicht
Delphi-Quellcode:
begin
  [...]
end;
?

Matze 23. Jun 2010 17:51

AW: Tastenbestätigung in Delphi
 
Kompiliert dieser Code fehlerfrei?

Konstrukte wie dieses
Delphi-Quellcode:
if key = vk_delete then turnscore := 50 and ring := 1;
habe ich noch nie gesehen.

Oder meinst du

Delphi-Quellcode:
if key = vk_delete then
begin
  turnscore := 50;
  ring := 1;
end;
Wobei dein ganzer Code chaotisch aussieht und für mich überhaupt keinen Sinn ergibt.

rollstuhlfahrer 23. Jun 2010 17:52

AW: Tastenbestätigung in Delphi
 
Zitat:

Zitat von TucTuc (Beitrag 1031056)
Delphi-Quellcode:
if key = vk_delete then turnscore := 2 and ring := 3;

Also wenn du da keinen Syntaxfehler bekommst, glaub ich, dass deine Syntaxprüfung irgendwie defekt ist. Der Compiler müsste hier mecjern, weil er ein ":=" statt einem ";" gefunden hat. Er führt nämlich nicht bei Anweisung1 and Anweisung2 beide Anweisungen aus, sondern der Zahlenprüfer springt ein und erkennt ein
Delphi-Quellcode:
turnscore := 2 and ring
mit unbestimmtem Ergebnis. Dann kommt der Compiler an die stelle mit dem := 3; und wird meckern.
Wie also mein Vorredner schon gesagt hat: Um begin[...]end wirst du nicht drum rum kommen.

Bernhard

TucTuc 23. Jun 2010 20:47

AW: Tastenbestätigung in Delphi
 
man seid ihr kritisch sollte lediglich ne erklärung sein was ich mit meinem programm bezwecke
ja und ihr habt recht das mit then...and...; hab ich auch festgestellt
verzweifle gerade an der lösung möchte nocht jedes mal begin...end
hat da wer ne ahnung?
Zitat:

wen wundert was das sein soll nach dem ich bei meinem letzten projekt 3 pics zerschossen habe habe ich mir überlegt das Funkmodul einer kaputten logitechtastatur zu missbrauchen meiner meinung nach einfach wie genial jeder ausgelesene wert wird zu einem buchstaben oder buchstabensalat und kann dann zurückübersetzt werden und das auch noch kabellos...
so für unsere syntax liebhaber: ( :P )
also das sollte ja wie gesagt den zweck des programms erklären:
ich habe schlechte erfahrungen mit dem programieren von pics gemacht
also habe ich ein logitech funkmodul aus einer alten tastatur ausgebaut
meine auswerte einheit daran angeschlossen und bekomme jetzt die jeweiligen 1/0 werte jedes kanals als buchstaben
den buchstaben ordne ich dann den punktwert und die ringordnung zu
ich lese damit eine elektrische dartscheibe aus

=> ich hoffe ich habe alle klarheiten beseitigt

TucTuc 24. Jun 2010 19:23

AW: Tastenbestätigung in Delphi
 
nun der fuktionierende code:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
      turnscore := 0;
      ring := 0;
//Inner-Bull Ring1:
      if key = 112 then
      begin
        turnscore := 50 ; ring := 1;
      end;
//Outer-Bull Ring2:
      if key = 113 then
      begin
         turnscore := 25 ; ring := 2;
      end;
//innen-einfach Ring3:
      if key = 114 then
      begin
      turnscore := 1 ; ring := 3;
      end;
      if key = 115 then
      begin
      turnscore := 2 ; ring := 3;
      end;
      if key = 116 then
      begin
      turnscore := 3 ; ring := 3;
      end;
      if key = 117 then
      begin
      turnscore := 4 ; ring := 3;
      end;
      if key = 118 then
      begin
      turnscore := 5 ; ring := 3;
      end;
      if key = 119 then
      begin
      turnscore := 6 ; ring := 3;
      end;
      if key = 120 then
      begin
      turnscore := 7 ; ring := 3;
      end;
      if key = 121 then
      begin
      turnscore := 8 ; ring := 3;
      end;
      if key = vk_F11 then
      begin
      turnscore := 9 ; ring := 3;
      end;
      if key = vk_F12 then
      begin
      turnscore := 10 ; ring := 3;
      end;
      if key = 220 then
      begin
      turnscore := 11 ; ring := 3;
      end;
      if key = 49 then
      begin
      turnscore := 12 ; ring := 3;
      end;
      if key = 50 then
      begin
      turnscore := 13 ; ring := 3;
      end;
      if key = 51 then
      begin
      turnscore := 14 ; ring := 3;
      end;
      if key = 52 then
      begin
      turnscore := 15 ; ring := 3;
      end;
      if key = 53 then
      begin
      turnscore := 16 ; ring := 3;
      end;
      if key = 54 then
      begin
      turnscore := 17 ; ring := 3;
      end;
      if key = 55 then
      begin
      turnscore := 18 ; ring := 3;
      end;
      if key = 56 then
      begin
      turnscore := 19 ; ring := 3;
      end;
      if key = 57 then
      begin
      turnscore := 20 ; ring := 3;
      end;
//dreifach Ring4:
      if key = 48 then
      begin
      turnscore := 1 ; ring := 4;
      end;
      if key = 219 then
      begin
      turnscore := 2 ; ring := 4;
      end;
      if key = 221 then
      begin
      turnscore := 3 ; ring := 4;
      end;
      if key = 8 then
      begin
      turnscore := 4 ; ring := 4;
      end;
      if key = 45 then
      begin
      turnscore := 5 ; ring := 4;
      end;
      if key = 36 then
      begin
      turnscore := 6 ; ring := 4;
      end;
      if key = 33 then
      begin
      turnscore := 7 ; ring := 4;
      end;
      if key = 111 then
      begin
      turnscore := 8 ; ring := 4;
      end;
      if key = 106 then
      begin
      turnscore := 9 ; ring := 4;
      end;
      if key = 109 then
      begin
      turnscore := 10 ; ring := 4;
      end;
      if key = 81 then
      begin
      turnscore := 11 ; ring := 4;
      end;
      if key = 87 then
      begin
      turnscore := 12 ; ring := 4;
      end;
      if key = 69 then
      begin
      turnscore := 13 ; ring := 4;
      end;
      if key = 82 then
      begin
      turnscore := 14 ; ring := 4;
      end;
      if key = 84 then
      begin
      turnscore := 15 ; ring := 4;
      end;
      if key = 90 then
      begin
      turnscore := 16 ; ring := 4;
      end;
      if key = 85 then
      begin
      turnscore := 17 ; ring := 4;
      end;
      if key = 73 then
      begin
      turnscore := 18 ; ring := 4;
      end;
      if key = 79 then
      begin
      turnscore := 19 ; ring := 4;
      end;
      if key = 80 then
      begin
      turnscore := 20 ; ring := 4;
      end;
//außen-einfach Ring5:
      if key = 186 then
      begin
      turnscore := 1 ; ring := 5;
      end;
      if key = 187 then
      begin
      turnscore := 2 ; ring := 5;
      end;
      if key = 46 then
      begin
      turnscore := 3 ; ring := 5;
      end;
      if key = 35 then
      begin
      turnscore := 4 ; ring := 5;
      end;
      if key = 34 then
      begin
      turnscore := 5 ; ring := 5;
      end;
      if key = 36 then
      begin
      turnscore := 6 ; ring := 5;
      end;
      if key = 38 then
      begin
      turnscore := 7 ; ring := 5;
      end;
      if key = 33 then
      begin
      turnscore := 8 ; ring := 5;
      end;
      if key = 107 then
      begin
      turnscore := 9 ; ring := 5;
      end;
      if key = 65 then
      begin
      turnscore := 10 ; ring := 5;
      end;
      if key = 83 then
      begin
      turnscore := 11 ; ring := 5;
      end;
      if key = 68 then
      begin
      turnscore := 12 ; ring := 5;
      end;
      if key = 70 then
      begin
      turnscore := 13 ; ring := 5;
      end;
      if key = 71 then
      begin
      turnscore := 14 ; ring := 5;
      end;
      if key = 72 then
      begin
      turnscore := 15 ; ring := 5;
      end;
      if key = 74 then
      begin
      turnscore := 16 ; ring := 5;
      end;
      if key = 75 then
      begin
      turnscore := 17 ; ring := 5;
      end;
      if key = 76 then
      begin
      turnscore := 18 ; ring := 5;
      end;
      if key = 192 then
      begin
      turnscore := 19 ; ring := 5;
      end;
      if key = 222 then
      begin
      turnscore := 20 ; ring := 5;
      end;
//doppel Ring6:
      if key = 191 then
      begin
      turnscore := 1 ; ring := 6;
      end;
      if key = 37 then
      begin
      turnscore := 2 ; ring := 6;
      end;
      if key = 12 then
      begin
      turnscore := 3 ; ring := 6;
      end;
      if key = 39 then
      begin
      turnscore := 4 ; ring := 6;
      end;
      if key = 226 then
      begin
      turnscore := 5 ; ring := 6;
      end;
      if key = 89 then
      begin
      turnscore := 6 ; ring := 6;
      end;
      if key = 88 then
      begin
      turnscore := 7 ; ring := 6;
      end;
      if key = 67 then
      begin
      turnscore := 8 ; ring := 6;
      end;
      if key = 86 then
      begin
      turnscore := 9 ; ring := 6;
      end;
      if key = 66 then
      begin
      turnscore := 10 ; ring := 6;
      end;
      if key = 78 then
      begin
      turnscore := 11 ; ring := 6;
      end;
      if key = 77 then
      begin
      turnscore := 12 ; ring := 6;
      end;
      if key = 188 then
      begin
      turnscore := 13 ; ring := 6;
      end;
      if key = 190 then
      begin
      turnscore := 14 ; ring := 6;
      end;
      if key = 189 then
      begin
      turnscore := 15 ; ring := 6;
      end;
      if key = 35 then
      begin
      turnscore := 16 ; ring := 6;
      end;
      if key = 40 then
      begin
      turnscore := 17 ; ring := 6;
      end;
      if key = 34 then
      begin
      turnscore := 18 ; ring := 6;
      end;
      if key = 96 then
      begin
      turnscore := 19 ; ring := 6;
      end;
      if key = 110 then
      begin
      turnscore := 20 ; ring := 6;
      end;

    begin
          if turnscore > 0 then label1.Caption := FloatTostr(turnscore);
          if ring     > 0 then label2.Caption := FloatTostr(ring);
         
    end;
end;
nun ein neues Problem:

ich habe festgestellt das numlock aktiviert sein muss um die numlock tasten benutzen zu können
ja ich weiss wer hätte es gedacht aber gibt es einen weg die numlocktasten dauerhaft zu aktivieren?

TucTuc 24. Jun 2010 19:29

AW: Tastenbestätigung in Delphi
 
hab das problem schon selbst gelöst:

taste tastenadresse Sodertastenadresse
num1 35 VK_NUMPAD1
num2 40 VK_NUMPAD2
num3 34 VK_NUMPAD3
num 0 96 VK_NUMPAD0
num, 110 VK_DECIMAL

die abfragen mit vk_ wie vk_esc oder eben vk_numpad1 werden offensichtlich direkt unabhängig von shift, numlock... abgefragt

die komplette tabelle für mein programm:

Wert Zeichen Code alternative
Mitte
50 F1 112 VK_F1
Ring
25 F2 113 VK_F2
Einzel-Innen
1 F3 114 VK_F3
2 F4 115 VK_F4
3 F5 116 VK_F5
4 F6 117 VK_F6
5 F7 118 VK_F7
6 F8 119 VK_F8
7 F9 120 VK_F9
8 F10 121 VK_F10
9 F11 VK_F11
10 F12 VK_F12
11 ^ 220
12 1 49
13 2 50
14 3 51
15 4 52
16 5 53
17 6 54
18 7 55
19 8 56
20 9 57
Trippel
2 0 48
4 ß 219
6 ´ 221
8 löschen 8 VK_CLEAR
10 einfg 45 VK_INSERT
12 pos1 36 VK_HOME
14 bild auf 33 VK_PRIOR
16 num/ 111 VK_DIVIDE
18 num* 106 VK_MULTIPLY
20 num- 109 VK_SUBTRACT
22 q 81
24 w 87
26 e 69
28 r 82
30 t 84
32 z 90
34 u 85
36 i 73
38 o 79
40 p 80
Einzel-Außen
1 ü 186
2 + 187
3 entf 46 VK_DELETE
4 ende 35 VK_END Taste
5 bild ab 34 VK_NEXT
6 num7 36 VK_NUMPAD7
7 num8 38 VK_NUMPAD8
8 num9 33 VK_NUMPAD9
9 num+ 107 VK_ADD
10 a 65
11 s 83
12 d 68
13 f 70
14 g 71
15 h 72
16 j 74
17 k 75
18 l 76
19 ö 192
20 ä 222
Doppel
3 # 191
6 num4 37 VK_NUMPAD4
9 num5 12 VK_NUMPAD5
12 num6 39 VK_NUMPAD6
15 < 226
18 y 89
21 x 88
24 c 67
27 v 86
30 b 66
33 n 78
36 m 77
39 , 188
42 . 190
45 - 189
48 num1 35 VK_NUMPAD1
51 num2 40 VK_NUMPAD2
54 num3 34 VK_NUMPAD3
57 num 0 96 VK_NUMPAD0
60 num, 110 VK_DECIMAL

fail enter 13 VK_RETURN
Abbrechen ESC 27 VK_ESCAPE
Pause Pause 19 VK_PAUSE
fail leer 32

muss das jetzt mal alles im quellcode änder ärgerlich hab extra über showkey alle ausgelesen...

ich weiss unübersichtlich wenn ichs einfüge sieht es noch wie ne tabelle aus wenn ich auf speichern klicke...

rollstuhlfahrer 24. Jun 2010 19:31

AW: Tastenbestätigung in Delphi
 
hier kannst du den Numlock anschalten: http://www.delphi-treff.de/tipps/sys...eds-ansteuern/

Bernhard

TucTuc 24. Jun 2010 20:11

AW: Tastenbestätigung in Delphi
 
num 8, 4, 5, 6, 2 funktionieren trotzdem nicht
irgentwer ne ahnung ich verzweifle...

rollstuhlfahrer 24. Jun 2010 20:15

AW: Tastenbestätigung in Delphi
 
dann guck nochmal von Hand, aber wenn NumLock an ist und du die Tasten drückst, sollte das funktionieren, es sei denn die Tastatur geht nicht.

Bernhard

PS: Ansonsten schau dir einfach mit ShowMessage(IntToStr(xxx)) den Wert an, den du bekommst und vergleiche den händisch mit den Konstanten. Dann siehst du ja, welche dazu passt.

PPS: Du brauchst hier auch nicht alle Virtual Keys aufzuzählen. Die gibts als Konstanten in Delphi und die kann man bei MS auch nachlesen.

mkinzler 24. Jun 2010 20:31

AW: Tastenbestätigung in Delphi
 
Zudem würde sich eine case-Anweisung anbieten

TucTuc 24. Jun 2010 20:38

AW: Tastenbestätigung in Delphi
 
warum ist in case of besser?
würde das programm auch nicht kürzer machen?
und if in einer repeatschleife erschien mir einfacher...

mkinzler 24. Jun 2010 20:40

AW: Tastenbestätigung in Delphi
 
Statt
Delphi-Quellcode:
...
      if key = 191 then
      begin
      turnscore := 1 ; ring := 6;
      end;
      if key = 37 then
      begin
...
sollte man besser eine Case nehmen oder?

rollstuhlfahrer 24. Jun 2010 20:43

AW: Tastenbestätigung in Delphi
 
Wie willst du denn das mit einer Repeat-Schleife realisieren? - Das geht doch rein konzeptionell gar nicht.
Zu der Case-Struktur: Sie macht den Code weitaus besser lesbar und sorgt auch dafür, dass das Programm schneller läuft. Intern arbeitet ein Case als Assembler schneller als tausende von IFs. Sieht dann so aus:
Delphi-Quellcode:
case key of
  VK_RETURN: DoReturn;
  VK_NUMPAD1: begin Ring := 1; Turnscore := 2; end;
  VK_NUMPAD2: begin Ring := 3; Turnscore := 4; end;
end;
Bernhard

TucTuc 24. Jun 2010 22:18

AW: Tastenbestätigung in Delphi
 
zum heulen wenn ich das in tabellenform gelassen hätte...
gut ihr habt recht wesentlich besser
letztendlich muss ja 3 mal abgefragt werden...
sind beim dart schließlich 3 würfe und dann muss die wertung der 3 würfe noch gespeichert werden und das pro spieler pro runde und pro spielvariante
hab schon nen kumpel gefragt wir treffen uns morgen zur "lagebesprechung" :D na mal sehn ob uns da was einfällt...
mit dem numlock ein-ausschalten muss ich auch nochmal testen...

mfg

TucTuc

TucTuc 24. Jun 2010 22:44

AW: Tastenbestätigung in Delphi
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1031440)
Sieht dann so aus:
Delphi-Quellcode:
case key of
  VK_RETURN: DoReturn;
  VK_NUMPAD1: begin Ring := 1; Turnscore := 2; end;
  VK_NUMPAD2: begin Ring := 3; Turnscore := 4; end;
end;
Bernhard

geht auch so oder? dann hätte ich es noch übersichtlicher:

Delphi-Quellcode:
case key of
      114: turnscore := 1 AND ring := 3;
      115: turnscore := 2 AND ring := 3;
      116: turnscore := 3 AND ring := 3;
      117: turnscore := 4 AND ring := 3;
      118: turnscore := 5 AND ring := 3;
      119: turnscore := 6 AND ring := 3;
      120: turnscore := 7 AND ring := 3;
      121: turnscore := 8 AND ring := 3;
      vk_F11: turnscore := 9 AND ring := 3;
      vk_F12: turnscore := 10 AND ring := 3;
      220: turnscore := 11 AND ring := 3;
      49 : turnscore := 12 AND ring := 3;
      50 : turnscore := 13 AND ring := 3;
      51 : turnscore := 14 AND ring := 3;
      52 : turnscore := 15 AND ring := 3;
      53 : turnscore := 16 AND ring := 3;
      54 : turnscore := 17 AND ring := 3;
      55 : turnscore := 18 AND ring := 3;
      56 : turnscore := 19 AND ring := 3;
      57 : turnscore := 20 AND ring := 3;
end;
was bezweck der befehl "DoReturn"?

Zitat:

Zitat von rollstuhlfahrer (Beitrag 1031440)
VK_RETURN: DoReturn;
Bernhard

Ich revidiere: mit AND funktioniert das nicht sieht schön aus läuft aber nicht => lässt sich nicht compilieren
ich weiss ich bin doof
oder auch: "denken - knopf drücken - sprechen"


nochwas soll ich den falschen code wieder löschen wer auch immer das vieleicht später liesst ist doch bestimmt total verwirrt?

TucTuc 24. Jun 2010 23:13

AW: Tastenbestätigung in Delphi
 
HAB NOCH EIN PROBLEM ENTDECKT:

vk_F11 und vk_F12 lassen sich nicht benutzen
wenn das programm läuft wird ein "thread-ende" fehler angezeigt

wenn ich die F10-Taste drücke ließt er sie zwar aus zeigt in den labeln die richtigen werte aber die f10-taste beendet die eingabe bzw. den fokus auf das programm wenn ich mit der maus draufklicke und somit der fokus wieder auf dem program liegt läuft es wieder...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz