新年あけましておめでとうございます。
今年も株式会社ミガロ. ならびに当技術Tipsをよろしくお願い申し上げます。
さて、新年ということでブレイクタイムです。
↑ ↑ ↓ ↓ ← → ← → B A
というワードは、ゲーム好きな方であれば一度は耳にしたことがあるのではないでしょうか。
コナミコマンドという通称で、「もっともよく知られている隠しコマンド」として
ギネス世界記録にも認定されているそうです。
今回はDelphi/400のVCLフォームで、この隠しコマンドを実装する方法をご紹介いたします。
=======================================
【免責事項】
今回の記事はいわゆる「ジョークTips」です。
本Tipsはシステム開発においては何ら役に立つものではありません。
しかしながら、隠し機能として実装することで開発者用のデバッグ機能になったり、
業務外のふとした所で話題作りにできるかもしれません。
また、本ページに掲載しているソースコードは情報提供の為のサンプルとなります。
お客様作成アプリケーション内で自由にご利用いただけます。
ただし、これらのソースコードを使用したことによって生じた、
いかなる障害・損失に関しても一切の責を負いかねますので、ご了承下さい。
=======================================
実装ポイントは
① グローバル変数の定義と初期設定
② フォームのOnKeyDownイベント
の2箇所です。それぞれ実装方法を解説します。
①グローバル変数の定義と初期設定
フォームの宣言部(Private宣言)に、
「Integer型のグローバル変数」と「手続き(procedure)」を1つずつ宣言しておきます。
今回は以下の名前で宣言します。
- iSecret: Integer; // 隠しコマンド用
- procedure Kakushi(AKey: Integer);
また、初期設定として以下の処理を行います。
- 変数(iSecret)は、画面生成時イベント(FormCreate)等で初期化(0を代入)しておきます。
- フォームのKeyPreviewプロパティをTrueに設定しておきます。
- KeyPreview=Trueの場合、フォーム内の項目(Edit等)にフォーカスが当たっていても、FormKeyDownイベントが有効になります。
このプロパティはロジック・オブジェクトインスペクタのどちらで設定しても構いません。
- KeyPreview=Trueの場合、フォーム内の項目(Edit等)にフォーカスが当たっていても、FormKeyDownイベントが有効になります。
②フォームのOnKeyDownイベント
FormKeyDownイベントに、以下のようにロジックを記述します。
「↑↑↓↓←→←→BA」という隠しコマンドをFormKeyDownイベントで拾うために、
正しいキーが押された場合に変数「iSecret」をカウントアップし、
コマンドが最後まで正しく入力されるとトリック(隠し処理)が発動する仕組みです。
隠しコマンド部分の処理を「Kakushi」手続きに分離しているのは、
何らかの問題が発生した際に「Kakushi」手続きを呼び出している1行だけを
コメントアウト(削除)すれば復旧できるようにするための対策です。
{*******************************************************************************
目的: キーボード押下時処理
引数:
戻値:
*******************************************************************************}
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// 隠しコマンドのチェックと実行
Kakushi(Key);
end;
{*******************************************************************************
目的: 隠しコマンドのチェックと実行
引数: AKey - FormKeyDownから受け取った入力キー
戻値:
*******************************************************************************}
procedure TForm1.Kakushi(AKey: Integer);
var
bResult: Boolean;
begin
bResult := False;
case iSecret of
0: bResult := (AKey = VK_UP); // 上
1: bResult := (AKey = VK_UP); // 上
2: bResult := (AKey = VK_DOWN); // 下
3: bResult := (AKey = VK_DOWN); // 下
4: bResult := (AKey = VK_LEFT); // 左
5: bResult := (AKey = VK_RIGHT); // 右
6: bResult := (AKey = VK_LEFT); // 左
7: bResult := (AKey = VK_RIGHT); // 右
8: bResult := (AKey = 66); // B
9: bResult := (AKey = 65); // A
10: bResult := True; // 成功済みの場合
end;
if bResult then
begin
Inc(iSecret);
end
else
begin
// 途中で打ち間違えたら初期値に戻す
iSecret := 0;
end;
// 入力成功時、トリックの実行
if (iSecret >= 10) then
begin
Application.MessageBox('隠しコマンドを検知しました。『待たせたな。』', '↑↑↓↓←→←→BA', 64);
try
// トリック(隠し処理)開始
// ★★ここにトリック(隠し処理)を書く★★
// トリック(隠し処理)終了
finally
// トリックが終わったら初期値に戻す
iSecret := 0;
Application.MessageBox('隠しコマンドによる処理を終了します。', '↑↑↓↓←→←→BA', 64);
end;
end;
end;
コマンド成功時に発動させるトリック(隠し処理)の内容については本記事では言及しません。
このトリックの内容部分こそ、実装するプログラマー様の腕の見せ所となります。
ちなみに、DelphiのIDE(統合開発環境)にもオフィシャルの隠しコマンドが存在します。
欧米では一般的にイースターエッグと呼ばれるものです。
『Embarcadero🄬 Delphi のバージョン情報』の画面で、
Altキーを押しながら「TEAM」や「GUNGLA」と入力すると・・・?
さらにその操作によって表示される文字をダブルクリックすると・・・!?