//--------------------------------------------------------------------------- #include #pragma hdrstop #include "thOpenSource.h" #include "dbcedit.h" #include "stdio.h" #include #include #include #pragma package(smart_init) //--------------------------------------------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall thOpenFile::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------------------------------------------- __fastcall thOpenFile::thOpenFile(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall thOpenFile::Execute() { //---- Place thread code here ---- //if(!Terminated){ // FrmMain->LoadAndModify(FrmMain->OpenDialog1->FileName.c_str()); // FrmMain->OpenOk=true; //} thEnd = false; RunOpen(); FrmMain->OpenOk = true; thEnd = true; } //--------------------------------------------------------------------------- void __fastcall thOpenFile::RunOpen() { LoadAndModify(FrmMain->OpenDialog1->FileName.c_str()); //OpenOk=true; } void thOpenFile::ReadAndModifyFromBuff(char* pBuff, DWORD dwSize, const char* pszFileName) { char szErrorMsg[MAX_PATH]; char szNewFileName[MAX_PATH]; DWORD w; TIniFile* ini; TypePtr p(pBuff); if ('WDBC' != TAG(*p.dw)) { _snprintf(szErrorMsg, 512, "[%s]Not Wow's dbc file!", pszFileName); ShowMessage(szErrorMsg); return; } p.dw++; DWORD dwRows, dwCols, dwRowLen, dwTextLen; dwRows = *p.dw++; dwCols = *p.dw++; dwRowLen = *p.dw++; dwTextLen = *p.dw++; FrmMain->sgEdit->RowCount = dwRows + 1; FrmMain->sgEdit->ColCount = dwCols + 1; for (int i = 0; i < FrmMain->sgEdit->RowCount; i++) { FrmMain->sgEdit->Cells[0][i] = IntToStr(i); if (Terminated) return; } //设定列标题 AnsiString iniSetFile = ExtractFilePath(Application->ExeName) + "BcdEditer.ini"; AnsiString SectionName = ExtractFileName(FrmMain->CurrentOpenFile); ini = new TIniFile(iniSetFile); for (int j = 0; j < FrmMain->sgEdit->ColCount; j++) { FrmMain->sgEdit->Cells[j][0] = ini->ReadString(SectionName, "ColTitle" + IntToStr(j), IntToStr(j)); //sgEdit->Cells[j][0]=IntToStr(j); ColType[j] = ini->ReadInteger(SectionName, "ColType" + IntToStr(j), 0); if (Terminated) return; } delete ini; //int *ColType = new int[dwCols]; DWORD dwTextStartPos = dwRows * dwRowLen + 20; char* pTextPtr = pBuff + dwTextStartPos; char pszTemp[MAX_PATH]; float fTemp; long lTemp; DWORD i, j; BOOL* pbString = new BOOL[dwRows * dwCols]; float newTmp; //int ColType; ini = new TIniFile(iniSetFile); for (i = 0; i < dwRows; i++) { for (j = 0; j < dwCols; j++) { //SleepEx(0,0); if (Terminated) return; lTemp = *p.l; newTmp = *p.f; memcpy(&fTemp, &newTmp, 4); if (j == 0) //ID FrmMain->sgEdit->Cells[j + 1][i + 1] = IntToStr(lTemp); else { //ColType= ini->ReadInteger(SectionName,"ColType"+IntToStr(j),0); switch (ColType[j + 1]) { case 0: //整型 FrmMain->sgEdit->Cells[j + 1][i + 1] = IntToStr(lTemp); break; case 1: //浮点 FrmMain->sgEdit->Cells[j + 1][i + 1] = FloatToStr(fTemp); break; case 2: //文本 文本类型只能看,不能编辑 if (dwTextStartPos + lTemp < dwSize) { pTextPtr = pBuff + dwTextStartPos + lTemp; FrmMain->sgEdit->Cells[j + 1][i + 1] = pTextPtr; } else { FrmMain->sgEdit->Cells[j + 1][i + 1] = "该列不是文本"; } break; default: //整型 FrmMain->sgEdit->Cells[j + 1][i + 1] = IntToStr(lTemp); } } p.c += 4; } } delete [] pbString; //delete [] ColType; delete ini; } void thOpenFile::LoadAndModify(const char* pszFileName) { HANDLE hFile = NULL; hFile = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE)return; DWORD r = 0, nFileSize = 0; nFileSize = GetFileSize(hFile, NULL); char* pTmpBuf = new char[nFileSize]; if (pTmpBuf == NULL) { CloseHandle(hFile); return; } ReadFile(hFile, pTmpBuf, nFileSize, &r, NULL); FrmMain->CurrentOpenFile = pszFileName; FrmMain->btSave->Enabled = true; ReadAndModifyFromBuff(pTmpBuf, nFileSize, pszFileName); //SAFE_DELETE_ARRAY(pTmpBuf); delete [] pTmpBuf; CloseHandle(hFile); }