changeset 4:fdba695b99f1

More fast ( read from DB ). Improve the precision of marksheet judgement.
author pyon@macmini
date Wed, 11 Sep 2013 19:09:14 +0900
parents 1a64119ab257
children bc2e2b304095
files Changes Makefile include/db.h include/dndfile.h include/marksheet.h include/mask.h include/myframe.h include/param.h src/bprint.cpp src/db.cpp src/marksheet.cpp src/mask.cpp src/myframe.cpp src/param.cpp
diffstat 14 files changed, 588 insertions(+), 625 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Tue Aug 27 18:50:00 2013 +0900
+++ b/Changes	Wed Sep 11 19:09:14 2013 +0900
@@ -1,3 +1,9 @@
+version 03.05
+2013-09-11
+ More fast ( read from DB ).
+ Improve the precision of marksheet judgement.
+
+----
 version 03.04
 2013-08-27
  Regist print targets by Drag & Drop.
--- a/Makefile	Tue Aug 27 18:50:00 2013 +0900
+++ b/Makefile	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 # Makefile for wxWidgets Application
-# Last Change: 27-Aug-2013.
+# Last Change: 11-Sep-2013.
 # by Takayuki Mutoh
 #
 
@@ -36,7 +36,7 @@
 	  $(OBJDIR)/kana.o \
 	  $(OBJDIR)/hist.o \
 	  $(OBJDIR)/index.o \
-	  $(OBJDIR)/mask.o \
+	  $(OBJDIR)/param.o \
 	  $(OBJDIR)/bprint.o \
 	  $(OBJDIR)/db.o \
 	  $(OBJDIR)/marksheet.o \
@@ -80,7 +80,7 @@
 $(OBJDIR)/index.o: index.cpp index.h common.h db.h
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
-$(OBJDIR)/mask.o: mask.cpp mask.h common.h
+$(OBJDIR)/param.o: param.cpp param.h common.h
 	$(CXX) -c $< -o $@ $(CXXFLAGS)
 
 $(OBJDIR)/bprint.o: bprint.cpp bprint.h marksheet.h common.h dndfile.h
--- a/include/db.h	Tue Aug 27 18:50:00 2013 +0900
+++ b/include/db.h	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : db.h
-// Last Change: 23-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 #ifndef __DB_H__
 #define __DB_H__
@@ -12,6 +12,8 @@
 wxArrayString GetHhsInfoByKana( wxString kana, bool fuzzy );
 // 被保険者番号からファイルパスを取得
 wxArrayString GetPathByHhsNo( wxString hhsno );
+// 被保険者番号リストから氏名と最新ファイルパスを取得
+wxArrayString GetHhsInfoAndPathByHhsNoList( wxArrayString hhsno );
 /* 被保険者が審査会にかかったかどうか */
 bool IsHhsJudged( wxString hhsno );
 // 合議体開催日を取得
--- a/include/dndfile.h	Tue Aug 27 18:50:00 2013 +0900
+++ b/include/dndfile.h	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : dndfile.h
-// Last Change: 27-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 
 #include "db.h"
@@ -17,6 +17,55 @@
             if ( nFiles != 1 ) return false;
 
             m_grid->ClearGrid();
