//--------------------------------------------------------------------------- #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; isgEdit->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; jsgEdit->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; isgEdit->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); }