⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childfrm.cpp

📁 Interactive SQL Tool
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		UNUSED_ALWAYS(lParam);

		CMSFlexGrid* pGridCtrl = NULL;
		try
		{
			pGridCtrl = new CMSFlexGrid();
			ASSERT(pGridCtrl != NULL);
			m_ThreadParam.m_pGridCtrl = NULL;
			m_ThreadParam.m_ptrGridCtrl = NULL;
			CRect rect(0, 0, 0, 0);
			m_pResultView->GetWindowRect(&rect);
			if(!pGridCtrl->Create(g_lpszProgID, WS_CHILD | WS_VISIBLE | WS_HSCROLL |
				WS_VSCROLL, rect, m_pResultView, m_nID++, NULL, FALSE,
				L"72E67120-5959-11cf-91F6-C2863C385E30"))
			{
				TRACE(_T("Failed to create GridCtrl.\n"));
				lResult = -1L;
			}
			else
			{
				pGridCtrl->ShowWindow(SW_HIDE);
			
				m_GridList.AddTail(pGridCtrl);
				m_nGridCount = m_GridList.GetCount();
				if(m_nGridCount == 1)
					if(GetFocus() == m_pResultView)
						m_pQryView->SetFocus();

				m_ThreadParam.m_pGridCtrl = pGridCtrl;
				m_ThreadParam.m_ptrGridCtrl = pGridCtrl->GetControlUnknown();
				if(m_nIndex == 0)
					m_pResultView->m_pGridCtrl = pGridCtrl;

				m_ThreadParam.m_ptrGridCtrl->put_BackColorBkg(
					(unsigned long)RGB(255, 255, 255)
					);
				m_ThreadParam.m_ptrGridCtrl->put_BorderStyle(
					MSFlexGridLib::flexBorderNone
					);
				m_ThreadParam.m_ptrGridCtrl->put_AllowUserResizing(
					MSFlexGridLib::flexResizeColumns
					);
				m_ThreadParam.m_ptrGridCtrl->put_FocusRect(
					MSFlexGridLib::flexFocusNone
					);
				m_ThreadParam.m_ptrGridCtrl->put_HighLight(
					MSFlexGridLib::flexHighlightAlways
					);
				m_ThreadParam.m_ptrGridCtrl->put_ScrollBars(
					MSFlexGridLib::flexScrollBarBoth
					);
				
				if(m_GridFont.m_lf.lfHeight != 0)
				{
					COleFont font(pGridCtrl->GetFont());
					font.SetBold(m_GridFont.m_bIsBold);
					font.SetCharset(m_GridFont.m_lf.lfCharSet);
					font.SetItalic(m_GridFont.m_lf.lfItalic);
					font.SetName(m_GridFont.m_strFaceName);
					CY cy;
					cy.Lo = m_GridFont.m_nSize;
					cy.Hi = 0;
					cy.int64 = cy.Lo;
					font.SetSize(cy);
					font.SetUnderline(m_GridFont.m_lf.lfUnderline);
					font.SetWeight(m_GridFont.m_lf.lfWeight);
				}
				
				m_ThreadParam.m_ptrGridCtrl->put_Cols(0);
				m_ThreadParam.m_ptrGridCtrl->put_Rows(1);
				m_ThreadParam.m_ptrGridCtrl->put_Cols(wParam);

				if(m_nGridCount == 2)
				{
					POSITION pos = m_GridList.FindIndex(m_nIndex);
					if(pos != NULL)
					{
						++m_nIndex;
						if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
							DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), m_nIndex);
						
						bool bOkUI = true;
						if(m_bCloseMainFrameAfterCancel)
							bOkUI = false;
						if(m_bDisconnectAllAfterCancel)
							bOkUI = false;
						if(m_bCloseAfterCancel)
							bOkUI = false;
						if(bOkUI)
						{
							LONG lIdle = 0;
							while(AfxGetApp()->OnIdle(lIdle++));
						}
					}
				}
				
				pGridCtrl->MoveWindow(0, 0, rect.Width(), rect.Height());
			}
		}
		catch(COleDispatchException* e)
		{
			lResult = -1L;
			
			if(e)
				e->Delete();
		}
		catch(const _com_error& e)
		{
			lResult = -1L;

			TRACE(_T("%s\n"), (LPCTSTR)GetComError(e));
		}
		catch(...)
		{
			lResult = -1L;
		}

		if(lResult == -1L)
		{
			if(pGridCtrl != NULL)
			{
				pGridCtrl->DestroyWindow();
				delete pGridCtrl;
				pGridCtrl = NULL;
			}
		}
	}
	
	return lResult;
}

