このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
だいぶ満足できるところまできたが、
もう少し飾り付けをしよう。解答中の行を可視化したい。
現在は、縦横のヒントを順に検索するだけだが、
行や列の解答を求めようとしても答えが出ない場合、
その行について調べてあきらめたのか、
まったく調べていないかがわかりにくいからだ。
解答中の行が見えるようにしておけば、
明らかに現状では解けない行に対する処理などの
無駄な処理を見つけやすくなる。
それによって、将来的に、行や列の難易度を考慮して、
効率的に行を選択する処理などを追加できるかもしれない。
通知には、PuzzleAnswer と同じようにイベントを使う。
では、行列の着目に関するイベントを定義しよう。
Public Event ColumnSelected(ByVal Index As Long)
Public Event RowSelected(ByVal Index As Long)
そして、Solve メソッド内にある、
PuzzleLine の Solve を呼ぶ直前に、
イベントを発生させるコードを追加する。
' イベント追加
RaiseEvent ColumnSelected(c)
lResult = m_oColumns(c).Solve()
行についても同じ。
RaiseEvent RowSelected(r)
lResult = m_oRows(r).Solve()
これによって、行の解答をはじめる直前にイベントが起きる。
さて、SolveAction でこれを受け取ってみよう。
SolveAction のフィールド変数として、
WithEvents つきで宣言する。
' ソルバクラスのイベントを受け取る
Private WithEvents m_oSolver As PuzzleSolver
そして、SolveAction の Execute メソッドに、
PuzzleSolver のイベントに接続するコードを追加する。
m_oAnswer に代入していた直前でかまわない。
' イベントに接続する
Set m_oSolver = oSolver
Set m_oAnswer = oSolver.Answer
オブジェクトボックスを使って、
イベントハンドラのスケルトンを入力し、中身を埋める。
Private Sub m_oSolver_ColumnSelected(ByVal Index As Long)
' Call m_oAnswerRange(0, Index + 1).Select
Call m_oAnswerRange.Columns(Index + 1).Select
Call Wait(0.1)
End Sub
着目列選択のイベントがきたら、
解答欄の列に該当する範囲を選択される。
Range の Columns プロパティを参照すれば楽に書ける。
個人的には、列全体を選択するのは好きではないので、
列のひとつ上のセルを選択するようなコードも書いた。
コメントアウトしているのがそれである。好みの問題かな。
Private Sub m_oSolver_RowSelected(ByVal Index As Long)
' Call m_oAnswerRange(Index + 1, 0).Select
Call m_oAnswerRange.Rows(Index + 1).Select
Call Wait(0.1)
End Sub
行についてもまったく同じだ。
Columns と同様、Rows プロパティがある。
では、実行してみよう。
日記には画像しか載せられないので、
イメージが伝わりにくいと思うが、なかなか面白い。