DatabaseView.cpp
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:12k
- // DatabaseView.cpp : implementation file
- //
- #include "stdafx.h"
- #include "draw.h"
- #include "drawdoc.h"
- #include "selectdatadlg.h"
- #include "DatabaseView.h"
- #include "data1dlg.h"
- #include "sortdlg.h"
- #include "linkdlg.h"
- #include "filterdlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CDatabaseView
- IMPLEMENT_DYNCREATE(CDatabaseView, CScrollView)
- CDatabaseView::CDatabaseView()
- {
- nIndex=-1;
- sizeTotal.cx=sizeTotal.cy=300;
- sizePage.cx=sizePage.cy=300;
- sizeLine.cx=sizeLine.cy=10;
- nSelectData=0;
- }
- CDatabaseView::~CDatabaseView()
- {
- }
- BEGIN_MESSAGE_MAP(CDatabaseView, CScrollView)
- //{{AFX_MSG_MAP(CDatabaseView)
- ON_WM_SIZE()
- ON_WM_LBUTTONDOWN()
- ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
- ON_COMMAND(ID_RECORD_MODIFY, OnRecordModify)
- ON_COMMAND(ID_RECORD_FILTER, OnRecordFilter)
- ON_COMMAND(ID_RECORD_SORT, OnRecordSort)
- ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
- ON_COMMAND(ID_RECORD_LINK, OnRecordLink)
- ON_COMMAND(ID_RECORD_DELETE_ALL, OnRecordDeleteAll)
- ON_COMMAND(ID_FILE_SELECT, OnFileSelect)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDatabaseView drawing
- void CDatabaseView::OnInitialUpdate()
- {
-
- CDrawDoc* pDoc = GetDocument();
- m_pSet1=&pDoc->m_data1;
- m_pSet=pDoc->GetDataSet(nSelectData);
- m_pSet=&pDoc->m_data1;
- // m_pSet2=(CRecordSet *)&pDoc->m_data1;
- m_pLinkSet1=&pDoc->m_linkdata1;
- Init1();
- Init2();
- CScrollView::OnInitialUpdate();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- //CSize sizeTotal;
- }
- void CDatabaseView::Init1()
- {
- TEXTMETRIC tm;
- CDC* dc=GetDC();
- dc->GetTextMetrics(&tm);
- ReleaseDC(dc);
- nCharHeight=tm.tmHeight+2;
- nCharWidth=tm.tmAveCharWidth+2;
- if(m_pSet->IsOpen())
- m_pSet->Close();
- m_pSet->Open();
- nField=m_pSet->GetODBCFieldCount();
- CODBCFieldInfo fieldinfo1;
- CODBCFieldInfo& fieldinfo=fieldinfo1;
- for(int i=0;i<nField;i++)
- {
- m_pSet->GetODBCFieldInfo(i,fieldinfo);
- nFieldWide[i]=(short)fieldinfo1.m_nPrecision;
- }
- nScreenWide=0;
- nFieldStart[0]=0;
- for(i=0;i<nField;i++)
- {
- nScreenWide=nScreenWide+nFieldWide[i]*nCharWidth;
- nFieldStart[i+1]=nFieldStart[i]+nFieldWide[i]*nCharWidth;
- }
- sizeTotal.cx=nScreenWide;
- sizeLine.cx=nCharWidth*5;
- }
- void CDatabaseView::Init2()
- {
- if(m_pSet->IsOpen())
- m_pSet->Close();
- m_pSet->Open();
- if(m_pSet->IsBOF())
- nRecord=0;
- else
- {
- m_pSet->MoveFirst();
- nRecord=0;
- while(!m_pSet->IsEOF())
- {
- m_pSet->MoveNext();
- nRecord++;
- }
- }
- nScreenHeight=nRecord*nCharHeight;
- if(nScreenHeight==0)
- nScreenHeight=20;
- sizeTotal.cy=nScreenHeight;
- sizeLine.cy=nCharHeight+2;
- if(nRecord>0)
- {
- if(nIndex<1||nIndex>nRecord)
- nIndex=1;
- }
- else
- nIndex=-1;
- // SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- }
- /*void CDatabaseView::Init()
- {
- TEXTMETRIC tm;
- CDC* dc=GetDC();
- dc->GetTextMetrics(&tm);
- ReleaseDC(dc);
- nCharHeight=tm.tmHeight+2;
- nCharWidth=tm.tmAveCharWidth+2;
- if(m_pSet1->IsOpen())
- m_pSet1->Close();
- // m_pSet1->m_strFilter="only_id>0";
- m_pSet1->Open();
- if(m_pSet1->IsBOF())
- nRecord=0;
- else
- {
- m_pSet1->MoveFirst();
- nRecord=0;
- while(!m_pSet1->IsEOF())
- {
- m_pSet1->MoveNext();
- nRecord++;
- }
- }
- nField=m_pSet1->GetODBCFieldCount();
- CODBCFieldInfo fieldinfo1;
- CODBCFieldInfo& fieldinfo=fieldinfo1;
- //nRecord=m_pSet1->GetRecordCount();
- for(int i=0;i<nField;i++)
- {
- m_pSet1->GetODBCFieldInfo(i,fieldinfo);
- nFieldWide[i]=(short)fieldinfo1.m_nPrecision;
- }
- nScreenHeight=nRecord*nCharHeight;
- nScreenWide=0;
- nFieldStart[0]=0;
- for(i=0;i<nField;i++)
- {
- nScreenWide=nScreenWide+nFieldWide[i]*nCharWidth;
- nFieldStart[i+1]=nFieldStart[i]+nFieldWide[i]*nCharWidth;
- }
- if(nScreenHeight==0)
- nScreenHeight=20;
- if(nRecord>0)
- nIndex=1;
- else
- nIndex=-1;
- sizeTotal.cx=nScreenWide;
- sizeTotal.cy=nScreenHeight;
- // TODO: calculate the total size of this view
- sizeLine.cx=nCharWidth*5;
- sizeLine.cy=nCharHeight+2;
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- }
- */
- void CDatabaseView::OnDraw(CDC* pDC)
- {
- CRect r1;
- CDrawDoc* pDoc = GetDocument();
- CPen pen1(0,1,RGB(255,0,0));
- // CPen* pOldPen=ht.SelectObject(&pen1);
- pDC->SetTextColor(RGB(255,0,0));
- CString c1;
- CString& c2=c1;
- pDC->SetMapMode(1);
- m_pSet->MoveFirst();
- for(int i=0;i<nRecord;i++)
- {
- for(int j=0;j<nField;j++)
- {
- m_pSet->GetFieldValue(j,c2);
- pDC->TextOut(nFieldStart[j],i*nCharHeight,c1);
- }
- m_pSet->MoveNext();
- }
- if(nIndex>0)
- {
- GetRect(nIndex,&r1);
- pDC->InvertRect(&r1);
- }
- // pDC->SelectObject(pOldPen);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CDatabaseView diagnostics
- #ifdef _DEBUG
- void CDatabaseView::AssertValid() const
- {
- CScrollView::AssertValid();
- }
- void CDatabaseView::Dump(CDumpContext& dc) const
- {
- CScrollView::Dump(dc);
- }
- CDrawDoc* CDatabaseView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc)));
- return (CDrawDoc*)m_pDocument;
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CDatabaseView message handlers
- void CDatabaseView::OnSize(UINT nType, int cx, int cy)
- {
- CScrollView::OnSize(nType, cx, cy);
- // TODO: Add your message handler code here
- sizePage.cx=cx;
- sizePage.cy=cy;
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- }
- void CDatabaseView::OnLButtonDown(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CRect r1;
- CClientDC ht(this);
- OnPrepareDC(&ht);
- ht.DPtoLP(&point);
- int nIndex1=point.y/nCharHeight+1;
- if(nIndex1!=nIndex&&nIndex1>0&&nIndex1<=nRecord)
- {
- if(nIndex>0)
- {
- GetRect(nIndex,&r1);
- ht.InvertRect(&r1);
- }
- GetRect(nIndex1,&r1);
- ht.InvertRect(&r1);
- nIndex=nIndex1;
- }
- CScrollView::OnLButtonDown(nFlags, point);
- }
- void CDatabaseView::GetRect(int nRow, CRect *r1)
- {
- r1->left=0;
- r1->right=nFieldStart[nField-1]+nFieldWide[nField-1]*nCharWidth;
- r1->top=(nRow-1)*nCharHeight;
- r1->bottom=r1->top+nCharHeight;
- }
- void CDatabaseView::OnRecordAdd()
- {
- // TODO: Add your command handler code here
- CDrawDoc* pDoc=GetDocument();
- if(m_pSet->IsOpen())
- m_pSet->Close();
- int ID=pDoc->DataInfo[nSelectData].only_ID;
- if(ID==1)
- {
- CData1Dlg dlg(m_pSet1,1,GetOnlyID());
- if(dlg.DoModal()==IDOK)
- {
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- UpdateWindow();
- Invalidate();
- }
- }
- else if(ID==2)
- {
- // CData2Dlg dlg(m_pSet2,1,GetOnlyID());
- CData1Dlg dlg(m_pSet1,1,GetOnlyID());
- if(dlg.DoModal()==IDOK)
- {
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- UpdateWindow();
- Invalidate();
- }
- }
- }
- /*int CDatabaseView::GetOnlyID()
- {
- int *Index1,id;
- Index1= GetDocument()->m_Index;
- CString m_str1=m_pSet1->m_strFilter;
- m_pSet1->m_strFilter="";
- if(m_pSet1->IsOpen())
- m_pSet1->Close();
- m_pSet1->Open();
- for(int i=0;i<20000;i++)
- Index1[i]=0;
- while(!m_pSet1->IsEOF())
- {
- Index1[m_pSet1->m_only_id]=1;
- m_pSet1->MoveNext();
- }
- for(i=0;i<20000;i++)
- {
- if(Index1[i]==0)
- {
- id=i;
- break;
- }
- }
- m_pSet1->Close();
- m_pSet1->m_strFilter=m_str1;
- m_pSet1->Open();
- return id;
- }
- */
- /*
- int CDatabaseView::GetOnlyID()
- {
- int *Index1,id;
- Index1= GetDocument()->m_Index;
- CString m_str1=m_pSet->m_strFilter;
- m_pSet->m_strFilter="";
- if(m_pSet->IsOpen())
- m_pSet->Close();
- m_pSet->Open();
- for(int i=0;i<20000;i++)
- Index1[i]=0;
- while(!m_pSet->IsEOF())
- {
- Index1[m_pSet->GetID()]=1;
- m_pSet->MoveNext();
- }
- for(i=0;i<20000;i++)
- {
- if(Index1[i]==0)
- {
- id=i;
- break;
- }
- }
- m_pSet->Close();
- m_pSet->m_strFilter=m_str1;
- m_pSet->Open();
- return id;
- }
- */
- int CDatabaseView::GetOnlyID()
- {
- int *Index1,id;
- Index1= GetDocument()->m_Index;
- CString m_str1=m_pSet->m_strFilter;
- m_pSet->m_strFilter="";
- if(m_pSet->IsOpen())
- m_pSet->Close();
- m_pSet->Open();
- for(int i=0;i<20000;i++)
- Index1[i]=0;
- CString c1;
- CString& c2=c1;
- i=0;
- m_pSet->GetFieldValue(i,c2);
- while(!m_pSet->IsEOF())
- {
- Index1[atoi(c1)]=1;
- m_pSet->MoveNext();
- }
- for(i=0;i<20000;i++)
- {
- if(Index1[i]==0)
- {
- id=i;
- break;
- }
- }
- m_pSet->Close();
- m_pSet->m_strFilter=m_str1;
- m_pSet->Open();
- return id;
- }
- void CDatabaseView::OnRecordModify()
- {
- // TODO: Add your command handler code here
- CDrawDoc* pDoc=GetDocument();
- if(nIndex<=0&&nIndex>nRecord)
- return;
- CString m_str1=m_pSet->m_strFilter;
- CString m_str2=m_pSet->m_strSort;
- if(m_pSet->IsOpen())
- m_pSet->Close();
- int ID=pDoc->DataInfo[nSelectData].only_ID;
- if(ID==1)
- {
- if(m_pSet1->IsOpen())
- m_pSet1->Close();
- m_pSet1->m_strFilter=m_str1;
- m_pSet1->m_strSort=m_str2;
- m_pSet1->Open();
- m_pSet1->MoveFirst();
- m_pSet1->Move(nIndex-1);
- CData1Dlg dlg(m_pSet1,0,0);
- if(dlg.DoModal())
- {
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- }
- }
- else if(ID==2)
- {
- /* if(m_pSet2->IsOpen())
- m_pSet2->Close();
- m_pSet2->m_strFilter=m_str1;
- m_pSet2->m_strSort=m_str2;
- m_pSet2->Open();
- m_pSet2->MoveFirst();
- m_pSet2->Move(nIndex-1);
- CData2Dlg dlg(m_pSet2,0,0);*/
- CData1Dlg dlg(m_pSet1,0,0);
- if(dlg.DoModal())
- {
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- }
- }
- }
- void CDatabaseView::OnRecordFilter()
- {
- // TODO: Add your command handler code here
- CFilterDlg dlg(m_pSet);
- if(dlg.DoModal()==IDOK)
- {
- m_pSet->m_strFilter=dlg.m_strFilter;
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- }
- }
- void CDatabaseView::OnRecordSort()
- {
- // TODO: Add your command handler code here
- CSortDlg pDg1(m_pSet);
- if(pDg1.DoModal()==IDOK)
- {
- if(m_pSet->IsOpen())
- m_pSet->Close();
- m_pSet->m_strSort=pDg1.m_strSort;
- m_pSet->Open();
- Invalidate();
- }
- }
- void CDatabaseView::OnRecordDelete()
- {
- // TODO: Add your command handler code here
- if(nIndex<1||nIndex>nRecord)
- return;
- if(!m_pSet->IsOpen())
- m_pSet->Open();
- m_pSet->MoveFirst();
- m_pSet->Move(nIndex-1);
- m_pSet->Delete();
- CPoint p1;
- p1=GetScrollPosition();
- sizeTotal.cy-=nCharHeight;
- if(nIndex==nRecord)
- nIndex--;
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- ScrollToPosition(p1);
- }
- void CDatabaseView::OnRecordLink()
- {
- // TODO: Add your command handler code here
- CDrawDoc* pDoc=GetDocument();
- m_pSet1->MoveFirst();
- m_pSet1->Move(nIndex-1);
- CString m_str;
- m_str="(database_id=";
- short lb=pDoc->GetDataID(nSelectData);
- if(lb<0)
- return;
- char p1[9];
- sprintf(p1,"%d",lb);
- m_str+=p1;
- m_str+=") AND (record_id=";
- int ID=m_pSet->GetID();
- sprintf(p1,"%d",ID);
- m_str+=p1;
- m_str+=")";
- m_pLinkSet1->m_strFilter=m_str;
- CLinkDlg pDlg1(GetDocument(),m_pLinkSet1,1,lb,ID);
- pDlg1.DoModal();
- }
- void CDatabaseView::OnRecordDeleteAll()
- {
- if(!m_pSet->IsOpen())
- m_pSet->Open();
- for(int i=nRecord-1;i>=0;i--)
- {
- m_pSet->MoveFirst();
- m_pSet->Move(i);
- m_pSet->Delete();
- }
- nIndex=-1;
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- }
- void CDatabaseView::OnFileSelect()
- {
- // TODO: Add your command handler code here
- CDrawDoc* pDoc = GetDocument();
- CSelectDataDlg pDlg1(pDoc,nSelectData);
- if(pDlg1.DoModal()==IDOK)
- {
- int nn=pDlg1.m_Index;
- if(nn!=nSelectData)
- {
- if(m_pSet->IsOpen())
- m_pSet->Close();
- nSelectData=nn;
- m_pSet=pDoc->GetDataSet(nSelectData);
- m_pSet->Open();
- nIndex=-1;
- Init1();
- Init2();
- SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
- Invalidate();
- }
- }
- }