系統並び替えを実行しても選択が落ちない

カード選択はユーザの主体的な行動であり,システム側からユーザに押し付けるものではない.カード選択操作の場面は,①系図画面上の選択,②一覧画面上での選択,③カード画面での移動,④編集コマンドによる選択がある.③ではつねに単選択になるが,それ以外は一般に複数カードの選択が可能だ.①で系図画面上のカードをクリックないし拡張選択した場合はOCXが選択/解除されたカードないし領域をDLL側に通知する.DLL側ではそれに従い,selectcardlist->tableを更新する.

②の場合,アプリ側ではZ.DeleteTableに選択領域を設定して,GCに送り,GCではそれをDLLに伝達する.DLL側ではDeleteTableの内容をTREEVIEW::selectcardlist->tableに転記する.④には全選択/選択反転がある.全選択では「有効なカード」がすべて選択され,選択の反転では「有効なカード」ー「選択されたカード」が選択状態になる.「有効なカード」とは一覧表表示範囲:系図画面上のカードに相当する.カードテーブル上のカード(CARDLINK)はselectcardlist->tableと同期するためのフラグselectflagを持っている.DLL側でselectcardlistの更新を行っている関数には以下がある.

  1. TREEVIEW::putSelectList ←CallPutSelectList
  2. TREEVIEW::selectAll ←CallSelectAll
  3. TREEVIEW::hitSelectNode ←TREEVIEW::LButtonUp
  4. TREEVIEW::selectNode ←TREEVIEW::LButtonUp
  5. TREEVIEW::getSelectList ←CallGetSelectList
  6. TOPOLOGY::RebuildCardList ←UNDOSYSTEM::UndoProcess,UNDOSYSTEM::CommandEnd

getSelectListはputSelectList の逆関数でアプリ側にselectcardlistの内容を返す関数だが,その前にカードテーブルをスキャンしてselectflagオンのカードをselectcardlist->tableに収集してから送付している.RebuildCardList はUNDOシステムで用いられる関数でカードのselectflagからselectcardlist->tableを復元している.系図画面で拡張選択したときの動作を見てみよう.初回だけは系図画面と一覧画面が同期していたが,後が続かない.なぜか?

LbuttonUpからselectcardlistを更新するところまでは問題ない.その後,Zelkova1_NodeClickが起動され,mZelkova::mGetSelectListを呼び出してZ.DeleteTableを更新している.Z.DeleteCountの値も正しい.一覧表の更新はUpdateSelectionで実行している.どうもどこかで選択が落とされている.ただし,Z.DeleteTableの中身は変化していない.

UpdateSelectionの中で落とされている.UpdateIndicatorで単選択に戻されている.動作不良の元凶はUpdateIndicatorだ.インジケータと呼んでいるのは,一覧表の最左列に表示される右矢印を意味している.選択操作に関連するが,インジケータの操作で単選択になってしまうというのはおかしい.UpdateIndicatorを実行しなければ,系図画面と一覧画面の選択状態は完全に同期している.

UpdateIndicatorから呼ばれるSetCurrentCellで単選択に落ちている.「現在のセルを変更すると DataGridView 選択範囲が変更される場合があります」ということのようだ.設定で回避できるのだろうか?現在の設定は以下のようになっている.

.SelectionMode = DataGridViewSelectionMode.FullRowSelect ‘つねに行全体を選択
.MultiSelect = True             ‘複数行の選択を許す
.AllowUserToDeleteRows = False
.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2

Selection Modes in the Windows Forms DataGridView Control によれば,「Note that changing the value of the CurrentCell property does not alter the current selection」となっているのだが…

UpdateSelectionでは以前は選択領域設定の前にUpdateIndicatorを実行していたのだが,「引数のカード参照番号が選択されていない場合がある@20180830」という理由で現在の位置に移動している.しかし,これでは完全に誤動作してしまうので,修正前の状態に戻すことにする.選択されていない参照番号を指定した場合には余分なカードが選択された状態になり,整合が取れなくなる可能性がある.CurrentCellを非選択にできるかどうかを調べてみよう.

問題なさそうだ.これで要求を満足する動作になった.複数選択動作でまだ一つだけ不十分な点がある.一覧表でインジケータの出ている行と,カード画面に表示されているカード,および系図画面で濃紺で表示されているカードは連動しているが,系図画面上で選択を落とす操作をしたときに濃紺で表示される「主選択カード」が消えてしまう場合がある.一覧表で操作した場合には問題ないように見える.

部分図で複数選択を実行して,getSelectListでCheckSelectListのエラーが起きた.getSelectListではカードテーブルからselectcardlistを作り直している.CheckSelectListでは有効カードのみをカウントしている.getSelectListでも同様処理するようにしてエラーは解消したが,有効でないカードの選択フラグはむしろ積極的に落とす必要がある.今度はTREEVIEW::hitSelectNodeで同様エラーが出た.

上記の修正は間違っている.「選択領域はカードの有効・無効とは無関係」というのがゼルコバの木の仕様だ.ただし,全選択と選択反転は有効カードのみが対象となる.⇒対処した.

図面種別を切り替えると系図画面が無選択状態になってしまう.系図画面の切り替えでは一度選択領域をリセットして,再描画する必要がある.系統並び替えの冒頭で実行されるTREEVIEW::InitTreeViewでsetSelcount(0)が実行されている.図面種別の切り替えでは必ず系統並び替えが必要になるから,ここでリセットされたのでは対処しようがない.GCに問い合わせできれば取得可能だが,上りインタフェースは存在しない.⇒InitTreeViewではsetSelcount(0)を実行しない代わりに,COUPLING::EraseFamilyTreeでリセットするようにした.

▲系統並び替えを実行して,GetHasseDiagramで「基準ノードが空」エラーが発生する.seedはFAMILYTREE::BaseLinkを含む成分リストで多重グラフ2の節点リストで探しているのだが… 通常の手順では発生しない.複数カードを選択し,そのうちの一つをCtrl+クリックで選択解除→ Ctrl+クリックで再選択してから系統並び替えで発生する.その後は図面種別の切り替えなどでも同じ事象が起きるようになる.

グラフをダンプしてみたが,確かに入っていない.ただし,これは上のような「手順」の問題ではなく,クラスタ図自体の問題だ.つまり,現行では終端ノードは世代番号の確定に関係がないという理由で省かれている.これは確かにまずいのではないだろうか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA