SortDlg.cpp
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // SortDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "draw.h"
  5. #include "data1ret.h"
  6. #include "SortDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSortDlg dialog
  14. CSortDlg::CSortDlg(CDataBaseSet* pSet,CWnd* pParent /*=NULL*/)
  15. : CDialog(CSortDlg::IDD, pParent)
  16. {
  17. //{{AFX_DATA_INIT(CSortDlg)
  18. // NOTE: the ClassWizard will add member initialization here
  19. //}}AFX_DATA_INIT
  20. m_pSet=pSet;
  21. if(!m_pSet->IsOpen())
  22. m_pSet->Open();
  23. m_strSort=m_pSet->m_strSort;
  24. m_NumbField=m_pSet->GetODBCFieldCount();
  25. CODBCFieldInfo fieldinfo1;
  26. CODBCFieldInfo& fieldinfo=fieldinfo1;
  27. for(int i=0;i<m_NumbField;i++)
  28. {
  29. m_pSet->GetODBCFieldInfo(i,fieldinfo);
  30. pFieldInfo[i]=fieldinfo1;
  31. }
  32. m_NumbSort=0;
  33. }
  34. void CSortDlg::DoDataExchange(CDataExchange* pDX)
  35. {
  36. CDialog::DoDataExchange(pDX);
  37. //{{AFX_DATA_MAP(CSortDlg)
  38. // NOTE: the ClassWizard will add DDX and DDV calls here
  39. //}}AFX_DATA_MAP
  40. }
  41. BEGIN_MESSAGE_MAP(CSortDlg, CDialog)
  42. //{{AFX_MSG_MAP(CSortDlg)
  43. ON_BN_CLICKED(IDC_SORT_ADD, OnSortAdd)
  44. ON_BN_CLICKED(IDC_SORT_DELETE, OnSortDelete)
  45. ON_BN_CLICKED(IDC_SORT_INSERT, OnSortInsert)
  46. ON_BN_CLICKED(IDC_SORT_MODIFY, OnSortModify)
  47. ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CSortDlg message handlers
  52. BOOL CSortDlg::OnInitDialog() 
  53. {
  54. CDialog::OnInitDialog();
  55. plist1=(CListBox *)GetDlgItem(IDC_LIST1);
  56. pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
  57. plist1->ResetContent();
  58. pcom1->ResetContent();
  59. BreakSortStr(m_strSort);
  60. CString m_str;
  61. for(int i=0;i<m_NumbSort;i++)
  62. {
  63. if(b_Sort[i])
  64. m_str="↑    ";
  65. else
  66. m_str="↓    ";
  67. m_str+=strSort[i];
  68. plist1->AddString(m_str);
  69. }
  70. MakeStr();
  71. for(i=0;i<m_NumbField;i++)
  72. pcom1->AddString(pFieldInfo[i].m_strName);
  73. return TRUE;  // return TRUE unless you set the focus to a control
  74.               // EXCEPTION: OCX Property Pages should return FALSE
  75. }
  76. int CSortDlg::BreakSortStr(CString m_str)
  77. {
  78. int nChar;
  79. m_str.TrimLeft();
  80. m_str.TrimRight();
  81. nChar=m_str.GetLength();
  82. CString m_str1=m_str;
  83. CString m_str2;
  84. int nStart;
  85. nStart=0;
  86. m_NumbSort=0;
  87. int n;
  88. do
  89. {
  90. n=m_str1.Find(",",nStart);
  91. if(n>=0)
  92. {
  93. if(n>nStart)
  94. {
  95. m_str2=m_str.Mid(nStart,n-nStart);
  96. m_str2.TrimLeft();
  97. m_str2.TrimRight();
  98. if(m_str2.GetLength()>0)
  99. strSort[m_NumbSort++]=m_str2;
  100. m_str2.Empty();
  101. }
  102. nStart=n+1;
  103. }
  104. else
  105. {
  106. if(nStart<nChar)
  107. {
  108. m_str2=m_str.Mid(nStart,nChar);
  109. m_str2.TrimLeft();
  110. m_str2.TrimRight();
  111. if(m_str2.GetLength()>0)
  112. strSort[m_NumbSort++]=m_str2;
  113. m_str2.Empty();
  114. }
  115. }
  116. } while(n>=0);
  117. for(int i=0;i<m_NumbSort;i++)
  118. {
  119. m_str2=strSort[i];
  120. int nn=m_str2.GetLength();
  121. n=m_str2.Find(" ");
  122. if(n>0)
  123. {
  124. strSort[i]=m_str2.Mid(0,n);
  125. m_str1=m_str2.Right(nn-n-1);
  126. m_str1.TrimLeft();
  127. m_str1.MakeUpper();
  128. if(!m_str1.Compare("ASC"))
  129. b_Sort[i]=1;
  130. else if(!m_str1.Compare("DESC"))
  131. b_Sort[i]=0;
  132. else
  133. b_Sort[i]=1;
  134. }
  135. else
  136. b_Sort[i]=1;
  137. }
  138. return m_NumbSort;
  139. }
  140. void CSortDlg::OnSortAdd() 
  141. {
  142. if(m_NumbSort>=10)
  143. {
  144. AfxMessageBox("最多只能有10个排序字段");
  145. return;
  146. }
  147. int ncom1=pcom1->GetCurSel();
  148. if(ncom1<0)
  149. {
  150. AfxMessageBox("没有选择排序字段");
  151. return;
  152. }
  153. strSort[m_NumbSort]=pFieldInfo[ncom1].m_strName;
  154. CButton *pcheck1=(CButton *)GetDlgItem(IDC_CHECK1);
  155. b_Sort[m_NumbSort]=1-pcheck1->GetCheck();
  156. CString m_str;
  157. if(b_Sort[m_NumbSort])
  158. m_str="↑    ";
  159. else
  160. m_str="↓    ";
  161. m_str+=strSort[m_NumbSort];
  162. plist1->AddString(m_str);
  163. plist1->SetCurSel(m_NumbSort);
  164. m_NumbSort++;
  165. MakeStr();
  166. }
  167. void CSortDlg::OnSortDelete() 
  168. {
  169. // TODO: Add your control notification handler code here
  170. int nlist1=plist1->GetCurSel();
  171. if(nlist1<0)
  172. return;
  173. for(int i=nlist1;i<m_NumbSort-1;i++)
  174. {
  175. strSort[i]=strSort[i+1];
  176. b_Sort[i]=b_Sort[i+1];
  177. }
  178. plist1->DeleteString(nlist1);
  179. if(nlist1==m_NumbSort-1)
  180. plist1->SetCurSel(nlist1-1);
  181. else
  182. plist1->SetCurSel(nlist1);
  183. m_NumbSort--;
  184. MakeStr();
  185. OnSelchangeList1();
  186. }
  187. void CSortDlg::OnSortInsert() 
  188. {
  189. // TODO: Add your control notification handler code here
  190. if(m_NumbSort>=10)
  191. {
  192. AfxMessageBox("最多只能有10个排序字段");
  193. return;
  194. }
  195. int nlist1=plist1->GetCurSel();
  196. if(nlist1<0)
  197. return;
  198. int ncom1=pcom1->GetCurSel();
  199. for(int i=m_NumbSort;i>nlist1;i--)
  200. {
  201. strSort[i]=strSort[i-1];
  202. b_Sort[i]=b_Sort[i-1];
  203. }
  204. strSort[nlist1]=pFieldInfo[ncom1].m_strName;
  205. CButton *pcheck1=(CButton *)GetDlgItem(IDC_CHECK1);
  206. b_Sort[nlist1]=1-pcheck1->GetCheck();
  207. CString m_str;
  208. if(b_Sort[nlist1])
  209. m_str="↑    ";
  210. else
  211. m_str="↓    ";
  212. m_str+=strSort[nlist1];
  213. plist1->InsertString(nlist1,m_str);
  214. plist1->SetCurSel(nlist1);
  215. m_NumbSort++;
  216. MakeStr();
  217. }
  218. void CSortDlg::OnSortModify() 
  219. {
  220. // TODO: Add your control notification handler code here
  221. int nlist1=plist1->GetCurSel();
  222. if(nlist1<0)
  223. return;
  224. int ncom1=pcom1->GetCurSel();
  225. strSort[nlist1]=pFieldInfo[ncom1].m_strName;
  226. CButton *pcheck1=(CButton *)GetDlgItem(IDC_CHECK1);
  227. b_Sort[nlist1]=1-pcheck1->GetCheck();
  228. CString m_str;
  229. if(b_Sort[nlist1])
  230. m_str="↑    ";
  231. else
  232. m_str="↓    ";
  233. m_str+=strSort[nlist1];
  234. plist1->DeleteString(nlist1);
  235. if(nlist1==m_NumbSort-1)
  236. plist1->AddString(m_str);
  237. else
  238. plist1->InsertString(nlist1,m_str);
  239. plist1->SetCurSel(nlist1);
  240. MakeStr();
  241. }
  242. void CSortDlg::MakeStr()
  243. {
  244. m_strSort.Empty();
  245. for(int i=0;i<m_NumbSort;i++)
  246. {
  247. if(i>0)
  248. m_strSort+=",";
  249. strSort[i].TrimLeft();
  250. strSort[i].TrimRight();
  251. m_strSort+=strSort[i];
  252. if(!b_Sort[i])
  253. m_strSort+=" DESC";
  254. }
  255. SetDlgItemText(IDC_EDIT1,m_strSort);
  256. }
  257. void CSortDlg::OnOK() 
  258. {
  259. // TODO: Add extra validation here
  260. if(m_pSet->IsOpen())
  261. m_pSet->Close();
  262. CString m_str=m_pSet->m_strSort;
  263. m_pSet->m_strSort=m_strSort;
  264. if(m_pSet->Open())
  265. CDialog::OnOK();
  266. else
  267. m_pSet->m_strSort=m_str;
  268. }
  269. void CSortDlg::OnSelchangeList1() 
  270. {
  271. // TODO: Add your control notification handler code here
  272. int n=plist1->GetCurSel();
  273. if(n<0)
  274. return;
  275. CString m_str1=strSort[n];
  276. m_str1.TrimLeft();
  277. m_str1.TrimRight();
  278. BOOL yn=0;
  279. for(int i=0;i<m_NumbField;i++)
  280. {
  281. if(!m_str1.Compare(pFieldInfo[i].m_strName))
  282. {
  283. yn=1;
  284. break;
  285. }
  286. }
  287. if(yn)
  288. pcom1->SetCurSel(i);
  289. else
  290. pcom1->SetCurSel(-1);
  291. CButton *pcheck1=(CButton *)GetDlgItem(IDC_CHECK1);
  292. pcheck1->SetCheck(1-b_Sort[n]);
  293. }