//--------------------------------------------------------------------------- #include #pragma hdrstop #include "dbcedit.h" #include "stdio.h" #include "IdGlobal.hpp" #include #include "TitleFrm.h" #include #include "thOpenSource.h" #include "SearchFrm.h" //#include "SysUtils.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFrmMain *FrmMain; //--------------------------------------------------------------------------- __fastcall TFrmMain::TFrmMain(TComponent* Owner) : TForm(Owner) { OpenOk=false; Term=false; } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btOpenClick(TObject *Sender) { if(OpenDialog1->Execute()){ if (FileExists(OpenDialog1->FileName)){ OpenOk=false; if(thOpen){ thOpen->Terminate(); } thOpen = new thOpenFile(false); //thOpen->Priority = tpTimeCritical; pnFileName->Caption = OpenDialog1->FileName; }else{ OpenOk=false; pnFileName->Caption = ""; } } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btSaveClick(TObject *Sender) { //CurrentOpenFile; if(OpenOk){ SaveToFile(CurrentOpenFile.c_str()); }else{ ShowMessage("文件未打开完成!"); } } //--------------------------------------------------------------------------- void TFrmMain::SaveToFile(const char * pszFileName) { char szFileName[255]; FILE *stream; fnsplit(pszFileName, 0, 0, szFileName, 0); strcat(szFileName, "_new.dbc"); AnsiString NewFileName=ExtractFilePath(Application->ExeName)+szFileName;//=pszFileName; int iFileHandle; //文件句柄 AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); DWORD w; CopyFileTo(pszFileName,NewFileName); iFileHandle = FileOpen(NewFileName, fmOpenRead|fmOpenWrite);//打开文件 if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) == NULL) { ShowMessage("打开文件出错"); return; } int iVal; float fVal; bool isFloat; int ColType; FileSeek(iFileHandle,0x14,0); TIniFile *ini; ini = new TIniFile( iniSetFile ); for(int i=1; iRowCount; i++) { for(int j=1; jColCount; j++) { if(j==1){ //ID iVal=StrToInt(sgEdit->Cells[j][i]); FileWrite(iFileHandle, &iVal, 4); }else{ //ColType= ini->ReadInteger(SectionName,"ColType"+IntToStr(j-1),0); //thOpen->ColType[10000]; switch (thOpen->ColType[j]) { case 0: //整型 iVal=StrToFloat(sgEdit->Cells[j][i]); FileWrite(iFileHandle, &iVal, 4); break; case 1: //浮点 fVal=StrToFloat(sgEdit->Cells[j][i]); FileWrite(iFileHandle, &fVal, 4); break; case 2: //文本 fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(j-1))*4, 0); fread(&iVal, 4, 1, stream); FileWrite(iFileHandle, &iVal, 4); break; default: //整型 iVal=StrToFloat(sgEdit->Cells[j][i]); FileWrite(iFileHandle, &iVal, 4); } } } } FileClose(iFileHandle); fclose(stream); delete ini; ShowMessage("Save To File:"+NewFileName); } void __fastcall TFrmMain::btIntTypeClick(TObject *Sender) { if(OpenOk==true){ AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); TIniFile *ini; ini = new TIniFile( iniSetFile ); ini->WriteInteger(SectionName,"ColType"+IntToStr(sgEdit->Col),0); delete ini; thOpen->ColType[sgEdit->Col]=0; //重新打开对应列的值 //OpenFileCol(AnsiString FileName,int ColType); OpenFileCol(CurrentOpenFile,sgEdit->Col,0); } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btFloatTypeClick(TObject *Sender) { if(OpenOk==true){ AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); TIniFile *ini; ini = new TIniFile( iniSetFile ); ini->WriteInteger(SectionName,"ColType"+IntToStr(sgEdit->Col),1); delete ini; thOpen->ColType[sgEdit->Col]=1; OpenFileCol(CurrentOpenFile,sgEdit->Col,1); } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::PopupMenu1Popup(TObject *Sender) { if(OpenOk==true){ AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); int ColType; TIniFile *ini; ini = new TIniFile( iniSetFile ); ColType=ini->ReadInteger(SectionName,"ColType"+IntToStr(sgEdit->Col),0); delete ini; switch (ColType) { case 0: btIntType->Checked=true; btFloatType->Checked=false; btTxtType->Checked=false; break; case 1: btIntType->Checked=false; btFloatType->Checked=true; btTxtType->Checked=false; break; case 2: btIntType->Checked=false; btFloatType->Checked=false; btTxtType->Checked=true; break; default: btIntType->Checked=true; btFloatType->Checked=false; } } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::N1Click(TObject *Sender) { AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); int ColType; FrmTitle->edTitle->Text=sgEdit->Cells[sgEdit->Col][0]; if(FrmTitle->ShowModal()==mrOk){ TIniFile *ini; ini = new TIniFile( iniSetFile ); ini->WriteString(SectionName,"ColTitle"+IntToStr(sgEdit->Col),FrmTitle->edTitle->Text); delete ini; sgEdit->Cells[sgEdit->Col][0]=FrmTitle->edTitle->Text; } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::FormDestroy(TObject *Sender) { if(thOpen){ thOpen->Terminate(); SleepEx(200,0); } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::ToolButton1Click(TObject *Sender) { bool SeFlag=true; if(FrmSearch->ShowModal()==mrOk){ switch (FrmSearch->rgSI->ItemIndex) { case 0: //向上找; for(int i=sgEdit->ColCount*sgEdit->Row+sgEdit->Col-1;i>sgEdit->ColCount;i--){ if(i%sgEdit->ColCount!=0){ if( 0==CompareStr(sgEdit->Cells[i-sgEdit->ColCount*(i/sgEdit->ColCount)][i/sgEdit->ColCount], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Col=i-sgEdit->ColCount*i/sgEdit->ColCount; sgEdit->Row=i/sgEdit->ColCount; SeFlag=false; break; } } } if(SeFlag) ShowMessage("Seach Top,Find Nothing."); break; case 1: //向下找; for(int i=sgEdit->ColCount*sgEdit->Row+sgEdit->Col+1;iColCount*sgEdit->RowCount;i++){ if(i%sgEdit->ColCount!=0){ if( 0==CompareStr(sgEdit->Cells[i-sgEdit->ColCount*(i/sgEdit->ColCount)][i/sgEdit->ColCount], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Col=i-sgEdit->ColCount*(i/sgEdit->ColCount); sgEdit->Row=i/sgEdit->ColCount; SeFlag=false; break; } } } if(SeFlag) ShowMessage("Seach End,Find Nothing"); break; case 2: //当前列向上找; for(int i=sgEdit->Row;i>1;i--){ if( 0==CompareStr(sgEdit->Cells[sgEdit->Col][i], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Row=i; SeFlag=false; break; } } if(SeFlag) ShowMessage("Seach col top,Find Nothing"); break; case 3: //当前列向下找; for(int i=sgEdit->Row;iRowCount;i++){ if( 0==CompareStr(sgEdit->Cells[sgEdit->Col][i], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Row=i; SeFlag=false; break; } } if(SeFlag) ShowMessage("Seach col end,Find Nothing."); break; } } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::sgEditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { bool SeFlag=true; if(Key==VK_F3){ switch (FrmSearch->rgSI->ItemIndex) { case 0: //向上找; for(int i=sgEdit->ColCount*sgEdit->Row+sgEdit->Col-1;i>sgEdit->ColCount;i--){ if(i%sgEdit->ColCount!=0){ if( 0==CompareStr(sgEdit->Cells[i-sgEdit->ColCount*(i/sgEdit->ColCount)][i/sgEdit->ColCount], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Col=i-sgEdit->ColCount*i/sgEdit->ColCount; sgEdit->Row=i/sgEdit->ColCount; SeFlag=false; break; } } } if(SeFlag) ShowMessage("Seach Top,Find Nothing."); break; case 1: //向下找; for(int i=sgEdit->ColCount*sgEdit->Row+sgEdit->Col+1;iColCount*sgEdit->RowCount;i++){ if(i%sgEdit->ColCount!=0){ if( 0==CompareStr(sgEdit->Cells[i-sgEdit->ColCount*(i/sgEdit->ColCount)][i/sgEdit->ColCount], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Col=i-sgEdit->ColCount*(i/sgEdit->ColCount); sgEdit->Row=i/sgEdit->ColCount; SeFlag=false; break; } } } if(SeFlag) ShowMessage("Seach End,Find Nothing."); break; case 2: //当前列向上找; for(int i=sgEdit->Row;i>1;i--){ if( 0==CompareStr(sgEdit->Cells[sgEdit->Col][i], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Row=i; SeFlag=false; break; } } if(SeFlag) ShowMessage("Seach col Top,Find Nothing."); break; case 3: //当前列向下找; for(int i=sgEdit->Row;iRowCount;i++){ if( 0==CompareStr(sgEdit->Cells[sgEdit->Col][i], FrmSearch->edSeach->Text)){ //找到了 sgEdit->Row=i; SeFlag=false; break; } } if(SeFlag) ShowMessage("Seach col end,Find Nothing."); break; } } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::sgEditSelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { // } //--------------------------------------------------------------------------- void __fastcall TFrmMain::OpenFileCol(AnsiString FileName,int ColIndex,int ColType) { int iFileHandle; //文件句柄 char Txtbuf[255]; int iVal; float fVal; FILE *stream; long curpos, length; DWORD dwRows, dwCols, dwRowLen, dwTextLen; DWORD dwTextStartPos; char* pTextPtr ; if ((stream = fopen(FileName.c_str(), "r+")) == NULL) { ShowMessage("Open File Error"); return; } curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); switch (ColType) { case 0: //整型值 Int for(int i=0;iRowCount-1;i++){ fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(ColIndex-1))*4, 0); fread(&iVal, 4, 1, stream); sgEdit->Cells[ColIndex][i+1]=IntToStr(iVal); } break; case 1: //浮点值 Float for(int i=0;iRowCount-1;i++){ fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(ColIndex-1))*4, 0); fread(&fVal, 4, 1, stream); sgEdit->Cells[ColIndex][i+1]=FloatToStr(fVal); } break; case 2: //文本 Text fseek(stream,0x4,0); fread(&iVal, 4, 1, stream); dwRows= iVal; fread(&iVal, 4, 1, stream); dwCols = iVal; fread(&iVal, 4, 1, stream); dwRowLen = iVal; fread(&iVal, 4, 1, stream); dwTextLen = iVal; dwTextStartPos = dwRows*dwRowLen+20; for(int i=0;iRowCount-1;i++){ fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(ColIndex-1))*4, 0); fread(&iVal, 4, 1, stream); sgEdit->Cells[ColIndex][i+1]=IntToStr(iVal); if(dwTextStartPos + iVal < length){ fseek(stream,dwTextStartPos + iVal,0); fread(Txtbuf, 1, 255, stream); //pTextPtr = pBuff + dwTextStartPos + lTemp; sgEdit->Cells[ColIndex][i+1]=Txtbuf; }else{ sgEdit->Cells[ColIndex][i+1]="This Col Not Text!"; } } break; } fclose(stream); } void __fastcall TFrmMain::Timer1Timer(TObject *Sender) { if(OpenOk){ lbOpState->Caption = "Open File Ok."; }else{ lbOpState->Caption = "Open Now....."; } } //--------------------------------------------------------------------------- //当前格子写入修改文件中 void __fastcall TFrmMain::N4Click(TObject *Sender) { if(!thOpen) return; int iFileHandle; //文件句柄 char buf[4]; int iVal; float fVal; FILE *stream; /* if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) == NULL) { ShowMessage("打开文件出错"); return; } */ iFileHandle = FileOpen(CurrentOpenFile, fmOpenRead|fmOpenWrite);//打开文件 switch (thOpen->ColType[sgEdit->Col]) { case 0: //整型值 //for(int i=0;iRowCount-1;i++){ /* fseek(stream, 0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4, 0); iVal=StrToInt(sgEdit->Cells[sgEdit->Col][sgEdit->Row]); memcpy(buf, &iVal, 4); for(int i=0;i<4;i++) fwrite(buf+i, 1, 1, stream); */ iVal=StrToInt(sgEdit->Cells[sgEdit->Col][sgEdit->Row]); memcpy(buf, &iVal, 4); FileSeek(iFileHandle,0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4,0); FileWrite(iFileHandle,buf,4); //} break; case 1: //浮点值 //fseek(stream, 0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4, 0); //fVal=StrToFloat(sgEdit->Cells[sgEdit->Col][sgEdit->Row]); //fwrite(&fVal, 4, 1, stream); fVal=StrToFloat(sgEdit->Cells[sgEdit->Col][sgEdit->Row]); memcpy(buf, &fVal, 4); FileSeek(iFileHandle,0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4,0); FileWrite(iFileHandle,buf,4); break; case 2: //文本不写入 break; } // fclose(stream); FileClose(iFileHandle); } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btTxtTypeClick(TObject *Sender) { if(OpenOk==true){ AnsiString iniSetFile=ExtractFilePath(Application->ExeName)+"BcdEditer.ini"; AnsiString SectionName=ExtractFileName(CurrentOpenFile); TIniFile *ini; ini = new TIniFile( iniSetFile ); ini->WriteInteger(SectionName,"ColType"+IntToStr(sgEdit->Col),2); delete ini; thOpen->ColType[sgEdit->Col]=2; OpenFileCol(CurrentOpenFile,sgEdit->Col,2); } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::ToolButton3Click(TObject *Sender) { int OldCol; int OldRow; OldRow=sgEdit->Row; OldCol=sgEdit->Col; if(sgEdit->FixedCols==1){ sgEdit->FixedCols =2; if(OldCol!=1) sgEdit->Col=OldCol; sgEdit->Row=OldRow; }else{ sgEdit->FixedCols =1; sgEdit->Row=OldRow; if(OldCol!=2) sgEdit->Col=OldCol; } } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btRowSaveClick(TObject *Sender) { if(OpenOk==false) return; int iFileHandle; //文件句柄 char Txtbuf[255]; int iVal; char buf[4]; float fVal; FILE *stream; long curpos, length; DWORD dwRows, dwCols, dwRowLen, dwTextLen; DWORD dwTextStartPos; char* pTextPtr ; //if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) // == NULL) //{ // ShowMessage("打开文件出错"); // return; //} //curpos = ftell(stream); //fseek(stream, 0L, SEEK_END); //length = ftell(stream); iFileHandle = FileOpen(CurrentOpenFile, fmOpenRead|fmOpenWrite);//打开文件 for(int i=0;iColCount-1;i++){ switch (thOpen->ColType[i]) { case 0: //整型值 sgEdit->Row //fseek(stream, 0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+i)*4, 0); //iVal=StrToInt(sgEdit->Cells[i+1][sgEdit->Row]); //fwrite(&iVal, 4, 1, stream); iVal=StrToInt(sgEdit->Cells[i+1][sgEdit->Row]); memcpy(buf, &iVal, 4); FileSeek(iFileHandle,0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+i)*4,0); FileWrite(iFileHandle,buf,4); break; case 1: //浮点值 //fseek(stream, 0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+i)*4, 0); //fVal=StrToFloat(sgEdit->Cells[i+1][sgEdit->Row]); //fwrite(&fVal, 4, 1, stream); fVal=StrToFloat(sgEdit->Cells[i+1][sgEdit->Row]); memcpy(buf, &fVal, 4); FileSeek(iFileHandle,0x14+((sgEdit->Row-1)*(sgEdit->ColCount-1)+i)*4,0); FileWrite(iFileHandle,buf,4); break; case 2: //文本 不存 break; } } //fclose(stream); FileClose(iFileHandle); ShowMessage("The "+IntToStr(sgEdit->Row)+" Row Write Ok!"); } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btColSaveClick(TObject *Sender) { if(OpenOk==false) return; int iFileHandle; //文件句柄 char Txtbuf[255]; int iVal; char buf[4]; float fVal; FILE *stream; long curpos, length; DWORD dwRows, dwCols, dwRowLen, dwTextLen; DWORD dwTextStartPos; char* pTextPtr ; iFileHandle = FileOpen(CurrentOpenFile, fmOpenRead|fmOpenWrite);//打开文件 //if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) // == NULL) //{ // ShowMessage("打开文件出错"); // return; //} //curpos = ftell(stream); //fseek(stream, 0L, SEEK_END); //length = ftell(stream); switch (thOpen->ColType[sgEdit->Col]) { case 0: //整型值 for(int i=0;iRowCount-1;i++){ //fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4, 0); //iVal=StrToInt(sgEdit->Cells[sgEdit->Col][i+1]); //fwrite(&iVal, 4, 1, stream); iVal=StrToInt(sgEdit->Cells[sgEdit->Col][i+1]); memcpy(buf, &iVal, 4); FileSeek(iFileHandle,0x14+(i*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4,0); FileWrite(iFileHandle,buf,4); } break; case 1: //浮点值 for(int i=0;iRowCount-1;i++){ //fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4, 0); //fVal=StrToFloat(sgEdit->Cells[sgEdit->Col][i+1]); //fwrite(&fVal, 4, 1, stream); fVal=StrToFloat(sgEdit->Cells[sgEdit->Col][i+1]); memcpy(buf, &fVal, 4); FileSeek(iFileHandle,0x14+(i*(sgEdit->ColCount-1)+(sgEdit->Col-1))*4,0); FileWrite(iFileHandle,buf,4); } break; case 2: //文本 不存 break; } //fclose(stream); FileClose(iFileHandle); ShowMessage("The "+IntToStr(sgEdit->Col)+"Col Write Ok!"); } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btRowClearClick(TObject *Sender) { if(OpenOk==false) return; int iFileHandle; //文件句柄 char Txtbuf[255]; int iVal; float fVal; FILE *stream; long curpos, length; DWORD dwRows, dwCols, dwRowLen, dwTextLen; DWORD dwTextStartPos; char* pTextPtr ; if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) == NULL) { ShowMessage("Open File Error!"); return; } curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); for(int i=1;iColCount-1;i++){ switch (thOpen->ColType[i]) { case 0: //整型值 sgEdit->Row //fseek(stream, 0x14+(sgEdit->Row*(sgEdit->ColCount-1)+i)*4, 0); //iVal=StrToInt(sgEdit->Cells[i+1][sgEdit->Row]); //fwrite(&iVal, 4, 1, stream); sgEdit->Cells[i+1][sgEdit->Row]="0"; break; case 1: //浮点值 //fseek(stream, 0x14+(sgEdit->Row*(sgEdit->ColCount-1)+i)*4, 0); //fVal=StrToFloat(sgEdit->Cells[i+1][sgEdit->Row]); //fwrite(&fVal, 4, 1, stream); sgEdit->Cells[i+1][sgEdit->Row]="0"; break; case 2: //文本 不存 break; } } fclose(stream); } //--------------------------------------------------------------------------- void __fastcall TFrmMain::btColClearClick(TObject *Sender) { if(OpenOk==false) return; int iFileHandle; //文件句柄 char Txtbuf[255]; int iVal; float fVal; FILE *stream; long curpos, length; DWORD dwRows, dwCols, dwRowLen, dwTextLen; DWORD dwTextStartPos; char* pTextPtr ; if ((stream = fopen(CurrentOpenFile.c_str(), "r+")) == NULL) { ShowMessage("Open File Error!"); return; } curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); switch (thOpen->ColType[sgEdit->Col]) { case 0: //整型值 for(int i=0;iRowCount-1;i++){ //fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(ColIndex-1))*4, 0); //iVal=StrToInt(sgEdit->Cells[ColIndex][i+1]); //fwrite(&iVal, 4, 1, stream); sgEdit->Cells[sgEdit->Col][i+1]="0"; } break; case 1: //浮点值 for(int i=0;iRowCount-1;i++){ //fseek(stream, 0x14+(i*(sgEdit->ColCount-1)+(ColIndex-1))*4, 0); //fVal=StrToFloat(sgEdit->Cells[ColIndex][i+1]); //fwrite(&fVal, 4, 1, stream); sgEdit->Cells[sgEdit->Col][i+1]="0"; } break; case 2: //文本 不存 break; } fclose(stream); } //--------------------------------------------------------------------------- void __fastcall TFrmMain::ToolButton4Click(TObject *Sender) { AnsiString Cmd; Cmd = "calc.exe"; WinExec(Cmd.c_str(), SW_SHOWNORMAL); } //---------------------------------------------------------------------------