−トップへ−

変数についてB(論理型変数)

 論理型変数はその値に,「true」と「false」のどちらかを代入できます。宣言するときは次のように記述します。

     ck : boolean ;

 これを使って,[Shift]キーや[Ctrl]キーが押されているかどうか判別するコードを書いてみます。用意するものは,ラベルコンポーネントだけです。ここでイベントにソースコードを書く前にすることが2つあります。
 1つめは,[Shift]キーや[Ctrl]キーなどの特殊キーを使えるようにすることです。2つめは変数宣言をする場所についてです。
 まず,特殊キーを使えるようにする方法ですが,lazarusのコードエディタの上のほうに「uses」と書かれている行があると思います。その最後に「LCLtype」を追加してください
 これで特殊キーが使えるようになります。
 次に変数宣言をする場所ですが,変数を複数のイベンで使いたいので,上記の「uses」の下にあるtypeに右の図のように記入してください。ここでは[Shift]キーが押されたかどうかを記録する変数に[ksht],同じように[Ctrl]キーは[kctr]としています。

 これで準備は終わったので,イベントを呼び出します。イベントはフォームのイベントを使います。「form1」のイベントから,[OnKeyDown],[OnkeyPress],[Onkeyup]の3つを呼び出してください。
 ここで,[OnKeyDown]と[OnkeyPress]について確認します。このイベントはどちらも同じようなものですが,イベントの発生順序があり,最初に[OnKeyDown]が発生し,次に[OnkeyPress]が発生します。[Shift]キーなどの使い方をみると,[Shift]キーを押しながら文字キーを押すことがよくあります。そのため,特殊キーは[OnKeyDown]イベントで使い,文字キーは[OnkeyPress]イベントで使うことが一般的です。
 イベントを呼び出したら,以下のように記述してください。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState );
begin
  if key = VK_shift then ksht := true ; //下げたキーがシフトキーなら ksht を true にする
  if key = VK_control then kctr := true ; //下げたキーがコントロールキーなら kctr を true にする
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  if ksht = true then begin
    if kctr = true then label1.caption := '[Shift]キーと[Ctrl]キーが押されています'
    // ksht と kctr が両方 true なら上のメッセージを出す
    else label1.caption := '[Shift]キーが押されています' ;
    // ksht だけが true なら上のメッセージを出す
  end else begin
    if kctr = true then label1.caption := '[Ctrl]キーが押されています'
    // kctr だけが true なら上のメッセージを出す
    else label1.caption := '何も押されていません' ;
    // 両方とも false なら上のメッセージを出す
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if key = VK_shift then ksht := false ; //上げたキーがシフトキーなら ksht を false にする
  if key = VK_control then kctr := false ; //上げたキーがコントロールキーなら kctr を false にする
  label1.caption :=''; //ラベルのメッセージを消す
end;

記述が終わって「実行」したら,シフトキーやコントロールキーを押しながら文字キーを押してみてください。

 上のソースコードのファイルを掲載します.よければご覧ください。
→ダウンロード

−トップへ−