ここでは、何度か遭遇した状況を再現しました。私には2つの形式があります。Form1とForm2。Form1には1つの編集フィールドがあり、OnKeyupイベントが接続されています。Form2にはボタンが1つだけあり、OnClickが接続されています。Form1ユーザーがTEditタイプのフィールドでVK_Retrunを押すと、Form2.Showが実行されます。Form2は、ボタンにフォーカスを置いて表示されます。イベントOnClickは、内部のコード「Close」に接続されています。ユーザーがキーボードのVK_RETURNキーを押すと、Form2は期待どおりに閉じます。しかし、ここで問題が発生し、Form2が再び真っ直ぐに起動しました。Form1がフォーカスを取得したとき、キーはまだ「キュー」にあり、編集フィールドはVK_RETURNに進むようです。
この状況の完全なリストは次のとおりです。
unit UTestButton;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses UTestButton2;
{$R *.dfm}
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_Return) THEN
Form2.Show;
end;
end.
これは2番目のユニットです。
unit UTestButton2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Close;
end;
end.
praxesでは、ラベルや情報を含む単純なフォームを使用することがありますが、1つまたは2つのボタンを使用し、ボタンに焦点を合わせます。ユーザーは期待どおりにキーボードのキーを押すことができます。彼がvk_returnを使用し、基になるコントロールがキーを使用する場合、次のようにバッファーのキーをクリアするためにいくつかの回避策を実行する必要があります。
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
それは私にとって完全に満足のいくものではありません。この状況の解決策はありますか?