[3033]
Re4:ファイルの更新不具合
wmlhq(管理者による再投稿)
▼ ryojiさん
> ここは多少遅れてもタイマーでの更新検出に任せたほうが無難な気がします。
絶対反対! ここは、m_bBeginSelectの信頼性にかかわるので、直すべきです。
> ダイアログを閉じたあとで遅れてCEditViewにWM_LBUTTONDOWNが届くからでしょう。
> そこでm_bBeginSelectがTRUEにセットされる。
m_bBeginSelectは正解です。でも、次のSetFocusが悪さをしないか心配になります(他力本願モード)。
case WM_LBUTTONDOWN:
//case WM_RBUTTONDOWN:
::SetFocus( ::GetParent( m_hwndParent ) ); // これはWM_SETFOCUSを速達するんじゃないの?
if( m_nMyIndex != m_pcEditDoc->GetActivePane() ){
/* アクティブなペインを設定 */
m_pcEditDoc->SetActivePane( m_nMyIndex );
}
// MYTRACE( " WM_LBUTTONDOWN wParam=%08xh, x=%d y=%d\n", wParam, LOWORD( lParam ), HIWORD( lParam ) );
OnLBUTTONDOWN( wParam, (short)LOWORD( lParam ), (short)HIWORD( lParam ) ); // SetFocusの後でこれが呼ばれる。
return 0L;
そしてCEditWndの中で
case WM_SETFOCUS:
// MYTRACE( "WM_SETFOCUS\n" );
/* ファイルのタイムスタンプのチェック処理 */
m_cEditDoc.CheckFileTimeStamp();
/* 編集ウィンドウリストへの登録 */
CShareData::getInstance()->AddEditWndL
ist( m_hWnd );
/* メッセージの配送 */
lRes = m_cEditDoc.DispatchEvent( hwnd, uMsg, wParam, lParam );
ここでCheckFileTimeStampが呼ばれます。CheckFileTimeStampはダイアログをモーダルにしてスレッドを停止してしまいます。憶測では、ダイアログが閉じた後、スレッドはcase WM_LBUTTONDOWNのSetFocusの直後に戻り、OnLBUTTONDOWNを呼び、m_bBeginSelectをセットする。
ややこしい仕様なので、WM_LBUTTONDOWNとOnLBUTTONDOWNは区別して考えてください。