Entwickler-Ecke

Sonstiges (Delphi) - Virtual Key für "Eingabetaste" ???


cherry - Di 09.08.05 08:29
Titel: Virtual Key für "Eingabetaste" ???
Hi

Ein TEdit sollte auf das Tastenereignis Enter reagieren.
Ich habs mit dem KeyUp ereignis gemacht, aber kann mir
bitte jmd den Virtual Key der Enter Taste übermitteln?!

:evil: THX


Moderiert von user profile iconTino: Topic aus VCL (Visual Component Library) verschoben am Di 09.08.2005 um 11:03


WeBsPaCe - Di 09.08.05 08:31


Delphi-Quelltext
1:
VK_RETURN                    

:gruebel:


cherry - Di 09.08.05 08:38

super sexy..
danke...

jetzt gibt es aber immer wenn ich enter drücke so einen
beschissnen piepston, kann ich den irgendwie ausschalten? :roll:


WeBsPaCe - Di 09.08.05 08:41

user profile iconcherry hat folgendes geschrieben:
jetzt gibt es aber immer wenn ich enter drücke so einen
beschissnen piepston, kann ich den irgendwie ausschalten? :roll:

:lol: Öh... kA, der gehört normalerweise zu Windows dazu. Kommt aber nicht immer, wenn du den ENTER drückst, oder? Hängt von dem ab, was du machst; deshalb: was machst du denn genau in dem Code-Abschnitt?


cherry - Di 09.08.05 08:45

Ich gebe eine Zahl in das Edit Feld ein, um bei Enter springt das
Query zum gewünschten Datensatz..


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TFrameStammdaten.Edit4KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
 SQL1 : String;
begin
 If Key = vk_return  then // Gleich Enter oder Space
 begin
  try
   SQL1 :=  ' SELECT * FROM v_wp_wirtschaftsbetrieb'
    +' WHERE betr_ID = '
    +  Edit4.text
    +' ORDER BY betr_name';
   with Datamodule1.ADOQuery1_betr_view do
   begin
    close;
    SQL.Clear;
    SQL.Add(SQL1);
    open;
    Tag := 3;
   end;
  except
   MessageDlg('#Fehler 387!'+#13#10+#13#10+'Die angegebene ID existiert leider nicht (mehr)! '
           , mtError, [mbOk], 0);
  end;
 end;
end;


.. aber es ist mir allgemein aufgefallen, dass dieser Ton erscheint, wenn man in
einem Editfeld Enter drückt. Egal ob eine Funktion hinterlegt ist oder nicht.


WeBsPaCe - Di 09.08.05 08:48

Bist du dir sicher, dass der Piepser nicht von dem MessageDlg kommt? Ansonsten, wieso nimmst du KeyUp und nicht OnKeyPress? Das ist eher für sowas gedacht, wie du's vorhast. Probier's mal damit. ;)


cherry - Di 09.08.05 08:53

Da passiert genau dasselbe!
Und übrigens wird der MessageDlg nur ausgeführt bei einer Exception,
zum Beispiel wenn die ID nicht gefunden werden kann!

Danke trotzdem


WeBsPaCe - Di 09.08.05 09:00

user profile iconcherry hat folgendes geschrieben:
Da passiert genau dasselbe!

Mhmm... Okay...

user profile iconcherry hat folgendes geschrieben:
Und übrigens wird der MessageDlg nur ausgeführt bei einer Exception, zum Beispiel wenn die ID nicht gefunden werden kann!

Weiß ich, weiß ich. Soviel erkenn' ich dann doch noch. ;) Aber hätte ja sein können, dass du das Programm bei dir zu Hause testest und da keine Datenbank hast und deshalb immer die Exception eintritt oder was weiß ich was. :tongue:

user profile iconcherry hat folgendes geschrieben:
Danke trotzdem

Nicht so schnell aufgeben. Was auf jeden Fall gehen sollte, ist, wenn du einfach direkt hinter das Edit einen Button setzt und dem den Code aus KeyPress ins OnClick gibst. Dann setzt du noch Default vom Button auf True. ;)


cherry - Di 09.08.05 09:11

Das wäre eine Möglichkeit... die ich leider ausschliessen muss.
Habe einen Prontscreen von meinem Programm mitgeschickt.
Dann erkennt man, dass sich hinter der Betriebsnummer ein Button schlecht machen
würde! :?


WeBsPaCe - Di 09.08.05 09:29

Also wenn dir der Piepser so wichtig ist, dann kannste dir ja auch den Button auf dein Formular setzen und ihm dann bei TForm.Create die Eigenschaft Width oder Height auf 0 setzen. Funktioniert noch, hab's ausprobiert. ;)

So wie's im Anhang ist, sieht's dann zur Entwicklungszeit aus. Startest du das Programm ist er weg. ;)


Lannes - Di 09.08.05 09:35

Hallo,
user profile iconcherry hat folgendes geschrieben:
...jetzt gibt es aber immer wenn ich enter drücke so einen
beschissnen piepston, kann ich den irgendwie ausschalten? :roll:

der Ton wird ausgegeben weil das Editfeld den Zeilenumbruch durch die Enter-Taste nicht erzeugen kann, daher der Warnton -ist Windows-Standard-

in deinem Code wird VK_RETURN ausgewertet, aber auch an Windows weitergereicht.
Das musst Du unterbinden:

Delphi-Quelltext
1:
2:
3:
4:
5:
If Key = vk_return  then
 begin
  key := 0;// <----!!!! diese zeile einfügen 
  try  
   SQL1 :=  ' SELECT * FROM v_wp_wirtschaftsbetrieb'


cherry - Di 09.08.05 10:15

