diff options
Diffstat (limited to 'contrib/dbcEditer/thOpenSource.cpp')
-rw-r--r-- | contrib/dbcEditer/thOpenSource.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/contrib/dbcEditer/thOpenSource.cpp b/contrib/dbcEditer/thOpenSource.cpp new file mode 100644 index 00000000000..7df4debfe31 --- /dev/null +++ b/contrib/dbcEditer/thOpenSource.cpp @@ -0,0 +1,182 @@ +//--------------------------------------------------------------------------- + +#include <vcl.h> +#pragma hdrstop + +#include "thOpenSource.h" +#include "dbcedit.h" +#include "stdio.h" +#include <dir.h> +#include <inifiles.hpp> +#include <process.h> +#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); + +} |