KTabFileCtrl.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "KWin32.h"
  2. #include "KTabFileCtrl.h"
  3. #include "KStrBase.h"
  4. #include "KMemClass.h"
  5. #include <string.h>
  6. KTabFileCtrl::KTabFileCtrl()
  7. {
  8. }
  9. KTabFileCtrl::~KTabFileCtrl()
  10. {
  11. Clear();
  12. }
  13. BOOL KTabFileCtrl::Load(LPSTR FileName)
  14. {
  15. KPakFile File;
  16. DWORD dwSize;
  17. PVOID Buffer;
  18. // check file name
  19. if (FileName[0] == 0)
  20. return FALSE;
  21. if (!File.Open(FileName))
  22. {
  23. g_DebugLog("Can't open ini file : %s", FileName);
  24. return FALSE;
  25. }
  26. dwSize = File.Size();
  27. KMemClass Mem;
  28. Buffer = Mem.Alloc(dwSize);
  29. File.Read(Buffer, dwSize);
  30. DWORD nCurPos = 0;
  31. while(nCurPos < dwSize)
  32. {
  33. long i = 0;
  34. char szLine[10000];
  35. //拷贝某一行的数据流
  36. while(nCurPos <= dwSize)
  37. {
  38. if (((char*)Buffer)[nCurPos] == 0x0d)
  39. break;
  40. szLine[i++] = ((char*)Buffer)[nCurPos ++];
  41. }
  42. szLine[i] = '';
  43. nCurPos = nCurPos + 2;
  44. i++;
  45. TTabLineNode  * pLineNode = new TTabLineNode;
  46. KList * pList = new KList;
  47. pLineNode->pList = pList;
  48. m_RowList.AddTail(pLineNode);
  49. long j = 0;
  50. //
  51. char *szData = szLine;
  52. while (1)
  53. {
  54. char *szFind = strstr(szData,"t");
  55. if (szFind == NULL) 
  56. {
  57. char * newStr = new char[strlen(szData) + 1];
  58. g_StrCpyLen(newStr,  szData , strlen(szData) + 1);
  59. if (newStr[strlen(newStr) - 1] == 0x0d)
  60. newStr[strlen(newStr) - 1] = '';
  61. TTabColNode  * pNode = new TTabColNode;
  62. pNode->m_Str = newStr;
  63. pLineNode->pList->AddTail(pNode);
  64. break;
  65. }
  66. char * newStr = new char[szFind - szData + 1];
  67. g_StrCpyLen(newStr,  szData , szFind - szData + 1);
  68. TTabColNode  * pNode = new TTabColNode;
  69. pNode->m_Str = newStr;
  70. pLineNode->pList->AddTail(pNode);
  71. szData = szFind + 1;
  72. }
  73. }
  74. return TRUE;
  75. }
  76. BOOL KTabFileCtrl::LoadPack(LPSTR FileName)
  77. {
  78. return TRUE;
  79. }
  80. BOOL KTabFileCtrl::Save(LPSTR FileName)
  81. {
  82. KFile File;
  83. if (FileName[0] == 0)
  84. return FALSE;
  85. // create ini file
  86. if (!File.Create(FileName))
  87. return FALSE;
  88. // write ini file
  89. char szCol[1000];
  90. TTabLineNode  * pLineNode = (TTabLineNode*)m_RowList.GetHead();
  91. while(pLineNode)
  92. {
  93. TTabColNode * pNode = (TTabColNode*)pLineNode->pList->GetHead();
  94. while (pNode)
  95. {
  96. TTabColNode * pNextNode = (TTabColNode*)pNode->GetNext();
  97. if (pNextNode)
  98. sprintf(szCol, "%st", pNode->m_Str);
  99. else 
  100. sprintf(szCol,"%s",pNode->m_Str);
  101. File.Write(szCol, g_StrLen(szCol));
  102. pNode = (TTabColNode*)pNode->GetNext();
  103. }
  104. File.Write((void *)"15", 1);//0x0D0A
  105. File.Write((void *)"n", 1) ;
  106. pLineNode  = (TTabLineNode * )pLineNode->GetNext();
  107. }
  108. return TRUE;
  109. }
  110. //获得某行的名
  111. LPSTR KTabFileCtrl::GetRowName(int nRow)
  112. {
  113. TTabLineNode * pLineNode = (TTabLineNode*) m_RowList.GetHead();
  114. for (int i = 0 ; i < nRow - 1 ;  i ++)
  115. {
  116. if (!pLineNode) return NULL;
  117. pLineNode = (TTabLineNode*) pLineNode->GetNext();
  118. }
  119. if (!pLineNode) return NULL;
  120. return ((TTabColNode *)(pLineNode->pList->GetHead()))->m_Str;
  121. }
  122. //获得某列的名
  123. LPSTR KTabFileCtrl::GetColName(int nCol)
  124. {
  125. TTabLineNode * pLineNode  = (TTabLineNode *) m_RowList .GetHead();
  126. if (!pLineNode) return NULL;
  127. TTabColNode  * pColNode = (TTabColNode*)pLineNode->pList->GetHead();
  128. for (int i = 0 ; i < nCol - 1; i ++)
  129. {
  130. if (!pColNode) return NULL;
  131. pColNode = (TTabColNode*) pColNode->GetNext();
  132. }
  133. if (!pColNode) return NULL;
  134. return pColNode->m_Str;
  135. }
  136. int KTabFileCtrl::FindRow(LPSTR szRow)
  137. {
  138. TTabLineNode * pLineNode = (TTabLineNode *) m_RowList.GetHead();
  139. int  nRow = 1;
  140. while (pLineNode)
  141. {
  142. KList  * pList = pLineNode->pList;
  143. TTabColNode * pCol = (TTabColNode*)pList->GetHead();
  144. if (!pCol) return -1;
  145. if (!strcmp(pCol->m_Str, szRow))
  146. {
  147. return nRow;
  148. }
  149. pLineNode = (TTabLineNode *)pLineNode->GetNext();
  150. nRow ++;
  151. }
  152. return -1;
  153. }
  154. int KTabFileCtrl::FindColumn(LPSTR szColumn)
  155. {
  156. TTabLineNode * pLine = (TTabLineNode*)m_RowList.GetHead();
  157. if (!pLine) return -1;
  158. TTabColNode* pColNode =(TTabColNode * )pLine->pList->GetHead();
  159. int nCol = 1;
  160. while (pColNode)
  161. {
  162. if (g_StrCmp(pColNode->m_Str, szColumn))
  163. {
  164. return nCol;
  165. }
  166. pColNode = (TTabColNode *)pColNode->GetNext();
  167. nCol ++;
  168. }
  169. return -1;
  170. }
  171. // 以0,0为起点
  172. BOOL KTabFileCtrl::GetValue(int nRow, int nColumn, LPSTR& lpRString, DWORD dwSize)
  173. {
  174. if ( nRow < 0 || nColumn < 0) return FALSE;
  175. TTabLineNode * pLineNode = (TTabLineNode*)m_RowList.GetHead();
  176. for (int i = 0; i < nRow; i ++) 
  177. {
  178. if (!pLineNode) return FALSE;
  179. pLineNode = (TTabLineNode * )pLineNode->GetNext();
  180. }
  181. if (!pLineNode) return FALSE;
  182. TTabColNode * pColNode = (TTabColNode*)pLineNode->pList->GetHead();
  183. for (int j = 0; j < nColumn; j ++)
  184. {
  185. if (!pColNode) return FALSE;
  186. pColNode = (TTabColNode*) pColNode->GetNext();
  187. }
  188. if (!pColNode)
  189. return FALSE;
  190. lpRString = pColNode->m_Str;
  191. return TRUE;
  192. }   
  193. BOOL KTabFileCtrl::SetValue(int nRow, int nColumn, LPSTR lpString, DWORD dwSize, BOOL bCanCreateNew )
  194. {
  195. if ( nRow < 0 || nColumn < 0) return FALSE;
  196. TTabLineNode * pLineNode = (TTabLineNode*)m_RowList.GetHead();
  197. TTabLineNode * pTempNode = pLineNode;
  198. for (int i = 0; i < nRow + 1; i ++) 
  199. {
  200. //如果没有该行结点则自动生成
  201. pLineNode = pTempNode;
  202. if (!pLineNode)
  203. {
  204. if (!bCanCreateNew) return FALSE;
  205. for(int j = 0; j < nRow + 1 - i; j ++)
  206. {
  207. TTabLineNode * pLine = new TTabLineNode;
  208. KList * pList = new KList;
  209. pLine->pList = pList;
  210. m_RowList.AddTail(pLine);
  211. }
  212. pLineNode = (TTabLineNode*) m_RowList.GetTail();
  213. break;
  214. }
  215. pTempNode = (TTabLineNode * )pLineNode->GetNext();
  216. }
  217. KList * pColList =  pLineNode->pList;
  218. TTabColNode * pColNode = (TTabColNode*)pColList->GetHead();
  219. TTabColNode * pTempColNode = pColNode;
  220. for (int j = 0; j < nColumn + 1; j ++)
  221. {
  222. pColNode = pTempColNode;
  223. if (!pColNode) 
  224. {
  225. if (!bCanCreateNew) return FALSE;
  226. for (int k = 0; k < nColumn +1 - j -1; k ++)
  227. {
  228. TTabColNode * pNode = new TTabColNode;
  229. char * newStr = new char[2];
  230. strcpy(newStr, "");
  231. pNode->m_Str = newStr;
  232. pColList->AddTail(pNode);
  233. }
  234. TTabColNode * pNode = new TTabColNode;
  235. char * newStr = new char[dwSize + 1];
  236. g_StrCpyLen(newStr, lpString, dwSize + 1);
  237. pNode->m_Str = newStr;
  238. pColList->AddTail(pNode);
  239. return TRUE;
  240. }
  241. pTempColNode = (TTabColNode*) pColNode->GetNext();
  242. }
  243.  
  244. delete pColNode->m_Str;
  245. char * pNewStr = new char[dwSize + 1];
  246. g_StrCpyLen(pNewStr, lpString, dwSize + 1);
  247. pColNode->m_Str = pNewStr;
  248. return TRUE;
  249. }
  250. BOOL KTabFileCtrl::GetString(int nRow, int nColumn, LPSTR lpDefault, LPSTR lpRString, DWORD dwSize)
  251. {
  252. char * pData = NULL;
  253. if (!GetValue(nRow - 1, nColumn - 1, pData, dwSize))
  254. {
  255. g_StrCpy(lpRString , lpDefault);
  256. return FALSE;
  257. }
  258. else
  259. {
  260. g_StrCpyLen(lpRString, pData, dwSize);
  261. }
  262. return TRUE;
  263. }
  264. BOOL KTabFileCtrl::GetInteger(int nRow, int nColumn, int nDefault, int *pnValue)
  265. {
  266. char * pData = NULL;
  267. if (!GetValue(nRow - 1, nColumn - 1, pData, 100))
  268. {
  269. *pnValue = nDefault;
  270. return FALSE;
  271. }
  272. else
  273. *pnValue = atoi(pData);
  274. return TRUE;
  275. }
  276. BOOL KTabFileCtrl::GetFloat(int nRow, int nColumn, float fDefault, float *pfValue)
  277. {
  278. char * pData = NULL;
  279. if (!GetValue(nRow -1 , nColumn -1, pData, 100))
  280. {
  281. *pfValue = fDefault;
  282. return FALSE;
  283. }
  284. else
  285. *pfValue = (float)atof(pData);
  286. return TRUE;
  287. }
  288. void KTabFileCtrl::Clear()
  289. {
  290. while(m_RowList.GetTail())
  291. {
  292. TTabLineNode * pLineNode = (TTabLineNode *)m_RowList.GetTail();
  293. KList * pList = pLineNode->pList;
  294. while(pList->GetHead())
  295. {
  296. TTabColNode * pNode = (TTabColNode*) pList->GetHead();
  297. delete pNode->m_Str;
  298. pList->RemoveHead();
  299. }
  300. delete pList;
  301. pLineNode->Remove();
  302. }
  303. }
  304. BOOL KTabFileCtrl::WriteString(int nRow, int nColumn,  LPSTR lpString, DWORD dwSize)
  305. {
  306. if (dwSize <= 0) dwSize = g_StrLen(lpString);
  307. return SetValue(nRow -1 ,nColumn -1, lpString, dwSize);
  308. }
  309. BOOL KTabFileCtrl::WriteInteger(int nRow, int nColumn, int nValue)
  310. {
  311. char IntNum[1000];
  312. sprintf(IntNum, "%d", nValue);
  313. return SetValue(nRow -1, nColumn -1, IntNum, g_StrLen(IntNum));
  314. }
  315. BOOL KTabFileCtrl::WriteFloat(int nRow, int nColumn,float fValue)
  316. {
  317. char FloatNum[1000];
  318. sprintf(FloatNum,"%f",fValue);
  319. return SetValue(nRow - 1, nColumn - 1, FloatNum, g_StrLen(FloatNum));
  320. }
  321. int KTabFileCtrl::Str2Col(LPSTR szColumn)
  322. {
  323. int nStrLen = g_StrLen(szColumn);
  324. char szTemp[4];
  325. g_StrCpy(szTemp, szColumn);
  326. g_StrUpper(szTemp);
  327. if (nStrLen == 1)
  328. {
  329. return (szTemp[0] - 'A');
  330. }
  331. return ((szTemp[0] - 'A' + 1) * 26 + szTemp[1] - 'A');
  332. }
  333. BOOL KTabFileCtrl::Remove(int nRow)
  334. {
  335. TTabLineNode * pNode = (TTabLineNode*)m_RowList.GetHead();
  336. if (!pNode) return FALSE;
  337. for(int i  = 0; i < nRow  - 1; i ++)
  338. {
  339. if (!pNode) return FALSE;
  340. pNode = (TTabLineNode*) pNode->GetNext();
  341. }
  342. TTabLineNode *pDelNode = pNode;
  343. if (!pNode) return FALSE;
  344. pNode->Remove();
  345. delete pDelNode;
  346. return TRUE;
  347. }
  348. BOOL KTabFileCtrl::InsertAfter(int nRow)
  349. {
  350. TTabLineNode * pNode = (TTabLineNode*)m_RowList.GetHead();
  351. if (!pNode) return FALSE;
  352. for(int i  = 0; i < nRow  - 1; i ++)
  353. {
  354. if (!pNode) return FALSE;
  355. pNode = (TTabLineNode*) pNode->GetNext();
  356. }
  357. if (!pNode) return FALSE;
  358. TTabLineNode * pNewNode = new TTabLineNode;
  359. KList * pList = new KList;
  360. pNewNode->pList = pList;
  361. pNode->InsertAfter(pNewNode);
  362. return TRUE;
  363. }
  364. BOOL KTabFileCtrl::InsertBefore(int nRow)
  365. {
  366. TTabLineNode * pNode = (TTabLineNode*)m_RowList.GetHead();
  367. if (!pNode) return FALSE;
  368. for(int i  = 0; i < nRow  - 1; i ++)
  369. {
  370. if (!pNode) return FALSE;
  371. pNode = (TTabLineNode*) pNode->GetNext();
  372. }
  373. if (!pNode) return FALSE;
  374. TTabLineNode * pNewNode = new TTabLineNode;
  375. KList * pList = new KList;
  376. pNewNode->pList = pList;
  377. pNode->InsertBefore(pNewNode);
  378. return TRUE;
  379. }
  380. //返回新生成Col的Col编号
  381. int KTabFileCtrl::InsertNewCol(LPSTR strNewCol)
  382. {
  383. if (!strNewCol || !strNewCol[0]) return -1;
  384. int nResult = -1;
  385. //如果已有就不用再加了
  386. if ((nResult = FindColumn(strNewCol)) > 0)  return nResult;
  387. nResult = GetWidth() + 1;
  388. WriteString(1, nResult, strNewCol);
  389. return nResult;
  390. }