|
#include "stdafx.h"
#include "App_01.h"
static App_01 *CurApp;
static LboxThread *Thread;
static LboxProgressBar *Pbar;
static DWORD WINAPI ThreadProc( LPVOID lpParameter );
static BOOL bCancel;
#define THREAD_END LBOX_USER + 1
// *********************************************************
// ダイアログの処理
// *********************************************************
LRESULT CALLBACK Dialog_01(
HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message ) {
case WM_INITDIALOG:
bEnd = false;
CurApp = new App_01( hDlg );
Dlg->Disable( IDC_CHECK );
Dlg->Disable( IDC_CANCEL );
// 初期フォーカス
Dlg->EditFocus( IDC_REF );
// スレッド
Thread = new LboxThread();
// プログレスバー
Pbar = new LboxProgressBar();
Pbar->hWnd = GetDlgItem( hDlg, IDC_PROGRESS );
// キャンセル不可・終了可( 通常状態 )
bCancel = true;
return FALSE;
case THREAD_END:
// 通常状態
bCancel = true;
// スレッド完了処理
Thread->Close();
// 画面プロテクトの復帰
Dlg->Disable( IDC_CANCEL );
Dlg->Enable( IDC_REF );
Dlg->Enable( IDC_CHECK );
Dlg->Enable( IDCANCEL );
break;
case WM_COMMAND:
// 終了
if( LOWORD(wParam) == IDCANCEL ) {
// 処理中の為終了不可
if ( !bCancel ) {
break;
}
// 終了処理
bEnd = true;
delete Pbar;
delete Thread;
delete CurApp;
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
// 参照
if ( LOWORD(wParam) == IDC_REF ) {
Buff->SetChar( 0, 0 );
if ( CurApp->Commdlg->OpenFileName( Buff ) ) {
Dlg->EditSetText( IDC_INFILE, Buff );
Dlg->Enable( IDC_CHECK );
Dlg->EditSetText( IDC_INCOUNT, "" );
}
}
// 実行
if ( LOWORD(wParam) == IDC_CHECK ) {
// 処理中
bCancel = false;
// キャンセルボタン以外を使用不可
Dlg->Disable( IDCANCEL );
Dlg->Disable( IDC_REF );
Dlg->Disable( IDC_CHECK );
Dlg->Enable( IDC_CANCEL );
// スレッド開始
Thread->Create( NULL, ThreadProc );
}
// キャンセル
if ( LOWORD(wParam) == IDC_CANCEL ) {
// スレッド中止指令処理
if ( !bCancel ) {
bCancel = true;
}
}
break;
}
return FALSE;
}
// *********************************************************
// スレッドの処理
// *********************************************************
static DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
// 別スレッドなので、必要
CoInitialize( NULL );
LboxTextFile TxtIn;
LboxToken Token;
BOOL bRet;
LONG nCount;
Buff->Resize( 10000 );
// ファイル名取得
Dlg->EditGetText( IDC_INFILE, Item );
// テキストファイルのレコード件数
nCount = TxtIn.RecordCount( Item, Buff );
// プログレスバーの範囲設定
Pbar->SetRange( 1, nCount );
// プログレスバーの増分設定
Pbar->SetStep( 1 );
// レコード件数表示
Dlg->EditPrintf( IDC_INCOUNT, "%d", nCount );
nCount = 0;
// テキストファイルを開く
bRet = TxtIn.ReadOpen( Item );
if ( !bRet ) {
Dlg->MsgOk(
"入力ファイルをオープンできませんでした "
);
Dlg->PostMsg( THREAD_END, 0, 0 );
CoUninitialize( );
return false;
}
// DB 接続
if ( !CurDb->Connect() ) {
TxtIn.Close();
Dlg->MsgOk(
"データベースの接続に失敗しました"
);
Dlg->PostMsg( THREAD_END, 0, 0 );
CoUninitialize( );
return false;
}
// テーブルの既存データの削除
Query->operator = (
"delete from 郵便番号インポート"
);
CurDb->Query( Query );
// テキストデータ読み込み
bRet = TxtIn.Get( Buff );
// データが存在し、かつキャンセルされていない間
while( bRet && !bCancel ) {
// 改行コード削除
Buff->RemoveLastchar();
// トークン作成
Token.CreateToken( Buff, "," );
// SQL作成
Work->operator = (
"insert into 郵便番号インポート"
" values("
);
// 郵便番号(7桁)
if ( Token.nCount < 1 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[0]);
Item->SetChar( 7, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 都道府県名(半角カタカナ)
if ( Token.nCount < 2 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[1]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 市区町村名(半角カタカナ)
if ( Token.nCount < 3 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[2]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 町域名(半角カタカナ)
if ( Token.nCount < 4 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[3]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 都道府県名
if ( Token.nCount < 5 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[4]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 市区町村名
if ( Token.nCount < 6 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[5]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (",");
// 町域名
if ( Token.nCount < 7 ) {
Item->SetChar( 0, 0 );
}
else {
Item->operator = (Token.Token[6]);
Item->SetChar( 50, 0 );
}
Item->Enclose( "'" );
Work->operator += (Item);
Work->operator += (")");
// SQL 実行
bRet = CurDb->Query( Work );
// 読み込み件数
nCount++;
// プログレスバー更新
Pbar->Next();
// テキストファイル読込み
bRet = TxtIn.Get( Buff );
}
// DB 接続解除
CurDb->DisConnect();
// テキストファイルを閉じる
TxtIn.Close();
// プログレスバーリセット
Pbar->Reset();
// 呼び出し側へ終了通知
Dlg->PostMsg( THREAD_END, 0, 0 );
// COM 終了
CoUninitialize( );
// スレッド終了
return true;
}
| |