📄 umain.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "uMain.h"
#include "uClass.h"
#include "uAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
TQQWry *g_wry;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
g_wry = NULL;
FStopFlag = true;
imgLogo->Picture->Assign(Application->Icon);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
String strAppPath = ExtractFilePath(Application->ExeName);
if(strAppPath.LastDelimiter("\\") != strAppPath.Length())
strAppPath += "\\";
FWryDatFileName = strAppPath + "QQWry.Dat";
if(!FileExists(FWryDatFileName))
btnNext->Enabled = false;
else
{
g_wry = new TQQWry(FWryDatFileName);
edtRecCount->Text = g_wry->GetIPRecordCount();
edtUpdateDate->Text = g_wry->GetUpdateDate();
btnNext->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
if(g_wry)
delete g_wry;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnOpenClick(TObject *Sender)
{
dlgOpen->InitialDir = ExtractFilePath(Application->ExeName);
if(dlgOpen->Execute())
{
if(g_wry)
{
delete g_wry;
g_wry = NULL;
}
try
{
FWryDatFileName = dlgOpen->FileName;
g_wry = new TQQWry(FWryDatFileName);
edtRecCount->Text = g_wry->GetIPRecordCount();
edtUpdateDate->Text = g_wry->GetUpdateDate();
btnNext->Enabled = true;
}
catch(...)
{
MessageBox(Handle, "打开QQWry.Dat文件出错!\r\n"
"可能是文件格式不正确,请使用正确的数据库文件.",
Application->Title.c_str(),
MB_OK | MB_ICONWARNING);
btnNext->Enabled = false;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnCloseClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnNextClick(TObject *Sender)
{
if(!FileExists(FWryDatFileName))
return;
switch(pgcMain->ActivePageIndex)
{
case 0:
{
String strMdbPath = ExtractFilePath(FWryDatFileName);
if(strMdbPath.LastDelimiter("\\") != strMdbPath.Length())
strMdbPath += "\\";
edtMdbFileName->Text = strMdbPath + "ip.mdb";
pgcMain->ActivePageIndex = 1;
btnNext->Caption = "转换(&P)";
break;
}
case 1:
{
pgcMain->ActivePageIndex = 2;
if(btnNext->Caption == "转换(&P)")
{
btnNext->Caption = "停止(&S)";
FStopFlag = false;
FMdbFileName = edtMdbFileName->Text;
TResourceStream *rs;
bool bTwoFields = chkTwoFields->Checked;
rs = new TResourceStream((int)HInstance,
bTwoFields? "IPMDB2": "IPMDB1", RT_RCDATA);
try
{
rs->SaveToFile(FMdbFileName);
}
catch(...)
{
MessageBox(Handle, ("写入.mdb数据库时失败,请查看\r\n"
+ FMdbFileName
+ "\r\n是否正在使用中,或者手动删除这个文件再试试。").c_str(),
Application->Title.c_str(), MB_OK | MB_ICONERROR);
return;
}
con->ConnectionString = String("Provider=Microsoft.Jet.OLEDB.4.0;")
+ "Data Source=" + FMdbFileName + ";Persist Security Info=False";
tbl->TableName = "address";
tbl->Active = true;
String strStartIP, strEndIP, strCountry, strCity;
DWORD dwStartTick = GetTickCount();
DWORD dwRecCount = g_wry->GetIPRecordCount();
if(bTwoFields) // 两个字段的库
{
for(DWORD i=1; i<dwRecCount; i++)
{
if(FStopFlag)
break;
lblProcess->Caption = "处理进度: " + String(i)
+ String("/") + String(dwRecCount);
Application->ProcessMessages();
String strMsg = g_wry->GetIPMsg(i);
strStartIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
strEndIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
if(edtFilter->Text != "" && !strMsg.Pos(edtFilter->Text))
continue;
strCountry = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
if(strMsg.Pos("\r\n"))
strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
strCity = StringReplace(
strMsg, "CZ88.NET", "", TReplaceFlags() << rfReplaceAll);
tbl->Insert();
tbl->FieldByName("ip1")->AsFloat = g_wry->GetIPValue(strStartIP);
tbl->FieldByName("ip2")->AsFloat = g_wry->GetIPValue(strEndIP);
tbl->FieldByName("country")->AsString = strCountry;
tbl->FieldByName("city")->AsString = strCity;
tbl->Post();
lblStartIP->Caption = strStartIP;
lblEndIP->Caption = strEndIP;
lblCountry->Caption = strCountry;
pgbConvert->Position = i * 100 / dwRecCount;
Application->ProcessMessages();
}
}
else
{
for(DWORD i=1; i<dwRecCount; i++)
{
if(FStopFlag)
break;
lblProcess->Caption = "处理进度: " + String(i)
+ String("/") + String(dwRecCount);
Application->ProcessMessages();
String strMsg = g_wry->GetIPMsg(i);
strStartIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
strEndIP = strMsg.SubString(1, strMsg.Pos("\r\n") - 1);
strMsg = strMsg.SubString(strMsg.Pos("\r\n") + 2, strMsg.Length());
if(edtFilter->Text != "" && !strMsg.Pos(edtFilter->Text))
continue;
strCountry = StringReplace(
strMsg, "\r\n", "", TReplaceFlags() << rfReplaceAll);
strCountry = StringReplace(
strCountry, "CZ88.NET", "", TReplaceFlags() << rfReplaceAll);
tbl->Insert();
tbl->FieldByName("ip1")->AsFloat = g_wry->GetIPValue(strStartIP);
tbl->FieldByName("ip2")->AsFloat = g_wry->GetIPValue(strEndIP);
tbl->FieldByName("country")->AsString = strCountry;
tbl->Post();
lblStartIP->Caption = strStartIP;
lblEndIP->Caption = strEndIP;
lblCountry->Caption = strCountry;
pgbConvert->Position = i * 100 / dwRecCount;
Application->ProcessMessages();
}
}
DWORD dwTickCount = GetTickCount() - dwStartTick;
tbl->Active = false;
con->Connected = false;
WIN32_FIND_DATA FindData;
FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
lblResult->Caption = FStopFlag?
"用户中止操作!": "恭喜! 数据库转换成功!";
lblFileSize->Caption = String("文件大小: ")
+ String(FindData.nFileSizeLow / 1024) + " KB";
lblTickCount->Caption = String("操作用时: ")
+ String(dwTickCount / 1000) + " 秒";
lblFileName->Caption = String("文件保存到: ") + FMdbFileName;
btnNext->Caption = "压缩(&P)";
pgcMain->ActivePageIndex = 3;
FStopFlag = true;
}
break;
}
case 2:
{
btnNext->Caption = "转换(&P)";
FStopFlag = true;
break;
}
case 3:
{
WIN32_FIND_DATA FindData;
FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
String strFileOrigSize = String(FindData.nFileSizeLow / 1024);
String strResult = CompactMDB(FMdbFileName, "", "")? "成功!": "失败!";
FindClose(FindFirstFile(FMdbFileName.c_str(), &FindData));
lblFileSize->Caption = String("文件大小: ")
+ String(FindData.nFileSizeLow / 1024) + " KB";
MessageBox(Handle, (String("数据库压缩") + strResult
+ "\r\n文件原始大小: " + strFileOrigSize + " KB\r\n"
+ "压缩后大小: "
+ String(FindData.nFileSizeLow / 1024) + " KB").c_str(),
Application->Title.c_str(), MB_OK | MB_ICONINFORMATION);
btnNext->Visible = false;
break;
}
default:
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnAboutClick(TObject *Sender)
{
frmAbout = new TfrmAbout(this);
frmAbout->ShowModal();
delete frmAbout;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSelectFileClick(TObject *Sender)
{
if(dlgSave->Execute())
edtMdbFileName->Text = dlgSave->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if(!FStopFlag)
{
if(MessageBox(Handle, "当前正在进行转换操作, 确定要退出程序吗?",
Application->Title.c_str(),
MB_YESNO | MB_ICONQUESTION) != ID_YES)
CanClose = false;
else
{
FStopFlag = true;
Application->ProcessMessages();
}
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -