内部設計
この段階では各機能を詳細に決めます。要求仕様で列挙した個々の機能の細部を詰めていきます。
機能(1)~(3)について
(1)~(3)は実現したいことが同じなので、まとめて考えました。指定されたレジスタの現在値を表示するのも、値として使用するのも、やるべきことは同じです。それは「適切な場所に数値を表示すること」です。
RegisterComboでアイテムを変更した時、それに対応してResultLabelに現在のIntelCpuオブジェクトのプロパティの値を表示します。
ValueComboでアイテムを変更した時、それに対応してValueBoxに現在のIntelCpuオブジェクトのプロパティの値を表示します。こちらの方は注意が必要です。「即値」が指定された場合は、ユーザが入力している値を表示せねばならず、レジスタを選択した時は値を変更できるようにしてはなりません。もし、レジスタを選択した時、値を変更できるようにしてしまうと、操作する人に「直接レジスタの値を変更できる」と勘違いさせてしまいます。今回は機械語で動く仕様ですので、直接値を変更してはなりません。
機能(4)について
この機能では、選択したRadioButtonに応じて、ResultLabelとValueBoxで表示されている値を適切なものへと変更します。例えば、10という数値が10進数で表示されている時にBinaryOption選択されたら、値を1010に変更しなければなりません。この動作はNumberFormatInfoクラスを使用して、数値表現を変えるとよいでしょう。
それに加えて、適切な数値以外指定できない状態にせねばなりません。そうしないと利用者が混乱してしまいます。例えば、BinaryOptionが選択されたときは、0と1のボタン以外はEnabledプロパティをFalseにせねばならず、ValueBoxコントロールで0と1以外の数値を指定できないようにせねばなりません。この部分はValueBoxKeyPressイベントを利用するとよいでしょう。
機能(5)と(6)について
この2つの機能は機械語命令を発生させるという点で同じです。今回まで作成して来たTestDriverと同じように、機械語の実行をコーディングしなければなりません。これらのボタンをクリックした時、内部で機械語を組み立て、それをCommandListコントロールのItemsプロパティへ追加します。
機能(7)について
この機能要件に対応するには、CommandListコントロールのItemsプロパティと同じ並びの機械語配列を別に保存しておくか、専用のオブジェクトを作ってItemsプロパティに追加することで実現します。別に配列を作る方法は一見簡単ですが、柔軟な扱いができなくなりますので、専用のオブジェクトを作ることにします。
専用のオブジェクトについては、読者の方への課題とします。MSDNなどで、ListBoxコントロールについて調べて自身で考えてみて下さい。面倒かもしれませんが、きっとためになると思います。
機能(8)について
この機能要件を実現するには、CommandListで現在選択しているアイテムを、UpButtonをクリックした場合は1つ上へ、、DownButtonボタンをクリックした時は1つ下へ移動させます。この動作は、CommandListコントロールのItemsプロパティを操作することにより行います。
機能(9)について
機能9を実現するのは少し大変です。各メニューのうち、どれがチェックされているのかを判断し、EnterButtonボタンがクリックされた時に処理を実行します。各実行の流れを個別に解説します。
StepExeMenu(逐次実行)の場合は、即座に最後に指定された機械語命令を実行します。
RegionMenu(範囲指定実行)の場合は、CommandListコントロールで選択されている範囲で機械語命令を実行します。
ExecuteMenu(全て実行)の場合は、今まで指定された機械語を全て指定された順に実行します。
これらの動作は、CommandListコントロールのItemsプロパティに保存されている専用のオブジェクトを使用して行います。
機能(10)と(11)について
この機能要件を実現するには、SaveFileDialog、OpenFileDialog、System.Io.BinaryWriter、System.Io.BinaryReader、System.Io.FileInfoの各クラスを使用します。ダイアログクラスで指定されたパスへファイルを作り、機械語のバイナリを直接読み書きします。
読み込み時は、そのバイナリに基づいてCommandListコントロールのItemsプロパティへ適切なオブジェクトを追加するものとします。
まとめ
いかがだったでしょうか? 今回は今までの総まとめとして「機械語駆動式 関数電卓」というアプリケーションを設計してみました。このアプリケーションの実装は読者の方への宿題とします。ぜひ、この仕様を基に実装を試みてください。きっと楽しんでいただけると思います。次回以降で実装例を掲載していきますので、お楽しみに。