+
+            // t@C۔ԃXg𐶐
+            wxTextFile csv;
+            csv.Open( filenames[0] );
+
+            wxRegEx reHhs( wxT("^0[1238][0-9]{8}$") );
+            wxArrayString hhs;
+            for ( int n = 0; n < csv.GetLineCount(); n++ ) {
+                wxString hhsno = csv.GetLine( n ).BeforeFirst( ',', NULL );
+                if ( ! reHhs.Matches( hhsno ) ) 
+                    continue;
+                hhs.Add( hhsno );
+            }
+            csv.Close();
+
+            //
+            int d = hhs.GetCount() - m_grid->GetNumberRows();
+            if ( d > 0 )
+                m_grid->AppendRows( d, true );
+
+            // ObhɏǍ
+            wxArrayString res = GetHhsInfoAndPathByHhsNoList( hhs );
+            for ( int r = 0; r < res.GetCount(); r++ ) {
+                wxArrayString data = wxSplit( res[r], '_', '\\' );
+                m_grid->SetCellValue( r, 0, data[0] );
+                m_grid->SetCellValue( r, 1, data[1] );
+                m_grid->SetCellValue( r, 2, data[2] );    
+            }
+
+            return true;
+        }
+
+    private:
+        wxGrid* m_grid;
+};
+        
+class DnDFile2 : public wxFileDropTarget
+{
+    public:
+        DnDFile2( wxGrid *grid )
+        {
+            m_grid = grid;
+        }
+        virtual bool OnDropFiles( wxCoord x, wxCoord y, const wxArrayString& filenames )
+        {
+            size_t nFiles = filenames.GetCount();
+            if ( nFiles != 1 ) return false;
+
+            m_grid->ClearGrid();
             wxTextFile csv;
             csv.Open( filenames[0] );
 
--- a/include/marksheet.h	Tue Aug 27 18:50:00 2013 +0900
+++ b/include/marksheet.h	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : marksheet.h
-// Last Change: 23-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 #ifndef __MARKSHEET_H__
 #define __MARKSHEET_H__
@@ -8,187 +8,10 @@
 
 bool IsBlack( int r, int g, int b );
 wxString GuessHhs( wxString& file );
-bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax );
-bool _IsMarksheet( wxString& file, float* brate, long* len );
+bool IsMarksheet( wxString& file, double zmin, double zmax, long lmin, long lmax );
 wxString GetHhsName( wxString& hhsno );
 int IsHhsno( wxString& hhsno, wxString& name );
 int GetMarksheetVersion( wxString file );
 
-/*
-bool IsBlack( int r, int g, int b ) 
-{
-    if ( r == 0 && g == 0 && b == 0 ) {
-        return true;
-    }
-    return false;
-};
-
-wxString GuessHhs( wxString& file ) 
-{
-    wxString hhs;
-    wxImage img( file, wxBITMAP_TYPE_JPEG );
-    int sx = 1800;  // start x
-    int sy = 315;;  // start y
-    int bw = 60;    // block width
-    int bh = 50;    // block height
-    int area = bw * bh;
-    int black = 0;
-    int x, y;
-    unsigned char r, g, b;
-
-    int max_n;
-    float max;
-    float bk;
-    for ( int c=0; c<10; c++ ) {
-        max = 0.0;
-        max_n = -1;
-        for ( int n=0; n<10; n++ ) {
-
-            for ( x=sx+bw*c; x<sx+bw*(c+1); x++ ) {
-                for ( y=sy+bh*n; y<sy+bh*(n+1); y++ ) {
-                    r = img.GetRed(   x, y );
-                    g = img.GetGreen( x, y );
-                    b = img.GetBlue(  x, y );
-                    if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
-                }
-            }
-
-            bk = (float)black / area;
-            if ( max < bk ) {
-                max = bk;
-                max_n = n;
-            }
-            //wxPuts(wxString::Format(wxT("%d %f"),n,bk));
-            black = 0;
-        }
-        hhs.Append( wxString::Format( wxT("%d"), max_n ) );
-    }
-
-    return hhs;
-};
-
-bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax )
-{
-    wxImage img( file, wxBITMAP_TYPE_JPEG );
-    int black = 0;
-    int x = 2465;
-    int h = 3500;
-    unsigned char r, g, b;
-
-    for ( int y=0; y<h; y++ ) {
-        r = img.GetRed(   x, y );
-        g = img.GetGreen( x, y );
-        b = img.GetBlue(  x, y );
-        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
-    }
-    float z = (float)black / h;
-
-    wxFile f( file );
-    long l = f.Length();
-
-    *brate = z;
-    *len = l;
-    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
-    if ( zmin < z && z < zmax
-      && lmin < l && l < lmax ) {
-        return true;
-    }
-    return false;
-};
-
-bool _IsMarksheet( wxString& file, float* brate, long* len )
-{
-    wxImage img( file, wxBITMAP_TYPE_JPEG );
-    int black = 0;
-    int x = 2465;
-    int h = 3500;
-    unsigned char r, g, b;
-
-    for ( int y=0; y<h; y++ ) {
-        r = img.GetRed(   x, y );
-        g = img.GetGreen( x, y );
-        b = img.GetBlue(  x, y );
-        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
-    }
-    float z = (float)black / h;
-    float zmin = 0.095713; float zmax = 0.108600;
-
-    wxFile f( file );
-    long l = f.Length();
-    float lmin = 2072393; float lmax = 2346082;
-
-    *brate = z;
-    *len = l;
-    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
-    if ( zmin < z && z < zmax
-      && lmin < l && l < lmax ) {
-        return true;
-    }
-    return false;
-};
-
-wxString GetHhsName( wxString& hhsno )
-{
-    wxString name;
-
-    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("hhs.db");
-    wxSQLite3Database hhsdb;
-    hhsdb.Open( gszFile );
-
-    wxSQLite3Statement stmt = hhsdb.PrepareStatement("SELECT name FROM hhs_master WHERE hhsno = ?");
-    stmt.Bind( 1, hhsno );
-    wxSQLite3ResultSet q = stmt.ExecuteQuery();
-    if ( !q.IsNull(0) ) {
-        while ( q.NextRow() ) {
-            name = q.GetString(0);
-        }
-    }
-    stmt.Finalize();
-    hhsdb.Close();
-
-    return name;
-};
-
-int IsHhsno( wxString& hhsno, wxString& name )
-{
-	wxRegEx reHhs(wxT("^0[1238][0-9]{8}$"));	// $BHoJ]HV%A%'%C%/(B
-
-    if ( reHhs.Matches( hhsno) ) {
-        name = GetHhsName( hhsno );
-        if ( name.IsEmpty() ) {  // DB$B$K$J$$(B
-            return 1;
-        }
-        return 2;
-    }
-    else {
-        return 0;
-    }
-};
-
-int GetMarksheetVersion( wxString file ) 
-{
-    wxImage img( file, wxBITMAP_TYPE_JPEG );
-    int black = 0;
-    int x = 2465;
-    int h = 3500;
-    unsigned char r, g, b;
-
-    for ( int y=0; y<h; y++ ) {
-        r = img.GetRed(   x, y );
-        g = img.GetGreen( x, y );
-        b = img.GetBlue(  x, y );
-        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
-    }
-    float z = (float)black / h;
-
-    if ( z > 0.120 ) {
-        return 2;   // 0.130 - 0.140
-    }
-    else {
-        return 1;   // 0.099 - 0.110
-    }
-};
-*/
-
 #endif // __MARKSHEET_H__
 
--- a/include/mask.h	Tue Aug 27 18:50:00 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-// Filename   : mask.h
-// Last Change: 14-Aug-2013.
-//
-
-#ifndef __MASK_H__
-#define __MASK_H__
-
-#include "common.h"
-#include "wx/config.h"
-#include "wx/fileconf.h"
-
-class MaskDialog : public wxDialog 
-{
-    DECLARE_EVENT_TABLE()
-	private:
-        long          x, y, w, h;
-        wxRect        m_mask1;
-        wxRect        m_mask2;
-        wxRect        m_mask3;
-        wxRect        m_mask1old;
-        wxRect        m_mask2old;
-        wxRect        m_mask3old;
-	
-	protected:
-		wxNotebook*   m_notebook;
-		wxPanel*      m_panel;
-		wxPanel*      m_panelold;
-
-		wxStaticText* m_staticTextDummy0;
-		wxStaticText* m_staticTextX;
-		wxStaticText* m_staticTextY;
-		wxStaticText* m_staticTextW;
-		wxStaticText* m_staticTextH;
-
-		wxStaticText* m_staticTextMask1;
-		wxTextCtrl*   m_textCtrlM1x;
-		wxTextCtrl*   m_textCtrlM1y;
-		wxTextCtrl*   m_textCtrlM1w;
-		wxTextCtrl*   m_textCtrlM1h;
-
-		wxStaticText* m_staticTextMask2;
-		wxTextCtrl*   m_textCtrlM2x;
-		wxTextCtrl*   m_textCtrlM2y;
-		wxTextCtrl*   m_textCtrlM2w;
-		wxTextCtrl*   m_textCtrlM2h;
-
-		wxStaticText* m_staticTextMask3;
-		wxTextCtrl*   m_textCtrlM3x;
-		wxTextCtrl*   m_textCtrlM3y;
-		wxTextCtrl*   m_textCtrlM3w;
-		wxTextCtrl*   m_textCtrlM3h;
-
-		wxStaticText* m_staticTextDummy0Old;
-		wxStaticText* m_staticTextXOld;
-		wxStaticText* m_staticTextYOld;
-		wxStaticText* m_staticTextWOld;
-		wxStaticText* m_staticTextHOld;
-
-		wxStaticText* m_staticTextMask1Old;
-		wxTextCtrl*   m_textCtrlM1xOld;
-		wxTextCtrl*   m_textCtrlM1yOld;
-		wxTextCtrl*   m_textCtrlM1wOld;
-		wxTextCtrl*   m_textCtrlM1hOld;
-
-		wxStaticText* m_staticTextMask2Old;
-		wxTextCtrl*   m_textCtrlM2xOld;
-		wxTextCtrl*   m_textCtrlM2yOld;
-		wxTextCtrl*   m_textCtrlM2wOld;
-		wxTextCtrl*   m_textCtrlM2hOld;
-
-		wxStaticText* m_staticTextMask3Old;
-		wxTextCtrl*   m_textCtrlM3xOld;
-		wxTextCtrl*   m_textCtrlM3yOld;
-		wxTextCtrl*   m_textCtrlM3wOld;
-		wxTextCtrl*   m_textCtrlM3hOld;
-
-		wxButton*     m_buttonCancel;
-		wxButton*     m_buttonSet;
-	
-	public:
-		
-		MaskDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
-		~MaskDialog();
-	
-        void OnSet( wxCommandEvent& WXUNUSED(event) );
-        void LoadParams( void );
-
-        // Accessor
-        void SetMask1( wxRect rect ) { m_mask1 = rect; }
-        void SetMask2( wxRect rect ) { m_mask2 = rect; }
-        void SetMask3( wxRect rect ) { m_mask3 = rect; }
-        void SetMask1Old( wxRect rect ) { m_mask1old = rect; }
-        void SetMask2Old( wxRect rect ) { m_mask2old = rect; }
-        void SetMask3Old( wxRect rect ) { m_mask3old = rect; }
-        wxRect GetMask1() const { return m_mask1; }
-        wxRect GetMask2() const { return m_mask2; }
-        wxRect GetMask3() const { return m_mask3; }
-        wxRect GetMask1Old() const { return m_mask1old; }
-        wxRect GetMask2Old() const { return m_mask2old; }
-        wxRect GetMask3Old() const { return m_mask3old; }
-};
-
-enum {
-    ID_SETPARAM = wxID_HIGHEST + 70,
-};
-
-#endif //__MASK_H__
-
--- a/include/myframe.h	Tue Aug 27 18:50:00 2013 +0900
+++ b/include/myframe.h	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : myframe.h
-// Last Change: 23-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 #ifndef __MYFRAME_H__
 #define __MYFRAME_H__
@@ -41,6 +41,7 @@
 	protected:
 		wxMenuBar*        m_menubar;
 		wxMenu*           m_menuFile;
+		wxMenu*           m_menuParam;
 		wxSplitterWindow* m_splitter;
 		wxPanel*          m_panelMain;
 		wxPanel*          m_panelView;
@@ -64,9 +65,10 @@
         void OnBPrintMode( wxCommandEvent& WXUNUSED(event) );
         void OnViewStyle( wxCommandEvent& event );
         void OnIndex( wxCommandEvent& WXUNUSED(event) );
-        void LoadMaskParam( void );
+        void LoadParam( void );
         void OnDBBackup( wxCommandEvent& WXUNUSED(event) );
         void OnMaskParam( wxCommandEvent& WXUNUSED(event) );
+        void OnMarkParam( wxCommandEvent& WXUNUSED(event) );
         void OnOpenAppDir( wxCommandEvent& WXUNUSED(event) );
         void OnSelectHhsDir( wxListEvent& event );
         void OpenHhsDir( int n );
@@ -91,6 +93,7 @@
     ID_MNINDEX,
     ID_MNDBBKUP,
     ID_MNMASKPARAM,
+    ID_MNMARKPARAM,
     ID_MNAPPDIR,
     ID_MNABOUT,
     ID_LIST,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/param.h	Wed Sep 11 19:09:14 2013 +0900
@@ -0,0 +1,121 @@
+// Filename   : param.h
+// Last Change: 11-Sep-2013.
+//
+
+#ifndef __PARAM_H__
+#define __PARAM_H__
+
+#include "common.h"
+#include "wx/config.h"
+#include "wx/fileconf.h"
+
+class ParamDialog : public wxDialog 
+{
+    DECLARE_EVENT_TABLE()
+	private:
+        long          x, y, w, h;
+        wxRect        m_mask1;
+        wxRect        m_mask2;
+        wxRect        m_mask3;
+        wxRect        m_mask1old;
+        wxRect        m_mask2old;
+        wxRect        m_mask3old;
+	
+	protected:
+		wxNotebook*   m_notebook;
+		wxPanel*      m_panel;
+		wxPanel*      m_panelold;
+		wxPanel*      m_paneljudge;
+
+        // Tab 1 
+		wxStaticText* m_staticTextDummy0;
+		wxStaticText* m_staticTextX;
+		wxStaticText* m_staticTextY;
+		wxStaticText* m_staticTextW;
+		wxStaticText* m_staticTextH;
+
+		wxStaticText* m_staticTextMask1;
+		wxTextCtrl*   m_textCtrlM1x;
+		wxTextCtrl*   m_textCtrlM1y;
+		wxTextCtrl*   m_textCtrlM1w;
+		wxTextCtrl*   m_textCtrlM1h;
+
+		wxStaticText* m_staticTextMask2;
+		wxTextCtrl*   m_textCtrlM2x;
+		wxTextCtrl*   m_textCtrlM2y;
+		wxTextCtrl*   m_textCtrlM2w;
+		wxTextCtrl*   m_textCtrlM2h;
+
+		wxStaticText* m_staticTextMask3;
+		wxTextCtrl*   m_textCtrlM3x;
+		wxTextCtrl*   m_textCtrlM3y;
+		wxTextCtrl*   m_textCtrlM3w;
+		wxTextCtrl*   m_textCtrlM3h;
+
+        // Tab 2 
+		wxStaticText* m_staticTextDummy0Old;
+		wxStaticText* m_staticTextXOld;
+		wxStaticText* m_staticTextYOld;
+		wxStaticText* m_staticTextWOld;
+		wxStaticText* m_staticTextHOld;
+
+		wxStaticText* m_staticTextMask1Old;
+		wxTextCtrl*   m_textCtrlM1xOld;
+		wxTextCtrl*   m_textCtrlM1yOld;
+		wxTextCtrl*   m_textCtrlM1wOld;
+		wxTextCtrl*   m_textCtrlM1hOld;
+
+		wxStaticText* m_staticTextMask2Old;
+		wxTextCtrl*   m_textCtrlM2xOld;
+		wxTextCtrl*   m_textCtrlM2yOld;
+		wxTextCtrl*   m_textCtrlM2wOld;
+		wxTextCtrl*   m_textCtrlM2hOld;
+
+		wxStaticText* m_staticTextMask3Old;
+		wxTextCtrl*   m_textCtrlM3xOld;
+		wxTextCtrl*   m_textCtrlM3yOld;
+		wxTextCtrl*   m_textCtrlM3wOld;
+		wxTextCtrl*   m_textCtrlM3hOld;
+
+        // Tab 3 
+		wxTextCtrl*   m_textCtrlLMin;
+		wxStaticText* m_staticTextLen;
+		wxTextCtrl*   m_textCtrlLMax;
+
+		wxTextCtrl*   m_textCtrlZMin;
+		wxStaticText* m_staticTextZ;
+		wxTextCtrl*   m_textCtrlZmax;
+
+        //
+		wxButton*     m_buttonCancel;
+		wxButton*     m_buttonSet;
+	
+	public:
+		
+		ParamDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style );
+		~ParamDialog();
+	
+        void OnSet( wxCommandEvent& WXUNUSED(event) );
+        void LoadParams( void );
+
+        // Accessor
+        void SetMask1( wxRect rect ) { m_mask1 = rect; }
+        void SetMask2( wxRect rect ) { m_mask2 = rect; }
+        void SetMask3( wxRect rect ) { m_mask3 = rect; }
+        void SetMask1Old( wxRect rect ) { m_mask1old = rect; }
+        void SetMask2Old( wxRect rect ) { m_mask2old = rect; }
+        void SetMask3Old( wxRect rect ) { m_mask3old = rect; }
+        wxRect GetMask1() const { return m_mask1; }
+        wxRect GetMask2() const { return m_mask2; }
+        wxRect GetMask3() const { return m_mask3; }
+        wxRect GetMask1Old() const { return m_mask1old; }
+        wxRect GetMask2Old() const { return m_mask2old; }
+        wxRect GetMask3Old() const { return m_mask3old; }
+};
+
+enum {
+    ID_SETPARAM = wxID_HIGHEST + 70,
+};
+
+#endif //__PARAM_H__
+
--- a/src/bprint.cpp	Tue Aug 27 18:50:00 2013 +0900
+++ b/src/bprint.cpp	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : bprint.cpp
-// Last Change: 27-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 
 #include "bprint.h"