gute idee..

user profile iconLannes hat folgendes geschrieben:
in deinem Code wird VK_RETURN ausgewertet, aber auch an Windows weitergereicht.
Das musst Du unterbinden:


funktioniert aber so... :

user profile iconLannes hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
If Key = vk_return  then  
 begin  
  key := 0;// <----!!!! diese zeile einfügen   
  try    
   SQL1 :=  ' SELECT * FROM v_wp_wirtschaftsbetrieb'


.. leider nicht ! :(


WeBsPaCe - Di 09.08.05 10:19

Bist du jetzt im OnKeyPress oder im OnKeyUP drin?! :gruebel:


cherry - Di 09.08.05 10:22

Im OnKeyDown natürlich, habe aber auch OnKeyUp versucht.


WeBsPaCe - Di 09.08.05 10:25

user profile iconcherry hat folgendes geschrieben:
Im OnKeyDown natürlich, habe aber auch OnKeyUp versucht.


Im OnKeyDown solltest du's mal so versuchen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If Key = vk_return  then  
 begin  
  key := #0;
  try    
   SQL1 :=  ' SELECT * FROM v_wp_wirtschaftsbetrieb' 
   [...]


Bei mir funktioniert das... :gruebel:


cherry - Di 09.08.05 10:33

user profile iconWeBsPaCe hat folgendes geschrieben:
Bei mir funktioniert das... :gruebel:


Das kann ich dir fast nicht abkaufen, bei mir gibt es einen Syntaxfehler aus!

[Fehler] FStammdaten.pas(730): Inkompatible Typen: 'Word' und 'Char'

Ist ja auch klar eigentlich, denn key is ja vom typ Word!?


WeBsPaCe - Di 09.08.05 10:36

Im OnKeyPress eines TEdit nicht. ;)


Delphi-Quelltext
1:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);                    


CK_CK - Di 09.08.05 10:37

Was haltet ihr denn dann von:key := Ord(#0); ;)

CK_CK


WeBsPaCe - Di 09.08.05 10:40

lol...

Key erwartet ein Char als Wert. Du übergibst ihm aber ein Integer... ;)

:arrow:
Zitat:
[Error] Unit1.pas( 28 ): Incompatible types: 'Char' and 'Integer'


cherry - Di 09.08.05 10:48

user profile iconWeBsPaCe hat folgendes geschrieben:
Im OnKeyPress eines TEdit nicht. :wink:


achso, du hast drum geschrieben...

user profile iconWeBsPaCe hat folgendes geschrieben:
Im OnKeyDown solltest du's mal so versuchen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 If Key = vk_return  then    
 begin    
  key := #0;  
  try      
   SQL1 :=  ' SELECT * FROM v_wp_wirtschaftsbetrieb'   
   [...]


.. ok, ich probiers nochmal...


Lannes - Di 09.08.05 10:49

Hallo,

jetzt mal alle im Überblick:

Delphi-Quelltext
1:
2:
3:
OnKeyPress(...; var Key: Char);     // >>> key := #0;
OnKeyDown(...; var Key: Word;...);  // >>> key := 0;
OnKeyUp(...; var Key: Word;...);    // >>> key := 0;


WeBsPaCe - Di 09.08.05 10:50

user profile iconcherry hat folgendes geschrieben:
.. ok, ich probiers nochmal...

Jawoll... Tu' das... ;)

@user profile iconCK_CK: War nicht böse gemeint. ;)


cherry - Di 09.08.05 10:52

aber wenn ich es im OnKeyPress Ereignis mache, funktioniert die If Abfrage
mit vk_return leider nicht!


Delphi-Quelltext
1:
 If key = ???  then                    


Wie regle ich das jetzt?


WeBsPaCe - Di 09.08.05 10:54


Delphi-Quelltext
1:
2:
3:
if Key = #13 then
begin
[...]

;)


cherry - Di 09.08.05 10:56

Cool

Jetzt klappt alles bestens!
Danke für eure Hilfe...

Schönen Tag noch..


WeBsPaCe - Di 09.08.05 10:59

user profile iconcherry hat folgendes geschrieben:
Danke für eure Hilfe...

Kein Problem. ;)

user profile iconcherry hat folgendes geschrieben:
Schönen Tag noch..

Joa, dir auch. ;)

slt, WeBBy


DaRkFiRe - Di 09.08.05 11:07

@WebSpace: das mit Ord is nich Dein Ernst?
Ord wandelt Char in ASCII Code (also BYTE) um (Typecast von CHAR nach BYTE)

Ach ja - und wie Lannes schon sagte
Keypress: Key:=#0, KeyUp/Down: Key:=0

@CK_CK: Ord(#0) gibt 0 zurück, also bitte, warum nicht gleich 0 schreiben? Wenn Du Glück hast, optimiert der Delphi-Compiler das.


WeBsPaCe - Di 09.08.05 11:14

user profile iconDaRkFiRe hat folgendes geschrieben:
@WebSpace: das mit Ord is nich Dein Ernst?
Ord wandelt Char in ASCII Code (also BYTE) um (Typecast von CHAR nach BYTE)

Blablubb... Da ist einiges verrutscht... ;) Ich wusste nur, dass es falsch war, hab aber den gewünschten Wert mit dem vorhandenen verwechselt... :roll:

Ord(X: Ordinal) will ein Char als Parameter. Das ist richtig. Somit ist also #0 korrekt. Jedoch bekommen wir als Rückgabewert von Ord(X: Ordinal) ein Integer (Char :arrow: Integer). Wir wollen aber kein Integer. Wir wollen ein Char. Hab's jetzt verbessert... ;)

Danke! :tongue: