変数について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;
記述が終わって「実行」したら,シフトキーやコントロールキーを押しながら文字キーを押してみてください。
上のソースコードのファイルを掲載します.よければご覧ください。
→ダウンロード