@@ -135,6 +135,7 @@
 
         wxString file;
         bool cout = dir.GetFirst( &file, wxT("*.jpg"), wxDIR_FILES );
+        bool notyet_mask = true;
         int n = 0;
         wxString tmpdir = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH;
         while ( cout ) {
@@ -142,7 +143,12 @@
             file.Replace( wxFILE_SEP_PATH, wxT("/") );
             wxString tmpjpg = wxString::Format( wxT("%stmp%d.jpg"), tmpdir, n );
         
-            if ( n == 0 ) {       // 1枚目はマスクする
+            double zmin = 0.095713;
+            double zmax = 0.147142;
+            long lmin = 2072393;
+            long lmax = 2472318;
+
+            if ( notyet_mask && IsMarksheet( file, zmin, zmax, lmin, lmax ) ) {  // マークシート表面をマスクする
                 wxImage img_org( file, wxBITMAP_TYPE_JPEG );
                 int ver = GetMarksheetVersion( file );
                 if ( ver == 2 ) {
--- a/src/db.cpp	Tue Aug 27 18:50:00 2013 +0900
+++ b/src/db.cpp	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : db.cpp
-// Last Change: 23-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 
 #include "db.h"
@@ -243,6 +243,7 @@
     ccndb.Close();
 }
 
+//********** HHS-DB & CCN-DB **********//
 /* DB整合性チェック */
 wxArrayString CheckDBs( void )
 {
@@ -269,3 +270,47 @@
     return result;
 }
 
+// 被保険者番号リストから氏名と最新ファイルパスを取得
+wxArrayString GetHhsInfoAndPathByHhsNoList( wxArrayString hhsno )
+{
+    wxString gszFile = wxGetCwd() + wxFILE_SEP_PATH + wxT("db") + wxFILE_SEP_PATH + wxT("ccn.db");
+    wxSQLite3Database ccndb;
+    ccndb.Open( gszFile );
+
+    wxString sql = wxT( "ATTACH 'db/hhs.db' AS hhs;" );
+    wxSQLite3Statement stmt = ccndb.PrepareStatement( sql );
+    wxSQLite3ResultSet q = stmt.ExecuteQuery();
+
+    wxArrayString result;
+    for ( int i = 0; i < hhsno.GetCount(); i++ ) {
+        wxString str = hhsno[i];
+        str.Append( wxT("_") );
+
+        sql = wxT( "SELECT name FROM hhs.hhs_master WHERE hhsno = ?;" );
+        stmt = ccndb.PrepareStatement( sql );
+        stmt.Bind( 1, hhsno[i] );
+        q = stmt.ExecuteQuery();
+        if ( !q.IsNull(0) ) {
+            while ( q.NextRow() ) {
+                str.Append( q.GetString(0) );
+            }
+        }
+        str.Append( wxT("_") );
+
+        sql = wxT( "SELECT path FROM path WHERE hhsno = ? ORDER BY path DESC LIMIT 1;" );
+        stmt = ccndb.PrepareStatement( sql );
+        stmt.Bind( 1, hhsno[i] );
+        q = stmt.ExecuteQuery();
+        if ( !q.IsNull(0) ) {
+            while ( q.NextRow() ) {
+                str.Append( q.GetString(0) );
+            }
+        }
+
+        result.Add( str );
+    }
+    stmt.Finalize();
+    ccndb.Close();
+
+    return result;
+}
--- a/src/marksheet.cpp	Tue Aug 27 18:50:00 2013 +0900
+++ b/src/marksheet.cpp	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : marksheet.cpp
-// Last Change: 23-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 
 #include "common.h"
@@ -57,7 +57,7 @@
     return hhs;
 }
 
-bool IsMarksheet( wxString& file, float* brate, long* len, double zmin, double zmax, long lmin, long lmax )
+bool IsMarksheet( wxString& file, double zmin, double zmax, long lmin, long lmax )
 {
     wxImage img( file, wxBITMAP_TYPE_JPEG );
     int black = 0;
@@ -76,9 +76,7 @@
     wxFile f( file );
     long l = f.Length();
 
-    *brate = z;
-    *len = l;
-    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
+    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,l));
     if ( zmin < z && z < zmax
       && lmin < l && l < lmax ) {
         return true;
@@ -86,36 +84,6 @@
     return false;
 }
 
-bool _IsMarksheet( wxString& file, float* brate, long* len )
-{
-    wxImage img( file, wxBITMAP_TYPE_JPEG );
-    int black = 0;
-    int x = 2465;
-    int h = 3500;
-    unsigned char r, g, b;
-
-    for ( int y=0; y<h; y++ ) {
-        r = img.GetRed(   x, y );
-        g = img.GetGreen( x, y );
-        b = img.GetBlue(  x, y );
-        if( IsBlack( (int)r, (int)g, (int)b ) ) black++;
-    }
-    float z = (float)black / h;
-    float zmin = 0.095713; float zmax = 0.108600;
-
-    wxFile f( file );
-    long l = f.Length();
-    float lmin = 2072393; float lmax = 2346082;
-
-    *brate = z;
-    *len = l;
-    //wxPuts(wxString::Format(wxT("z = %f, len = %d"),z,len));
-    if ( zmin < z && z < zmax
-      && lmin < l && l < lmax ) {
-        return true;
-    }
-    return false;
-}
 
 wxString GetHhsName( wxString& hhsno )
 {
--- a/src/mask.cpp	Tue Aug 27 18:50:00 2013 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-// Filename   : mask.cpp
-// Last Change: 14-Aug-2013.
-//
-
-#include "mask.h"
-
-MaskDialog::MaskDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) 
-    : wxDialog( parent, id, title, pos, size, style )
-{
-	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
-	
-	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );
-
-	m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
-	m_panel    = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxSize( 310, -1 ), wxTAB_TRAVERSAL );
-	m_panelold = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
-	
-    // 現マークシートパネル
-	wxFlexGridSizer* fgSizer = new wxFlexGridSizer( 0, 5, 0, 0 );
-	fgSizer->SetFlexibleDirection( wxBOTH );
-	fgSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-	
-	m_staticTextDummy0 = new wxStaticText( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextDummy0, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextX = new wxStaticText( m_panel, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextX, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextY = new wxStaticText( m_panel, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextY, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextW = new wxStaticText( m_panel, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextW, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextH = new wxStaticText( m_panel, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextH, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextMask1 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextMask1, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM1x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM1y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM1w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM1w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM1h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextMask2 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextMask2, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM2x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM2y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM2w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM2w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM2h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextMask3 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizer->Add( m_staticTextMask3, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM3x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM3y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM3w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM3w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizer->Add( m_textCtrlM3h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_panel->SetSizer( fgSizer );
-	m_panel->Layout();
-	fgSizer->Fit( m_panel );
-	m_notebook->AddPage( m_panel, wxT("現マークシート"), false );
-
-    // 旧マークシートパネル
-	wxFlexGridSizer* fgSizerOld = new wxFlexGridSizer( 0, 5, 0, 0 );
-	fgSizerOld->SetFlexibleDirection( wxBOTH );
-	fgSizerOld->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-	
-	m_staticTextDummy0Old = new wxStaticText( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextDummy0Old, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextXOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextXOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextYOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextYOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextWOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextWOld, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextHOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextHOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-	m_staticTextMask1Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextMask1Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM1xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM1yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM1wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM1wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM1hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM1hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextMask2Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextMask2Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM2xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM2yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM2wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM2wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM2hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM2hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_staticTextMask3Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
-	fgSizerOld->Add( m_staticTextMask3Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM3xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM3yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-	
-	m_textCtrlM3wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM3wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
-	
-	m_textCtrlM3hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
-	fgSizerOld->Add( m_textCtrlM3hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-	m_panelold->SetSizer( fgSizerOld );
-	m_panelold->Layout();
-	fgSizerOld->Fit( m_panelold );
-	m_notebook->AddPage( m_panelold, wxT("旧マークシート"), false );
-
-	bSizerTop->Add( m_notebook, 1, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
-	
-    //
-	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
-	
-	m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("キャンセル"), wxDefaultPosition, wxDefaultSize, 0 );
-	m_buttonCancel->SetDefault(); 
-	bSizerBtn->Add( m_buttonCancel, 0, wxALL, 5 );
-	
-	m_buttonSet = new wxButton( this, ID_SETPARAM, wxT("セット"), wxDefaultPosition, wxDefaultSize, 0 );
-	bSizerBtn->Add( m_buttonSet, 0, wxALL, 5 );
-	
-	bSizerTop->Add( bSizerBtn, 0, wxALIGN_RIGHT|wxALL, 5 );
-	
-	this->SetSizer( bSizerTop );
-	this->Layout();
-	
-	this->Centre( wxBOTH );
-}
-
-MaskDialog::~MaskDialog()
-{
-}
-
-// Event Table
-BEGIN_EVENT_TABLE( MaskDialog, wxDialog )
-    EVT_BUTTON( ID_SETPARAM, MaskDialog::OnSet )
-END_EVENT_TABLE()
-
-// Event Handlers & Functions
-void MaskDialog::OnSet( wxCommandEvent& WXUNUSED(event) )
-{
-    wxString buf;
-    buf = m_textCtrlM1x->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM1y->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM1w->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM1h->GetValue(); buf.ToLong( &h, 10 );
-    m_mask1.SetPosition( wxPoint( x, y ) ); 
-    m_mask1.SetSize( wxSize( w, h ) ); 
-
-    buf = m_textCtrlM2x->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM2y->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM2w->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM2h->GetValue(); buf.ToLong( &h, 10 );
-    m_mask2.SetPosition( wxPoint( x, y ) ); 
-    m_mask2.SetSize( wxSize( w, h ) ); 
-
-    buf = m_textCtrlM3x->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM3y->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM3w->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM3h->GetValue(); buf.ToLong( &h, 10 );
-    m_mask3.SetPosition( wxPoint( x, y ) ); 
-    m_mask3.SetSize( wxSize( w, h ) ); 
-
-    buf = m_textCtrlM1xOld->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM1yOld->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM1wOld->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM1hOld->GetValue(); buf.ToLong( &h, 10 );
-    m_mask1old.SetPosition( wxPoint( x, y ) ); 
-    m_mask1old.SetSize( wxSize( w, h ) ); 
-
-    buf = m_textCtrlM2xOld->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM2yOld->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM2wOld->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM2hOld->GetValue(); buf.ToLong( &h, 10 );
-    m_mask2old.SetPosition( wxPoint( x, y ) ); 
-    m_mask2old.SetSize( wxSize( w, h ) ); 
-
-    buf = m_textCtrlM3xOld->GetValue(); buf.ToLong( &x, 10 );
-    buf = m_textCtrlM3yOld->GetValue(); buf.ToLong( &y, 10 );
-    buf = m_textCtrlM3wOld->GetValue(); buf.ToLong( &w, 10 );
-    buf = m_textCtrlM3hOld->GetValue(); buf.ToLong( &h, 10 );
-    m_mask3old.SetPosition( wxPoint( x, y ) ); 
-    m_mask3old.SetSize( wxSize( w, h ) ); 
-
-    if ( IsModal() ) 
-        EndModal( wxID_OK );
-    else {
-        SetReturnCode( wxID_OK );
-        Show( false );
-    }
-}
-
-void MaskDialog::LoadParams( void )
-{
-    m_textCtrlM1x->SetValue( wxString::Format( wxT("%d"), m_mask1.GetX() ) );
-    m_textCtrlM1y->SetValue( wxString::Format( wxT("%d"), m_mask1.GetY() ) );
-    m_textCtrlM1w->SetValue( wxString::Format( wxT("%d"), m_mask1.GetWidth() ) );
-    m_textCtrlM1h->SetValue( wxString::Format( wxT("%d"), m_mask1.GetHeight() ) );
-    m_textCtrlM2x->SetValue( wxString::Format( wxT("%d"), m_mask2.GetX() ) );
-    m_textCtrlM2y->SetValue( wxString::Format( wxT("%d"), m_mask2.GetY() ) );
-    m_textCtrlM2w->SetValue( wxString::Format( wxT("%d"), m_mask2.GetWidth() ) );
-    m_textCtrlM2h->SetValue( wxString::Format( wxT("%d"), m_mask2.GetHeight() ) );
-    m_textCtrlM3x->SetValue( wxString::Format( wxT("%d"), m_mask3.GetX() ) );
-    m_textCtrlM3y->SetValue( wxString::Format( wxT("%d"), m_mask3.GetY() ) );
-    m_textCtrlM3w->SetValue( wxString::Format( wxT("%d"), m_mask3.GetWidth() ) );
-    m_textCtrlM3h->SetValue( wxString::Format( wxT("%d"), m_mask3.GetHeight() ) );
-
-    m_textCtrlM1xOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetX() ) );
-    m_textCtrlM1yOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetY() ) );
-    m_textCtrlM1wOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetWidth() ) );
-    m_textCtrlM1hOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetHeight() ) );
-    m_textCtrlM2xOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetX() ) );
-    m_textCtrlM2yOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetY() ) );
-    m_textCtrlM2wOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetWidth() ) );
-    m_textCtrlM2hOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetHeight() ) );
-    m_textCtrlM3xOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetX() ) );
-    m_textCtrlM3yOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetY() ) );
-    m_textCtrlM3wOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetWidth() ) );
-    m_textCtrlM3hOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetHeight() ) );
-}
-
--- a/src/myframe.cpp	Tue Aug 27 18:50:00 2013 +0900
+++ b/src/myframe.cpp	Wed Sep 11 19:09:14 2013 +0900
@@ -1,5 +1,5 @@
 // Filename   : myframe.cpp
