189 lines
5.3 KiB
C++
189 lines
5.3 KiB
C++
//---------------------------------------------------------------------------
|
||
|
||
#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;
|
||
}
|
||
//<2F>趨<EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||
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: //<2F><><EFBFBD><EFBFBD>
|
||
FrmMain->sgEdit->Cells[j + 1][i + 1] = IntToStr(lTemp);
|
||
break;
|
||
case 1: //<2F><><EFBFBD><EFBFBD>
|
||
FrmMain->sgEdit->Cells[j + 1][i + 1] = FloatToStr(fTemp);
|
||
break;
|
||
case 2: //<2F>ı<EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܱ༭
|
||
if (dwTextStartPos + lTemp < dwSize)
|
||
{
|
||
pTextPtr = pBuff + dwTextStartPos + lTemp;
|
||
FrmMain->sgEdit->Cells[j + 1][i + 1] = pTextPtr;
|
||
}
|
||
else
|
||
{
|
||
FrmMain->sgEdit->Cells[j + 1][i + 1] = "<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>";
|
||
}
|
||
break;
|
||
default: //<2F><><EFBFBD><EFBFBD>
|
||
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);
|
||
|
||
}
|