![]()
前回はスクリプトエラーが発生したとき、ステータスバーにエラーメッセージが表示されるようにした。しかしエラーが起きたことを保存していなかったためすぐにエラーメッセージが消えてしまうという問題があった。
今回はエラーが起きたことを記憶して、常にエラーメッセージが表示されるようにする。
ビュークラスにエラーが起きたことを保存するための変数_bPageError を追加する。
class CTabBrowser100View : public CWindowImpl<CTabBrowser100View, CAxWindow>
,public IDispEventImpl<SINKID_EVENTS, CTabBrowser100View, &DIID_DWebBrowserEvents2>
,public CIEUtility
{
CTabView* _pTabView; //タブビューを保持
HWND _hWndRebarIE; //IEツールバー用のリバー
bool _bPageError; //■追加 現在のページでスクリプトエラーなどがあればtrue、通常はfalse
public:
DECLARE_WND_SUPERCLASS(NULL, CAxWindow::GetWndClassName())
CTabBrowser100View(CTabView* pTabView,HWND hWndRebarIE)
{
_pTabView = pTabView;
_nLastProgress = 0;
_nLastProgressMax = -1;
_hWndRebarIE = hWndRebarIE;
_bPageError = false; //■追加
}
![]()
そしてエラーが起きたときに_bPageError をtrueにして、エラーが起きたことを保存し、エラー用のステータスバー用メッセージが表示されるようにする。
//ステータスバーのメッセージ変更をメインウインドウへ通知
void ChangeStatusText(LPCTSTR pszText)
{
_strLastStatusText = pszText; //いつでも参照できるようにクラスのメンバーに保存しておく
if(_pTabView == NULL || _pTabView->GetActivePage() != _pTabView->PageIndexFromHwnd(m_hWnd))
return; //このビューがアクティブでなければこれ以降処理しない
GetLastStatusText(_strLastStatusText); //■追加 この呼び出しによりエラー時にはエラー用メッセージに変わる
//メインウインドウに変更を通知する
GetTopLevelWindow().SendMessage(WM_DNP_CHANGESTATUSTEXT,(WPARAM)(LPCTSTR)_strLastStatusText);
}
void __stdcall OnStatusTextChange(BSTR bstrText)
{
ChangeStatusText((CAtlString)bstrText);
}
LRESULT OnDnpScriptError(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
_bPageError = true; //■追加 エラーが発生したことを保持
ChangeStatusText(NULL); //■変更
return 0;
}
//最後にIEコントロールから受け取ったステータスバー用メッセージを返す
void GetLastStatusText(CAtlString& strText)
{
strText = _strLastStatusText;
//■追加 表示する文字がないときで、現在ページにエラーがあればエラーメッセージを返す
if(_bPageError && strText == _T(""))
strText = _T("ページでエラーが発生しました。");
}
void __stdcall OnDownloadComplete()
{
}
void __stdcall OnCommandStateChange(long lCommand,VARIANT_BOOL vbEnable)
{
}
void __stdcall OnDownloadBegin(void)
{
_bPageError = false; //■追加 エラー情報をリセット
}
void __stdcall OnNavigateError(IDispatch *pDisp,VARIANT *vURL,VARIANT *vTargetFrameName,VARIANT *vStatusCode,VARIANT_BOOL *vbCancel)
{
//■2行追加
_bPageError = true; //スクリプトエラー出なくてもエラーが発生したらtrueにする
ChangeStatusText(NULL);
}
![]()
これでビルド/実行するとステータスバーにエラーメッセージが表示され続けるようになった。
もう少しスクリプトエラー関連を修正しておきたい気もするが保留して、次回はアドレスバーにクリップボードから張り付けたURLが途切れる問題などを修正する。