-// Last Change: 27-Aug-2013.
+// Last Change: 11-Sep-2013.
 //
 #include "main.h"
 #include "db.h"
@@ -7,7 +7,7 @@
 #include "kana.h"
 #include "hist.h"
 #include "index.h"
-#include "mask.h"
+#include "param.h"
 #include "marksheet.h"
 #include "myframe.h"
 #include "bprint.h"
@@ -97,9 +97,17 @@
 	wxMenuItem* m_menuItemBkup = new wxMenuItem( m_menuFile, ID_MNDBBKUP, wxString( wxT("DBバックアップ(&B)") ) , wxT("Backup databases"), wxITEM_NORMAL );
 	m_menuFile->Append( m_menuItemBkup );
 
-	wxMenuItem* m_menuItemMask = new wxMenuItem( m_menuFile, ID_MNMASKPARAM, wxString( wxT("マスクパラメータ(&M)") ) , wxT("Setup mask parameters"), wxITEM_NORMAL );
-	m_menuFile->Append( m_menuItemMask );
+    // params
+	m_menuParam = new wxMenu();
+	wxMenuItem* m_menuItemMask = new wxMenuItem( m_menuParam, ID_MNMASKPARAM, wxString( wxT("マスク(&M)") ) , wxT("Setup mask parameters"), wxITEM_NORMAL );
+	m_menuParam->Append( m_menuItemMask );
 
+	wxMenuItem* m_menuItemMark = new wxMenuItem( m_menuParam, ID_MNMARKPARAM, wxString( wxT("マークシート(&S)") ) , wxT("Setup marksheet parameters"), wxITEM_NORMAL );
+	m_menuParam->Append( m_menuItemMark );
+
+	m_menuFile->Append( -1, wxT("パラメータ(&P)"), m_menuParam );
+
+    //
 	wxMenuItem* m_menuItemAppDir = new wxMenuItem( m_menuFile, ID_MNAPPDIR, wxString( wxT("アプリケーションフォルダを開く(&O)") ) , wxT("Open application directory"), wxITEM_NORMAL );
 	m_menuFile->Append( m_menuItemAppDir );
 	
@@ -200,7 +208,7 @@
     SetStatusText( wxT("被保番を入力してスタート!") );
 	
 	this->Centre( wxBOTH );
-    LoadMaskParam();
+    LoadParam();
 }
 
 MyFrame::~MyFrame()
@@ -216,6 +224,7 @@
     EVT_MENU( ID_MNINDEX, MyFrame::OnIndex )
     EVT_MENU( ID_MNDBBKUP, MyFrame::OnDBBackup )
     EVT_MENU( ID_MNMASKPARAM, MyFrame::OnMaskParam )
+    EVT_MENU( ID_MNMASKPARAM, MyFrame::OnMarkParam )
     EVT_MENU( ID_MNAPPDIR, MyFrame::OnOpenAppDir )
     EVT_LIST_ITEM_ACTIVATED( ID_LIST, MyFrame::OnSelectHhsDir )
     EVT_BUTTON( ID_KANA, MyFrame::OnKana )
@@ -263,8 +272,8 @@
 
     event.Skip();
 }
-/* マスクパラメータを設定ファイルから読み込む */
-void MyFrame::LoadMaskParam( void )
+/* パラメータを設定ファイルから読み込む */
+void MyFrame::LoadParam( void )
 {
     conf_file = wxGetCwd() + wxFILE_SEP_PATH + wxT("app.conf");
     config = new wxFileConfig( wxT("MyApp"), wxT("T.Mutoh"), conf_file, wxEmptyString, wxCONFIG_USE_LOCAL_FILE );
@@ -330,14 +339,20 @@
 
     wxString file;
     bool cout = dir.GetFirst( &file, wxT("*.jpg"), wxDIR_FILES );
+    bool notyet_mask = true;
     int n = 0;
     wxString tmpdir = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH;
     while ( cout ) {
         file = path[0] + wxFILE_SEP_PATH + file;
         file.Replace( wxFILE_SEP_PATH, wxT("/") );
         wxString tmpjpg = wxString::Format( wxT("%stmp%d.jpg"), tmpdir, n );
+
+        double zmin = 0.095713;
+        double zmax = 0.147142;
+        long lmin = 2072393;
+        long lmax = 2472318;
         
-        if ( n == 0 ) {       // 1枚目はマスクする
+        if ( notyet_mask && IsMarksheet( file, zmin, zmax, lmin, lmax ) ) {  // マークシート表面をマスクする
             wxImage img_org( file, wxBITMAP_TYPE_JPEG );
             int ver = GetMarksheetVersion( file );
             if ( ver == 2 ) {
@@ -351,6 +366,7 @@
                 img_org.SetRGB( m_mask3old, 255, 255, 255 );   // barcode
             }
             img_org.SaveFile( tmpjpg );
+            notyet_mask = false;
         }
         else {
             wxCopyFile( file, tmpjpg, true );
@@ -397,26 +413,31 @@
     index->SetRootdir( rootdir );
     index->ShowModal();
 }
+/* マークシートパラメータ設定ダイアログ */
+void MyFrame::OnMarkParam( wxCommandEvent& WXUNUSED(event) )
+{
+    ParamDialog* param = new ParamDialog( this, wxID_ANY, wxT("マークシート判定パラメータの指定"), wxDefaultPosition, wxSize( 350, 250 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+}
 /* マスクパラメータ設定ダイアログ */
 void MyFrame::OnMaskParam( wxCommandEvent& WXUNUSED(event) )
 {
-    MaskDialog* mask = new MaskDialog( this, wxID_ANY, wxT("マスク位置とサイズの指定"), wxDefaultPosition, wxSize( 350, 250 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
-    mask->SetMask1( m_mask1 );
-    mask->SetMask2( m_mask2 );
-    mask->SetMask3( m_mask3 );
-    mask->SetMask1Old( m_mask1old );
-    mask->SetMask2Old( m_mask2old );
-    mask->SetMask3Old( m_mask3old );
-    mask->LoadParams();
-    mask->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
+    ParamDialog* param = new ParamDialog( this, wxID_ANY, wxT("マスク位置とサイズの指定"), wxDefaultPosition, wxSize( 350, 250 ), wxCAPTION|wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxTAB_TRAVERSAL );
+    param->SetMask1( m_mask1 );
+    param->SetMask2( m_mask2 );
+    param->SetMask3( m_mask3 );
+    param->SetMask1Old( m_mask1old );
+    param->SetMask2Old( m_mask2old );
+    param->SetMask3Old( m_mask3old );
+    param->LoadParams();
+    param->ShowWithEffect( wxSHOW_EFFECT_SLIDE_TO_BOTTOM );
 
-    if ( mask->ShowModal() == wxID_OK ) {
-        m_mask1    = mask->GetMask1();
-        m_mask2    = mask->GetMask2();
-        m_mask3    = mask->GetMask3();
-        m_mask1old = mask->GetMask1Old();
-        m_mask2old = mask->GetMask2Old();
-        m_mask3old = mask->GetMask3Old();
+    if ( param->ShowModal() == wxID_OK ) {
+        m_mask1    = param->GetMask1();
+        m_mask2    = param->GetMask2();
+        m_mask3    = param->GetMask3();
+        m_mask1old = param->GetMask1Old();
+        m_mask2old = param->GetMask2Old();
+        m_mask3old = param->GetMask3Old();
 
         config->SetPath( wxT("/Mask") );
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/param.cpp	Wed Sep 11 19:09:14 2013 +0900
@@ -0,0 +1,296 @@
+// Filename   : param.cpp
+// Last Change: 11-Sep-2013.
+//
+
+#include "param.h"
+
+ParamDialog::ParamDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) 
+    : wxDialog( parent, id, title, pos, size, style )
+{
+	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+	
+	wxBoxSizer* bSizerTop = new wxBoxSizer( wxVERTICAL );
+
+	m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+	m_panel      = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxSize( 310, -1 ), wxTAB_TRAVERSAL );
+	m_panelold   = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+	m_paneljudge = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+	
+    // Tab 1 : 現マークシートマスクパネル
+	wxFlexGridSizer* fgSizer = new wxFlexGridSizer( 0, 5, 0, 0 );
+	fgSizer->SetFlexibleDirection( wxBOTH );
+	fgSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	m_staticTextDummy0 = new wxStaticText( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextDummy0, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextX = new wxStaticText( m_panel, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextX, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextY = new wxStaticText( m_panel, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextY, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextW = new wxStaticText( m_panel, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextW, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextH = new wxStaticText( m_panel, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextH, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextMask1 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextMask1, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM1x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM1y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM1w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM1w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM1h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask2 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextMask2, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM2x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM2y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM2w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM2w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM2h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask3 = new wxStaticText( m_panel, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizer->Add( m_staticTextMask3, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3x = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM3x, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3y = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM3y, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM3w = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM3w, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3h = new wxTextCtrl( m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizer->Add( m_textCtrlM3h, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_panel->SetSizer( fgSizer );
+	m_panel->Layout();
+	fgSizer->Fit( m_panel );
+	m_notebook->AddPage( m_panel, wxT("現マークシート"), false );
+
+    // Tab 2 : 旧マークシートマスクパネル
+	wxFlexGridSizer* fgSizerOld = new wxFlexGridSizer( 0, 5, 0, 0 );
+	fgSizerOld->SetFlexibleDirection( wxBOTH );
+	fgSizerOld->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+	
+	m_staticTextDummy0Old = new wxStaticText( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextDummy0Old, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextXOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(x)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextXOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextYOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(y)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextYOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextWOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(w)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextWOld, 0, wxALL|wxALIGN_BOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextHOld = new wxStaticText( m_panelold, wxID_ANY, wxT("(h)"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextHOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_staticTextMask1Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク1"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask1Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM1wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM1hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM1hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask2Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク2"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask2Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM2wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM2hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM2hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_staticTextMask3Old = new wxStaticText( m_panelold, wxID_ANY, wxT("マスク3"), wxDefaultPosition, wxDefaultSize, 0 );
+	fgSizerOld->Add( m_staticTextMask3Old, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3xOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3xOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3yOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3yOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlM3wOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3wOld, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
+	
+	m_textCtrlM3hOld = new wxTextCtrl( m_panelold, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), wxTE_RIGHT );
+	fgSizerOld->Add( m_textCtrlM3hOld, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_panelold->SetSizer( fgSizerOld );
+	m_panelold->Layout();
+	fgSizerOld->Fit( m_panelold );
+	m_notebook->AddPage( m_panelold, wxT("旧マークシート"), false );
+
+    // Tab 3 : マークシート判定パネル
+	wxGridSizer* gSizer = new wxGridSizer( 2, 3, 0, 0 );
+	
+	m_textCtrlLMin = new wxTextCtrl( m_paneljudge, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_RIGHT );
+	gSizer->Add( m_textCtrlLMin, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 20 );
+	
+	m_staticTextLen = new wxStaticText( m_paneljudge, wxID_ANY, wxT("< レングス(l) <"), wxDefaultPosition, wxDefaultSize, 0 );
+	gSizer->Add( m_staticTextLen, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+	
+	m_textCtrlLMax = new wxTextCtrl( m_paneljudge, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_RIGHT );
+	gSizer->Add( m_textCtrlLMax, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 20 );
+	
+	m_textCtrlZMin = new wxTextCtrl( m_paneljudge, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_RIGHT );
+	gSizer->Add( m_textCtrlZMin, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT, 20 );
+	
+	m_staticTextZ = new wxStaticText( m_paneljudge, wxID_ANY, wxT("< 黒色比率(z) <"), wxDefaultPosition, wxDefaultSize, 0 );
+	gSizer->Add( m_staticTextZ, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+	
+	m_textCtrlZmax = new wxTextCtrl( m_paneljudge, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_RIGHT );
+	gSizer->Add( m_textCtrlZmax, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 20 );
+
+	bSizerTop->Add( m_notebook, 1, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+	m_paneljudge->SetSizer( gSizer );
+	m_paneljudge->Layout();
+	gSizer->Fit( m_paneljudge );
+	m_notebook->AddPage( m_paneljudge, wxT("マークシート判定"), false );
+	
+    //
+	wxBoxSizer* bSizerBtn = new wxBoxSizer( wxHORIZONTAL );
+	
+	m_buttonCancel = new wxButton( this, wxID_CANCEL, wxT("キャンセル"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_buttonCancel->SetDefault(); 
+	bSizerBtn->Add( m_buttonCancel, 0, wxALL, 5 );
+	
+	m_buttonSet = new wxButton( this, ID_SETPARAM, wxT("セット"), wxDefaultPosition, wxDefaultSize, 0 );
+	bSizerBtn->Add( m_buttonSet, 0, wxALL, 5 );
+	
+	bSizerTop->Add( bSizerBtn, 0, wxALIGN_RIGHT|wxALL, 5 );
+	
+	this->SetSizer( bSizerTop );
+	this->Layout();
+	
+	this->Centre( wxBOTH );
+}
+
+ParamDialog::~ParamDialog()
+{
+}
+
+// Event Table
+BEGIN_EVENT_TABLE( ParamDialog, wxDialog )
+    EVT_BUTTON( ID_SETPARAM, ParamDialog::OnSet )
+END_EVENT_TABLE()
+
+// Event Handlers & Functions
+void ParamDialog::OnSet( wxCommandEvent& WXUNUSED(event) )
+{
+    wxString buf;
+    buf = m_textCtrlM1x->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM1y->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM1w->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM1h->GetValue(); buf.ToLong( &h, 10 );
+    m_mask1.SetPosition( wxPoint( x, y ) ); 
+    m_mask1.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM2x->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM2y->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM2w->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM2h->GetValue(); buf.ToLong( &h, 10 );
+    m_mask2.SetPosition( wxPoint( x, y ) ); 
+    m_mask2.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM3x->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM3y->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM3w->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM3h->GetValue(); buf.ToLong( &h, 10 );
+    m_mask3.SetPosition( wxPoint( x, y ) ); 
+    m_mask3.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM1xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM1yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM1wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM1hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask1old.SetPosition( wxPoint( x, y ) ); 
+    m_mask1old.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM2xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM2yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM2wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM2hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask2old.SetPosition( wxPoint( x, y ) ); 
+    m_mask2old.SetSize( wxSize( w, h ) ); 
+
+    buf = m_textCtrlM3xOld->GetValue(); buf.ToLong( &x, 10 );
+    buf = m_textCtrlM3yOld->GetValue(); buf.ToLong( &y, 10 );
+    buf = m_textCtrlM3wOld->GetValue(); buf.ToLong( &w, 10 );
+    buf = m_textCtrlM3hOld->GetValue(); buf.ToLong( &h, 10 );
+    m_mask3old.SetPosition( wxPoint( x, y ) ); 
+    m_mask3old.SetSize( wxSize( w, h ) ); 
+
+    if ( IsModal() ) 
+        EndModal( wxID_OK );
+    else {
+        SetReturnCode( wxID_OK );
+        Show( false );
+    }
+}
+
+void ParamDialog::LoadParams( void )
+{
+    m_textCtrlM1x->SetValue( wxString::Format( wxT("%d"), m_mask1.GetX() ) );
+    m_textCtrlM1y->SetValue( wxString::Format( wxT("%d"), m_mask1.GetY() ) );
+    m_textCtrlM1w->SetValue( wxString::Format( wxT("%d"), m_mask1.GetWidth() ) );
+    m_textCtrlM1h->SetValue( wxString::Format( wxT("%d"), m_mask1.GetHeight() ) );
+    m_textCtrlM2x->SetValue( wxString::Format( wxT("%d"), m_mask2.GetX() ) );
+    m_textCtrlM2y->SetValue( wxString::Format( wxT("%d"), m_mask2.GetY() ) );
+    m_textCtrlM2w->SetValue( wxString::Format( wxT("%d"), m_mask2.GetWidth() ) );
+    m_textCtrlM2h->SetValue( wxString::Format( wxT("%d"), m_mask2.GetHeight() ) );
+    m_textCtrlM3x->SetValue( wxString::Format( wxT("%d"), m_mask3.GetX() ) );
+    m_textCtrlM3y->SetValue( wxString::Format( wxT("%d"), m_mask3.GetY() ) );
+    m_textCtrlM3w->SetValue( wxString::Format( wxT("%d"), m_mask3.GetWidth() ) );
+    m_textCtrlM3h->SetValue( wxString::Format( wxT("%d"), m_mask3.GetHeight() ) );
+
+    m_textCtrlM1xOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetX() ) );
+    m_textCtrlM1yOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetY() ) );
+    m_textCtrlM1wOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetWidth() ) );
+    m_textCtrlM1hOld->SetValue( wxString::Format( wxT("%d"), m_mask1old.GetHeight() ) );
+    m_textCtrlM2xOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetX() ) );
+    m_textCtrlM2yOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetY() ) );
+    m_textCtrlM2wOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetWidth() ) );
+    m_textCtrlM2hOld->SetValue( wxString::Format( wxT("%d"), m_mask2old.GetHeight() ) );
+    m_textCtrlM3xOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetX() ) );
+    m_textCtrlM3yOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetY() ) );
+    m_textCtrlM3wOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetWidth() ) );
+    m_textCtrlM3hOld->SetValue( wxString::Format( wxT("%d"), m_mask3old.GetHeight() ) );
+}
+