LONG CChildFrame::OnSetGridRows(UINT wParam, LONG lParam)
{
	LRESULT lResult = 0L;
	
	if(::IsWindow(m_hWnd))
	{
		UNUSED_ALWAYS(lParam);

		try
		{
			if(m_ThreadParam.m_ptrGridCtrl != NULL)
			{
				m_pResultView->SetRedraw(FALSE);
				
				HRESULT hr = m_ThreadParam.m_ptrGridCtrl->put_Redraw(FALSE);
				if(FAILED(hr))
					_com_issue_error(hr);
				
				hr = m_ThreadParam.m_ptrGridCtrl->put_Rows(wParam);
				if(FAILED(hr))
					_com_issue_error(hr);
				
				hr = m_ThreadParam.m_ptrGridCtrl->put_Redraw(TRUE);
				if(FAILED(hr))
					_com_issue_error(hr);
				
				m_pResultView->SetRedraw(TRUE);
				if(m_nGridCount == 1)
					if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
						m_ThreadParam.m_pGridCtrl->ShowWindow(SW_SHOW);
			}
		}
		catch(const _com_error& e)
		{
			lResult = -1L;

			TRACE(_T("%s\n"), (LPCTSTR)GetComError(e));
		}
		catch(...)
		{
			lResult = -1L;
		}
	}

	return lResult;
}

void CChildFrame::OnViewMessages() 
{
	if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
	{
		HideResultSets();
		
		m_pResultView->GetRichEditCtrl().SetWindowText(m_strMessages.c_str());
		m_strStatusText = g_szMessages;
	}
	else
	{
		if(m_strProcText.length())
		{
			m_pResultView->SetWrapNone();
			m_pResultView->GetRichEditCtrl().SetWindowText(m_strProcText.c_str());
			m_pResultView->GetRichEditCtrl().SetSel(0, 0); // Scroll up!
			m_strStatusText.Format(
				_T("# of lines of text: %d"),
				m_pResultView->GetRichEditCtrl().GetLineCount()
				);
		}
		else
		{
			int nCurrentSet = 1;
			if(m_nIndex != 0)
				nCurrentSet = m_nIndex;
			POSITION pos = m_GridList.FindIndex(nCurrentSet-1);
			if(pos == NULL)
			{
				m_pResultView->GetRichEditCtrl().SetWindowText(NULL);
				m_strStatusText = "Results grid #0 of 0; 0 row(s); 0 col(s)";
			}
			else
			{
				CMSFlexGrid* pGrid = (CMSFlexGrid*)m_GridList.GetAt(pos);
				if(pGrid != NULL)
					DisplayResults(pGrid, nCurrentSet);
			}
		}
	}
	m_pResultView->Invalidate();
	m_pResultView->UpdateWindow();
}

void CChildFrame::OnUpdateViewMessages(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_lConnectionState == ADODB::adStateOpen && m_strMessages.length());
	pCmdUI->SetCheck(!m_strStatusText.CompareNoCase(g_szMessages) &&
		m_lConnectionState == ADODB::adStateOpen && m_strMessages.length());
}

