第30回 ステータスバーにエラーメッセージが表示され続けるようにする (タブブラウザーを作る)

tabbrowser120.gif
前回はスクリプトエラーが発生したとき、ステータスバーにエラーメッセージが表示されるようにした。しかしエラーが起きたことを保存していなかったためすぐにエラーメッセージが消えてしまうという問題があった。

今回はエラーが起きたことを記憶して、常にエラーメッセージが表示されるようにする。

ビュークラスにエラーが起きたことを保存するための変数_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;			//■追加
	}

tabbrowser121.gif
そしてエラーが起きたときに_bPageError をtrueにして、エラーが起きたことを保存し、エラー用のステータスバー用メッセージが表示されるようにする。

_bPageError がtrueのままだと、一度エラーがおきたらずっとエラーメッセージが表示されたままになってしまう。そのためDownloadBeginイベントを受け取ったらfalseを設定してエラー情報をクリアする。
	//ステータスバーのメッセージ変更をメインウインドウへ通知
	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;		//■追加 エラー情報をリセット
	}

tabbrowser122.gif せっかくなのでスクリプトエラーだけでなく、NavigateErrorを受信したときもエラーメッセージを表示するようにした。
	void __stdcall OnNavigateError(IDispatch *pDisp,VARIANT *vURL,VARIANT *vTargetFrameName,VARIANT *vStatusCode,VARIANT_BOOL *vbCancel)
	{
		//■2行追加
		_bPageError = true;			//スクリプトエラー出なくてもエラーが発生したらtrueにする
		ChangeStatusText(NULL);
	}

tabbrowser123.gif
これでビルド/実行するとステータスバーにエラーメッセージが表示され続けるようになった。

もう少しスクリプトエラー関連を修正しておきたい気もするが保留して、次回はアドレスバーにクリップボードから張り付けたURLが途切れる問題などを修正する。

プロジェクトファイルをダウンロード


カテゴリー「タブブラウザーを作る」 のエントリー