PCがやけに重くなっている感じがしたので,Windows 10 バージョン 2004のインストールを試みた.ダウンロードにも相当な時間が掛かったが何とか完了し,インストールに入ったが遅々として進まないので寝てしまった.朝起きたら「更新したプログラムを構成しています 25%」の状態で足踏みしている.30分放置してもまったく進まないので電源を落として再起動した.ネットでチェックすると,バージョン 2004のインストールには相当問題があるようだ.
再起動すると「コンピュータに対する変更を元に戻しています」の画面になったが,そのあとは通常通り使えるようになった.OSのバージョンは1909に戻っている.「更新を7日間一時停止」しておくのが一番無難かもしれない.最近の修正をフィックスしておこう.
- SIMPLENODEのdownwardとupwardを廃止@20210303 2箇所
- 選択はカードの有効無効と無関係@20210305 4箇所
- クラスタ検定に結婚を持たない終端ノードを含める@20210306 1箇所
- 主選択カードの仕様変更@20210307 2箇所
- カード選択とカード移動を切り離す20210306 7箇所
- 仮修正 2箇所,暫定修正 6箇所,#if 0 8箇所,
▲カード履歴ボタンではセンタリングしなくてもよいのではないか?現参照カードにはHOMEキーでいつでもジャンプできる.⇒だとすれば,カード履歴で単選択に戻るのではなく,選択領域を維持したまま現参照カードだけ切り替えるという仕様の方が筋が通るのではないか?⇒カード履歴ではJumpNewCardSingleで単選択に落としている.カード履歴でカード画面のタブが切り替わるのもよくない.⇒カード履歴では意図的にタブを復元している.JUMPTBLには以下の記録が格納されている.
- refn As Integer ‘現参照カード(基準ノード)参照番号
- tabn As Integer ‘カード画面タブ番号
- page As Integer ‘結婚ページ番号
- oyap As Integer ‘父母ページ番号
- entry As Integer ‘部分図エントリ番号
- previewmode As Short ‘プレビューモード
- keizuparm As mKeizuParm ‘系図描画パラメータ
つまり,可能な限りそのときの状態を復元させるという意図がある.一種のUNDOのような効果を狙っていたものと思われる.少しやり過ぎではないかという感もある… カード移動によって無闇にタブが切り替わらない方がよいという場合もあると思うのだが… タブの切り替え,結婚ページ,父母ページの切り替えなどは一時停止してしばらく運用してみることにする.これで,上下矢印キー,カード画面のスピンボタン,カード履歴ボタンの動作は現参照カードを移動するだけというシンプルなものになった.これでよいのではないかと思う.
逆に,矢印キー,スピンボタン,履歴ボタンが押されたときはカード巡回パネルは閉じた方がよいと思う.現行では履歴ボタンでは閉じるようになっているが,スピンボタンは巡回パネルのスピンボタンの動作になっている.また,矢印キーではやや意味不明の動作になる.⇒矢印キーでは巡回パネルを閉じるようにした.カード画面のスピンボタンが巡回パネルの動作になるというのも少し分かりづらいところはあるが,弊害はあまりないと思われるので現行のままとする.
▲系図画面の空白部をクリックして無選択にならない.⇒表示が更新されていない.mGetSelectListでは0を返している.UpdateSelectionは実行されている.⇒処理の重複を回避するために削り過ぎてしまった.UpdateSelectionの中でClearSelectionを実行することは必須だ.
▲選択→センタリングという動作そのものはよいと思うが,少し動作し過ぎの感じがする.カードが見えている場合はそこまでやらなくてよい.⇒CallCenteringMoveでは,*selectchangeがオンの場合はカードがフレーム内のときはジャンプしないようになっている.ただし,ACTION_HOMEKEYではつねに現参照カードにジャンプする.⇒CZelkovaCtrl3::CenteringCardの動作をACTION_CENTERに戻した.動作的にはこれでよいと思う.ただし,一覧表上で拡張選択(複数選択)した場合には現参照カードが見えるようにすべきだ.
呼び出し側ではそのような動作になっているが,ActionCenteringには引数で参照番号を渡していないため,どこかで齟齬が起きている.⇒TREEVIEW::CallCenteringMoveで*selectchangeが入っていないため,「中央点不動ズーム」の動作になっている.⇒タイミングが合っていない.センタリングはCardGridView_CurrentCellChangedで実行されるが,selectchangeに値が入るのはDataGridView_MouseUpでSelectionProcが実行されたときだ.この順序関係を変えることはできないので,ACTION_CENTERの場合は,selectchangeを無視してセンタリングを実行するようにするしかない.⇒修正した.これで完全に現参照カードを追尾できるようになった.
▲源氏物語全系譜6.1.ZEL 全体図#1 光源氏で一覧表で複数選択→親族図に切り替えで被参照カウントの残留が発生した.NAMEBOX:Dispose→ RetrieveGhost→ DeleteLongTailで発生している.MARGBOX[24]からの参照だ.MARGBOXsANCHORスロットでanchor2という変数だ.「アンカー参照の控え,アンカー付け替え時の参照削除用:人名枠への単純参照」というコメントが付いている.NAMEBOXにはNAMEsDUMMYというスロットがあり,dummyboxという名前が付いている.この障害は選択操作と無関係に発生する.
NAMEBOX::Disposeでcheckをオンにすると,これまで停止していなかったところで止まるようになる.⇒checkで停止するようになっていた.紛らわしいので廃止しておこう.
dummyboxはすでに空になっているが,現物は残っている.dummyboxは参照ではなく接続なので,おそらくフロート状態になっているのだろう.障害が起きているのはNAMEBOX #96515 中姫君(4)で,ダミー枠はMARGBOX #96525だ.⇒いや,読み損なっていた.障害ノードはNAMEBOX #86655 中姫君(3)で,dummyboxは活きているので簡単に参照解除できる.⇒解決.
▲同上の操作でNAMEBOX::getDrawSizeの「親族範囲外カード」エラーが複数出ている.LINEAGEの値は7でZELKOVATREEのとき,カードのkindredが10>7であるためだ.10というのはSTRANGERSなので明らかに「親族範囲外カード」であるように思われる.ただし,これはTREEVIEW::EraseTreeViewで起きているので,検査対象とはなならない.少なくともCHAOTICSTATE以下では無視してよいだろう.
▲同上サンプルの親族図の系図画面上で複数選択→ 部分図に遷移しようとしてMARGBOX::MostLeftで停止した.(ML && ML->group() != group())というエラーだ.結婚枠とその中の人名枠の所属系列が異なるというエラーだ.選択操作とは無関係に発生する.この障害もやはり,EraseTreeViewで発生している.上記と同様無視でよいだろう.
いい感じになってきた.選択操作に関してはほぼ満点と言ってよい.
▲検索ボックスでテキストを全選択して削除でカード削除になるのはまずい.⇒これはおそらくDELキーがカード削除コマンドになっているためではないかと思われる.このため,キーイベントが発生する前にコマンドが実行されてしまっている.KeyDownSubではCtrl+DELでカード編集:カード削除となっていて,「@2017-09-09 修飾なしの削除キーでカード削除を実行する × 弊害がある」としているのだが… ⇒まず,カード削除コマンドのショートカットをCtrl+DELに変えてみよう.
検索ボックスでDELキーを押すと,MDIForm_KeyDown→ KeyDownSubを通るようになるが,該当項目がないのでパスしてテキストのクリアが実行される.また,系図画面にフォーカスがあるときには,ZView_KeyDownが起動され,ここでは「修飾なしの削除キーでカード削除 」が実行される.これでよいのではないだろうか?カード画面上のテキストボックスでも普通にDELキーが使える.
▲検索ボックスで検索条件不一致で検索テキストが削除されるというのはあまりよい仕様ではない.また,テキストがクリアされた後,カーソルがボックスの中央というのも違和感がある.⇒検索入力ボックスのAlignmentはLeftになっている.このAlignmentはテキストボックス内の位置ではなく,ボックス全体がツールバーの中で右寄せか左寄せかという設定になっている.MDIParent.Designer.vbで「Me.検索入力ボックス.TextAlign=System.Drawing.ContentAlignment.MiddleLeft」としてみたが,変化しない.というか,不一致でテキストがクリアされると見ていたが,違うようだ.
「マッチするカードはありません」のパネルを閉じてもテキストボックスには残っている.ただし,ボックス内にカーソルを置くと突然消えて,カーソルがボックスの中央に表示された状態になる.しかし,カーソルを移動すると消えていた文字がまた復活する.検索入力ボックスのイベントハンドラは「検索入力ボックス_TextChanged」だけだ.ボックス内にカーソルを置いただけではこのイベントは発生しない.⇒よくわからないが,ここではこういうものだとしておこう.
▲検索ボックスの右にある虫メガネは選択領域があるときには,巡回パネルの右スピンボタンと同じ動作になっていて,カードを巡回するようになっているが,インジケータ行が変化していない.⇒SearchBoxSearchにUpdateSelectionを追加してインジケータ行も連動するようになったが,動作的にはかなり問題がある.選択領域と検索領域を混用するというのはやはりまずいのではないか?
検索領域は検索結果の巡回にのみ使用するように限定すべきだと思う.確かに選択領域を巡回できる手段があるというのも悪いアイディアではないが,混乱の元になる.検索結果は新たな検索が実施されるまでは温存され,いつでもカード巡回パネルないし検索ボタンで巡回できるというのはよいと思う.従って,選択領域を検索領域にコピーするという操作は基本的に不要ないし有害であると思われる.
選択領域→ 検索領域のコピーはmGetSearchListで実施している.この関数をmGetSearchListから呼び出すというのはとりあえず停止しよう.また,検索結果を選択領域に組み込むというのも廃止すべきだろう.いや,検索領域を選択領域に落とすというのは結構有用性があるのではないか?だとすれば,検索結果をストレートに選択領域に転換するというのが一番わかり易いと思う.
ただし,次検索で巡回するのは検索領域であり,選択領域ではないから,たとえば検索解除しても次検索は可能ということになる.検索領域から選択領域へのコピーはMakeSearchSelectionで実施している.この関数ではSendSelectionで選択領域を送っているので,系図画面には反映されているが,一覧表が更新されていない.⇒MakeSearchSelectionでUpdateSelectionを実行するようにした.
▲F3を押すと巡回パネルが閉じてしまうが,開いたままでよいのではないか?⇒KeyDownSubで閉じている.F3キーの場合は開けたままとしてみよう.
▲検索条件をキープされているはずだが,入っていない.SearchStringは検索文字列リストに追加しているだけだ.CopySearchConditionがMakeSearchSelectionから呼び出されているが,これはZ.SCの内容を検索パネルのパラメータにコピーするものだ.検索ボックスではZ.SCを使っていないのではないか?QuickSearchでは事後にZ.SCを構成しているが,MakeSearchSelection実行後なので間に合わない.⇒先行してZ.SCを構成するようにした.
クィック検索では姓名を1文字列としているが,姓と名前に分離する必要がある.スペースを区切り文字としてSplitで分割するようにした.
▲キーワード「大納言」で検索し,結果を新規部分図として部分図に切り替えようとして,TOPOLOGY::BuildSameGeneMarriageGraphで停止した.多重グラフ2の枝リストが空になっている.しかし,これはすべてのノードが孤立ノードの場合なら,あり得ることだ.ダンプだけで停止しないようにした.