bool CChildFrame::SelectDataBaseEx()
{
	bool bRet = true;
	
	CloseRecordset();

	try
	{
		long lOption = ADODB::adCmdText;
		_bstr_t bstr = L"select db_name()";
		HRESULT hr = m_ptrRecordset->Open(
				bstr,
				m_ptrConnection.GetInterfacePtr(),
				ADODB::adOpenForwardOnly,
				ADODB::adLockReadOnly,
				lOption
				);
		if(FAILED(hr))
			_com_issue_error(hr);
		
		if(m_ptrRecordset->State != ADODB::adStateClosed)
		{
			if(!m_ptrRecordset->adoBOF)
			{
				_bstr_t bstrDBName = (_bstr_t)m_ptrRecordset->
					Fields->GetItem((long)0)->Value;
				
				ADODB::PropertiesPtr ptrProperties = m_ptrConnection->GetProperties();
				HRESULT hr = ptrProperties->Refresh();
				if(FAILED(hr))
					_com_issue_error(hr);
				
				ADODB::PropertyPtr ptrProperty = ptrProperties->GetItem("Current Catalog");
				hr = ptrProperty->put_Value(_variant_t((LPCTSTR)bstrDBName));
				if(FAILED(hr))
					_com_issue_error(hr);
				m_comboBox.SelectString(-1, (m_strDBName = (LPCTSTR)bstrDBName));
			}
		}
	}
	catch(const _com_error& e)
	{
		CString sMsg = GetProviderError();
		if(!sMsg.IsEmpty())
			TRACE(_T("%s\n"), (LPCTSTR)sMsg);
		else
		{
			sMsg = GetComError(e);
			TRACE(_T("%s\n"), (LPCTSTR)sMsg);
		}

		bRet = false;
	}
	catch(...)
	{
		TRACE(_T("Errors occurred.\n"));
	}
	
	CloseRecordset();

	return bRet;
}

void CChildFrame::OnTimer(UINT nIDEvent) 
{
	if(m_nTimerID != nIDEvent)
		CMDIChildWnd::OnTimer(nIDEvent);
	else
	{
		if(m_bExecuting)
		{
			SetExecutionTime();
			if(!m_bProcText)
				SetResultSetInfo();
		}
	}
}

void CChildFrame::SetResultSetInfo()
{
	if(m_strStatusText.CompareNoCase(g_szMessages) != 0)
	{
		int nCurrentSet = 1;
		if(m_nIndex != 0)
			nCurrentSet = m_nIndex;
		POSITION pos = m_GridList.FindIndex(nCurrentSet-1);
		if(pos != NULL)
		{
			CMSFlexGrid* pGrid = (CMSFlexGrid*)m_GridList.GetAt(pos);
			if(pGrid != NULL)
			{
				m_strStatusText.Format(_T("Results grid #%d of %d; %d row(s); %d col(s)"),
					nCurrentSet, m_nGridCount, pGrid->GetRows()-1, pGrid->GetCols());
				m_wndStatusBar.SetPaneText(m_nResultSetPaneNo, m_strStatusText);
			}
		}
	}
}

void CChildFrame::CloseRecordset()
{
	try
	{
		if(m_ptrRecordset->State != ADODB::adStateClosed)
		{
			HRESULT hr = m_ptrRecordset->Close();
			if(FAILED(hr))
				_com_issue_error(hr);
		}
	}
	catch(const _com_error& e)
	{
		CString sMsg = GetProviderError();
		if(sMsg.IsEmpty())
			sMsg = GetComError(e);

		TRACE(_T("%s\n"), (LPCTSTR)sMsg);
	}
	catch(...)
	{
		TRACE(_T("Errors occurred.\n"));
	}
}

void CChildFrame::OnSetDbcomboFocus() 
{
	m_comboBox.SetFocus();
}

