0

このコードを使用して、同時に3文字を押すことをテストしますが、IF外に飛び出しcaseます!

....
private
FValidKeyCombo: boolean
....

procedure MyForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if FValidKeyCombo and (Shift = [ssAlt]) then
    case Key of
      Ord('N'): //New
        if (GetKeyState(Ord('C')) and $80) = $80 then 
          btn1.OnClick(nil)

        else if (GetKeyState(Ord('T')) and $80) = $80 then 
          btn2.OnClick(nil)

        else if (GetKeyState(Ord('Q')) and $80) = $80 then 
          btn3.OnClick(nil)

        else if (GetKeyState(Ord('W')) and $80) = $80 then 
          btn3.OnClick(nil);

     Ord('E'): //New
        if (GetKeyState(Ord('C')) and $80) = $80 then 
          btn1.OnClick(nil)

        else if (GetKeyState(Ord('T')) and $80) = $80 then //<-- after this line if jump to line 30!! why ???
          btn2.OnClick(nil)

        else if (GetKeyState(Ord('Q')) and $80) = $80 then 
          btn3.OnClick(nil)

        else if (GetKeyState(Ord('W')) and $80) = $80 then 
          btn3.OnClick(nil);

  end; //case Key of

{This is line 30}  FValidKeyCombo := (Shift = [ssAlt]) and (Key in [Ord('C'), Ord('T'), Ord('Q'), Ord('W')]);
end;

procedure MyForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  FValidKeyCombo := False;
end;

コードでコメントされているように、値Ifを設定する30行目にジャンプすると、FValidKeyComboAlt + W + Eを押すと発生します!! どうして ??

4

1 に答える 1

0

あなたのコードは正常に動作します。

私の推測では、誤って theと次のステートメント;の間にa を導入して、ステートメントを終了させた可能性があります。ステートメントも一部を持つことができ、すでにケースの最後の値にいるため、コンパイルされます。btn2.OnClick()elseifcaseelse

このために、私は常に複雑なコードをbegin/endペアで囲みます。費用はかかりませんが、コードに多くの明確さを追加します.

たとえば、コードを次のように変更しました。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if FValidKeyCombo and (Shift = [ssAlt]) then
  begin
    case Key of
      Ord('N'): //New
        begin
          if (GetKeyState(Ord('C')) and $80) = $80 then
            btn1.OnClick(nil)
          else if (GetKeyState(Ord('T')) and $80) = $80 then
            btn2.OnClick(nil)
          else if (GetKeyState(Ord('Q')) and $80) = $80 then
            btn3.OnClick(nil)
          else if (GetKeyState(Ord('W')) and $80) = $80 then
            btn3.OnClick(nil);
        end;
     Ord('E'): //New
       begin
        if (GetKeyState(Ord('C')) and $80) = $80 then
          btn1.OnClick(nil)
        else if (GetKeyState(Ord('T')) and $80) = $80 then
          btn2.OnClick(nil) //a ; here now produces a compiler error
        else if (GetKeyState(Ord('Q')) and $80) = $80 then
          btn3.OnClick(nil)
        else if (GetKeyState(Ord('W')) and $80) = $80 then
          btn3.OnClick(nil);
       end;
    end; //case Key of
  end;
  FValidKeyCombo := (Shift = [ssAlt]) and (Key in [Ord('C'), Ord('T'), Ord('Q'), Ord('W')]);
end;
于 2013-03-02T03:12:48.993 に答える