aboutsummaryrefslogtreecommitdiff
path: root/contrib/dbcEditer/thOpenSource.cpp
diff options
context:
space:
mode:
authorNeo2003 <none@none>2008-10-02 16:23:55 -0500
committerNeo2003 <none@none>2008-10-02 16:23:55 -0500
commit9b1c0e006f20091f28f3f468cfcab1feb51286bd (patch)
treeb5d1ba94a656e6679f8737f9ea6bed1239b73b14 /contrib/dbcEditer/thOpenSource.cpp
[svn] * Proper SVN structureinit
--HG-- branch : trunk
Diffstat (limited to 'contrib/dbcEditer/thOpenSource.cpp')
-rw-r--r--contrib/dbcEditer/thOpenSource.cpp182
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);
+
+}