void CChildFrame::PostNcDestroy() 
{
	CWaitCursor wait;

	ClearGridList();

	if(m_font.m_hObject != NULL)
	{
		m_font.Detach();
		m_font.m_hObject = NULL;
	}

	try
	{
		HRESULT hr = S_OK;
		if(m_ptrConnection != NULL)
		{
			hr = m_ptrConnection->Close();
			if(FAILED(hr))
				_com_issue_error(hr);
		}
		
		if(m_ptrCommand != NULL)
		{
			m_ptrCommand.Release();
			m_ptrCommand = NULL;
		}

		if(m_ptrRecordset != NULL)
		{
			m_ptrRecordset.Release();
			m_ptrRecordset = NULL;
		}

		if(m_ptrConnection != NULL)
		{
			try
			{
				hr = ClearConnectionEvents();
				if(FAILED(hr))
					_com_issue_error(hr);
			}
			catch(const _com_error& e)
			{
				CString sMsg = GetProviderError();
				if(sMsg.IsEmpty())
					sMsg = GetComError(e);

				TRACE(_T("ClearConnectionEvents: %s\n"), (LPCTSTR)sMsg);
				
				try
				{
					if(m_pCE != NULL)
					{
						delete m_pCE;
						m_pCE = NULL;
					}
				}
				catch(...)
				{
				}
			}
			catch(...)
			{
				TRACE(_T("Errors occurred.\n"));

				try
				{
					if(m_pCE != NULL)
					{
						delete m_pCE;
						m_pCE = NULL;
					}
				}
				catch(...)
				{
				}
			}

			m_ptrConnection.Release();
			m_ptrConnection = NULL;
		}
	}
	catch(const _com_error& e)
	{
		CString sMsg = GetProviderError();
		if(sMsg.IsEmpty())
			sMsg = GetComError(e);

		TRACE(_T("%s\n"), (LPCTSTR)sMsg);
	}
	catch(...)
	{
		TRACE(_T("Errors occurred.\n"));
	}

	if(m_nTimerID != 0)
	{
		if(::IsWindow(this->m_hWnd))
			KillTimer(m_nTimerID);

		m_nTimerID = 0;
	}

	if(m_pThreadCancelSQL != NULL &&
		AfxIsValidAddress(m_pThreadCancelSQL, sizeof(m_pThreadCancelSQL)) &&
		m_pThreadCancelSQL->m_hThread != NULL)
	{
		m_pThreadCancelSQL->PostThreadMessage(WM_QUIT, 0L, 0L);
		::WaitForSingleObject(m_pThreadCancelSQL->m_hThread, 30000);
	}

	if(m_pThreadExecuteSQL != NULL &&
		AfxIsValidAddress(m_pThreadExecuteSQL, sizeof(m_pThreadExecuteSQL)) &&
		m_pThreadExecuteSQL->m_hThread != NULL)
	{
		m_pThreadExecuteSQL->PostThreadMessage(WM_QUIT, 0L, 0L);
		::WaitForSingleObject(m_pThreadExecuteSQL->m_hThread, 30000);
	}
		
	CMDIChildWnd::PostNcDestroy();
}

void CChildFrame::OnClose() 
{
	bool bOKToClose = true;
	if(m_bCanceling)
		m_bCloseAfterCancel = TRUE;
	else
	{
		if(IsIconic())
			ShowWindow(SW_SHOWNORMAL);

		if(!m_strSQL.IsEmpty() || m_bExecuting)
		{
			CString sMsg = "A query execution is in progress. Are you sure you wish to cancel this query?";
			if(AfxMessageBox(sMsg, MB_YESNO | MB_ICONQUESTION) == IDNO)
				bOKToClose = false;
			else
			{
				if(!m_bCanceling)
				{
					m_bCloseAfterCancel = TRUE;
					CancelQuery();
					bOKToClose = false;
				}
			}
		}
	}

	if(m_bCanceling)
		if(!m_bCanceled)
			bOKToClose = false;

	if(bOKToClose)
		CMDIChildWnd::OnClose();
}

/////////////////////////////////////////////////////////////////////////////
// ADO Events

HRESULT CChildFrame::SetConnectionEvents()
{
	IConnectionPointContainer* pCPC = NULL;
	HRESULT hr = m_ptrConnection->QueryInterface(
		IID_IConnectionPointContainer, (LPVOID*)&pCPC
		);
	if(FAILED(hr))
		return hr;
	
	IConnectionPoint* pCP = NULL;
	hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
	pCPC->Release();
	if(FAILED(hr))
		return hr;
	m_pCE = new CQryToolConnectionEvents(this);
	hr = pCP->Advise(m_pCE, &m_dwCnEvents);
	pCP->Release();
	
	return hr;
}

HRESULT CChildFrame::ClearConnectionEvents()
{
	IConnectionPointContainer* pCPC = NULL;
	HRESULT hr = m_ptrConnection->QueryInterface(
		IID_IConnectionPointContainer, (LPVOID *) &pCPC
		);
	if(FAILED(hr))
		return hr;

	IConnectionPoint* pCP = NULL;
	hr =  pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
	pCPC->Release();
	if(FAILED(hr))
		return hr;
	hr = pCP->Unadvise(m_dwCnEvents);
	pCP->Release();

	return hr;
}

/////////////////////////////////////////////////////////////////////////////
// Helpers for saving/restoring font state

void CChildFrame::GetProfileFont(LPCTSTR szSec, LOGFONT* plf, const bool& bGrid, 
	BOOL* pIsBold, int* pSize)
{
	CWinApp* pApp = AfxGetApp();
	plf->lfHeight = pApp->GetProfileInt(szSec, g_szHeight, 0);
	if(plf->lfHeight != 0)
	{
		plf->lfWeight = pApp->GetProfileInt(szSec, g_szWeight, 0);
		plf->lfItalic = (BYTE)pApp->GetProfileInt(szSec, g_szItalic, 0);
		plf->lfUnderline = (BYTE)pApp->GetProfileInt(szSec, g_szUnderline, 0);
		plf->lfPitchAndFamily = (BYTE)pApp->GetProfileInt(szSec, g_szPitchAndFamily, 0);
		plf->lfCharSet = (BYTE)pApp->GetProfileInt(szSec, g_szCharSet, DEFAULT_CHARSET);
		CString strFont = pApp->GetProfileString(szSec, g_szFaceName, g_szSystem);
		lstrcpyn((TCHAR*)plf->lfFaceName, strFont, sizeof(plf->lfFaceName));
		plf->lfFaceName[sizeof(plf->lfFaceName)-1] = 0;
		
		if(bGrid)
		{
			*pIsBold = pApp->GetProfileInt(szSec, g_szBold, 0);
			*pSize = pApp->GetProfileInt(szSec, g_szSize, 0);
		}
	}
}

void CChildFrame::WriteProfileFont(LPCTSTR szSec, const LOGFONT* plf,
	const bool& bGrid, BOOL* pIsBold, int* pSize)
{
	if(plf->lfHeight != 0)
	{
		CWinApp* pApp = AfxGetApp();
		pApp->WriteProfileInt(szSec, g_szHeight, plf->lfHeight);
		pApp->WriteProfileInt(szSec, g_szWeight, plf->lfWeight);
		pApp->WriteProfileInt(szSec, g_szItalic, plf->lfItalic);
		pApp->WriteProfileInt(szSec, g_szUnderline, plf->lfUnderline);
		pApp->WriteProfileInt(szSec, g_szPitchAndFamily, plf->lfPitchAndFamily);
		pApp->WriteProfileInt(szSec, g_szCharSet, plf->lfCharSet);
		pApp->WriteProfileString(szSec, g_szFaceName, (LPCTSTR)plf->lfFaceName);

		if(bGrid)
		{
			pApp->WriteProfileInt(szSec, g_szBold, *pIsBold);
			pApp->WriteProfileInt(szSec, g_szSize, *pSize);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -