Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OnKeyPress verarbeitet ENTER nicht an (https://www.delphipraxis.net/184539-onkeypress-verarbeitet-enter-nicht.html)

Sugar 3. Apr 2015 11:19

Delphi-Version: 7

OnKeyPress verarbeitet ENTER nicht an
 
Hallo,

ich habe wieder mal was wundersames...
Ich reagiere auf die Tastatureingaben in einm TEditFeld. Im OnKeyPress-ereignis habe ich folgendes eingetragen um nur die gewünschten Tasten zur Eingabe zuzulassen.

procedure THauptForm.CalcEdit1KeyPress(Sender: TObject; var Key: Char);
Begin
If Not (Key IN ['0'..'9',',','-','+','*','/',#8,#27,#13]) then
begin
Key := #0;
end;
.
.
.
End;

Die ENTER-Taste behandele in etwas später im Code dieses Ereignisprozedur. Besser ich würde gern....
Denn betätige ich in dem Eingabefeld die Enter Taste, dann tritt dieses Ereignis gar nicht ein.

Es gibt keine weiteren Ereignisse die ich von dem Feldverarbeite, KeyPreview der Form ist auf True (aufgrund dessen, dass ich dort auch auf andere Tastatureingaben reagiere).. Ich stehe vor einem Rätsel...

jaenicke 3. Apr 2015 11:33

AW: OnKeyPress verarbeitet ENTER nicht an
 
Das kann ich nicht reproduzieren, weder mit Delphi 7 noch mit XE7...

Hast du vielleicht ein kleines Testprojekt, das du hier anhängen kannst?

himitsu 3. Apr 2015 12:21

AW: OnKeyPress verarbeitet ENTER nicht an
 
OnKeyDown/OnKeyUp ?

PS: Rechtsklick und Einfügen, oder Strg+V und schon kann man alles einfügen, was mann will.
Es gibt hier aber auch massig Threads, wo erklärt wird, wie Andere das machen.

Popov 3. Apr 2015 12:56

AW: OnKeyPress verarbeitet ENTER nicht an
 
@Sugar

Ist schon länger her wo ich das selbst genutzt habe, ist aber soweit ich mich erinnern kann normal. Eines von beiden, OnKeyPress oder OnKeyDown reagierte nicht auf Enter. Ich hab es damals genauer untersucht, es war normal. Ich weiß aber nicht mehr warum.

jaenicke 3. Apr 2015 13:07

AW: OnKeyPress verarbeitet ENTER nicht an
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also bei mir funktioniert OnKeyPress problemlos, genau wie OnKeyDown und OnKeyUp, sowohl mit Delphi 7 als auch XE7...

// EDIT:
Hier ein Screenshot, falls es jemand nicht glauben möchte:

Anhang 42844

// EDIT2:
Ach, ich weiß warum es nicht geht vermute ich...
Ich rate einmal, dass du Key in der Ereignisbehandlung im Formular auch auf das Nullzeichen setzt, oder? Wenn du das tust, kommt der Tastendruck logischerweise auch nicht mehr im Editfeld an, du brichst ihn ja ab...

Popov 3. Apr 2015 14:06

AW: OnKeyPress verarbeitet ENTER nicht an
 
Stimmt, kann ich bestätigen. Ist aber, wie oben erwähnt, schon etwas länger her. Muss was anderes gewesen sein.
Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    ShowMessage('Schöne Grüße von OnKeyDown');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(VK_RETURN) then
    ShowMessage('Schöne Grüße von OnKeyPress');
end;

Sugar 3. Apr 2015 14:10

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von jaenicke (Beitrag 1296069)
// EDIT2:
Ach, ich weiß warum es nicht geht vermute ich...
Ich rate einmal, dass du Key in der Ereignisbehandlung im Formular auch auf das Nullzeichen setzt, oder? Wenn du das tust, kommt der Tastendruck logischerweise auch nicht mehr im Editfeld an, du brichst ihn ja ab...

Ich frage nur an zwei Stellen die Tastatur ab. Einmal in "FORMKEYDOWN" des Formulares. Dort habe ich folgendes eingefügt:
if key = 13 then showmessage('ENTER');

NULL Reaktion. Alle anderen Tasten werden sauber behandelt...

Sugar 3. Apr 2015 14:12

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Popov (Beitrag 1296080)
Stimmt, kann ich bestätigen. Ist aber, wie oben erwähnt, schon etwas länger her. Muss was anderes gewesen sein.
Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    ShowMessage('Schöne Grüße von OnKeyDown');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Chr(VK_RETURN) then
    ShowMessage('Schöne Grüße von OnKeyPress');
end;

Auch so gibt es keine Reaktion in der Routine....

Popov 3. Apr 2015 14:21

AW: OnKeyPress verarbeitet ENTER nicht an
 
Das funktioniert aber:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  If Not (Key IN ['0'..'9',',','-','+','*','/',#8,#27,#13]) then
  begin
    Key := #0;
  end;

  if Key = Chr(VK_RETURN) then
  begin
    Key := #0;
    ShowMessage('Schöne Grüße von OnKeyPress');
  end;
end;

Sugar 3. Apr 2015 14:25

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Popov (Beitrag 1296085)
Das funktioniert aber:
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  If Not (Key IN ['0'..'9',',','-','+','*','/',#8,#27,#13]) then
  begin
    Key := #0;
  end;

  if Key = Chr(VK_RETURN) then
  begin
    Key := #0;
    ShowMessage('Schöne Grüße von OnKeyPress');
  end;
end;

Ich weiß, nur komischerweise in diesem einen Projekt nicht!

Ich habe jetzt alles rausgeschmissen was nicht nativ Delphi 7 ist. Immer noch das gleiche Ergbebnis. Die Enter-Tase wird weder von den Komponenten noch von der Form ausgewertet.

BadenPower 3. Apr 2015 15:23

AW: OnKeyPress verarbeitet ENTER nicht an
 
Du hast nicht zufällig noch irgendwo irgendetwas eingebaut, was die Enter-Taste in eine Tab-Taste umwandelt, damit der Focus auf das nächste Element gesetzt wird.

Ansonsten können wir Dir nur weiterhelfen, wenn Du das Projekt einmal komplett in den Anhang packst.

Popov 3. Apr 2015 15:23

AW: OnKeyPress verarbeitet ENTER nicht an
 
Was soll die Enter-Taste denn machen? Soll sie zum nächsten Element springen? Das macht sie nicht. Das ist nicht ihre Aufgabe. Die Enter-Taste ist zuerst nur eine Taste, mehr nicht.

Wenn du willst, dass sie etwas macht, dann musst du es schon selbst machen.

Perlsau 3. Apr 2015 22:36

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Sugar (Beitrag 1296086)
Ich weiß, nur komischerweise in diesem einen Projekt nicht!

Dann häng das Projekt doch hier einfach mal als ZIP-Archiv an, damit einer von uns nachschauen kann, wo du diesen ganz blöden Fehler machst. Wie sonst soll man hier von weitem drauf kommen, wenn man gar nicht alles angucken kann, was du da gemacht hast?

Sorry, BadenPower, hatte nicht gesehen, daß du das auch bereits vorgeschlagen hast. Sieh meinen Kommentar einfach als Bekräftigung des deinigen :-D

BadenPower 3. Apr 2015 23:49

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Perlsau (Beitrag 1296110)
Sieh meinen Kommentar einfach als Bekräftigung des deinigen :-D

:thumb:

Sugar 4. Apr 2015 17:46

AW: OnKeyPress verarbeitet ENTER nicht an
 
Ich kann das Projekt nicht so ohne Weiteres anhängen, denn ich habe diverse Zukaufkomponenten drin. Ich werde aber mal das Problem nachstellen.

Ich bin auch schon etwas weiter gekommen:


Das Eingabefeld dient als Eingabefeld einer Kasse, also quasi als Eingabe wie bei einem Taschenrechner - die Entertaste soll also das Summieren einleiten

Neben diesem Eingabefeld gibt es nocht zwei Grids auf dem Formular und 40 Button. Ichhabe jetzt heraus bekommen, dass das drücken von Enter das OnClick Ereignis des "ersten" Buttons auslöst obwohl dieser keinen Tabstob hat, mein Enter auch nicht das Eingabefeld verlässt oder verlassen soll.

jaenicke 4. Apr 2015 18:27

AW: OnKeyPress verarbeitet ENTER nicht an
 
Steht dessen Eigenschaft Default vielleicht auf True?

BadenPower 4. Apr 2015 19:53

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Sugar (Beitrag 1296187)
Ich kann das Projekt nicht so ohne Weiteres anhängen, denn ich habe diverse Zukaufkomponenten drin.

Das ist doch kein Hindernis.
Die Komponenten benötigt keiner um eine QuellCode-Analyse vorzunehmen.

Popov 4. Apr 2015 19:55

AW: OnKeyPress verarbeitet ENTER nicht an
 
Du programmierst zwar einen richtigen Taschenrechner mit Tasten, aber hier mein alter Ein-Prozedur-Taschenrechner (beachten nicht Punkt vor Strichrechnung). Vielleicht beantwortet es dir zum Teil deine Frage:
Delphi-Quellcode:
{                  --== Ein-Prozedur Taschenrechner ==--                       }
{           Hinweis: befolgt nicht die Punkt vor Strich Regel                 }
var
  Mem1, Mem2: Extended;
  LastOpKey: Char;

{Mögliche Tasten: "0123456789" und ",", dann "+-*/", "c", "=", alternativ Enter}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  Edit: TEdit;
begin
  {Dies und das}
  if not (Sender is TEdit) then
  begin
    Windows.Beep(300, 200);
    Exit;
  end
  else
    Edit := TEdit(Sender);

  if Key = #13 then
    Key := '=';

  {Clear}
  if Key = 'c' then
  begin
    Edit.Text := FloatToStr(0);
    Edit.SelStart := Length(Edit.Text); //setzt Cursor an Editfeld Ende
    Mem2 := 0;
    LastOpKey := #0;
    Key := #0;
    Exit;
  end;

  {Rechnen}
  if Key in ['+', '-', '*', '/', '='] then
  begin
    {Änderung des Operators (Operatorkorrektur)}
    if not Edit.Modified then
    begin
      LastOpKey := Key;
      Key := #0;
      Exit;
    end;
    {bedeutet, daß Opperator eigegeben wurde und vor der nächsten Zahleeingabe
    Edit-Feld gelöscht werden muß. Wird auch für Operatorkorrektur genutzt}
    Edit.Modified := False;

    {altuelle Zahl aus Editfeld holen}
    Mem1 := StrToFloat(Edit.Text);

    case LastOpKey of
    '+': Mem1 := Mem2 + Mem1;
    '-': Mem1 := Mem2 - Mem1;
    '*': Mem1 := Mem2 * Mem1;
    '/': Mem1 := Mem2 / Mem1;
    else
      Mem2 := Mem1;
      LastOpKey := Key;
      Key := #0;
      Exit;
    end;

    {Ergebnis und Zwischenergebns in Editfeld zurückschreiben}
    Edit.Text := FloatToStr(Mem1);
    Edit.SelStart := Length(Edit.Text);

    {auf nächste Zahlen-Eingabe verbreiten}
    Mem2 := Mem1;
    if Key <> '=' then
      LastOpKey := Key
    else
      LastOpKey := #0;
    Key := #0;
    Exit;
  end;

  {Zahlen Filtern}
  if not (Key in [#8, '0'..'9', ',']) then
  begin
    Windows.Beep(300, 200);
    Key := #0;
  end;
  {Löscht Editinhalt nach Operatoreingabe, bei neuen Zahleingabe}
  if not Edit.Modified then
    Edit.Text := '';
end; {Popov}

Sugar 5. Apr 2015 11:39

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von jaenicke (Beitrag 1296188)
Steht dessen Eigenschaft Default vielleicht auf True?

Das war´s!

Ich habe diese Eigenschaft bisher noch nie betrachtet.

Danke, Problem gelöst.

himitsu 5. Apr 2015 11:43

AW: OnKeyPress verarbeitet ENTER nicht an
 
Soeine Eigenschaft gibt es auch nochmal für Escape.

Wobei du bei Default=True das doch eigentlich sehen solltest?
Default-Buttons werden ja anders dargestellt.

BadenPower 5. Apr 2015 12:02

AW: OnKeyPress verarbeitet ENTER nicht an
 
Zitat:

Zitat von Sugar (Beitrag 1296232)
Zitat:

Zitat von jaenicke (Beitrag 1296188)
Steht dessen Eigenschaft Default vielleicht auf True?

Ich habe diese Eigenschaft bisher noch nie betrachtet.

Ups, dann stammt das Programm gar nicht aus Deiner Feder.

Dejan Vu 6. Apr 2015 08:46

AW: OnKeyPress verarbeitet ENTER nicht an
 
Es wäre -zumindest theoretisch- denkbar, das der TE die Eigenschaft beim Rumklicken aus Versehen verändert hat.


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

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