ウィザードダイアログを作成する

Xファンクションはウィザードダイアログをサポートしています。ウィザードダイアログを作成するには、n+1分のXファンクションを準備する必要があります。ここでnはウィザードのページ数です。1つはメインとなるXファンクションです。メインのXファンクションはウィザードページを作成するのに視聴され、スクリプトモードがオフの場合はダイアログを開き、スクリプトモードがオンの場合はダイアログを開かずに実行されます。

内容

  1. 1 ウィザードの作成
  2. 2 Xファンクションを使用する
    1. 2.1 ウィザードダイアログの実行
    2. 2.2 ダイアログなしのスクリプトモードで実行

ウィザードの作成

以下のサンプルは2ページのウィザードを作成する方法を示します。ページ1はXY範囲を指定するのに使用し、選択したデータ範囲のサブX範囲も指定します。ページ2は指定した塗り色の長方形を追加してソースグラフに反映します。長方形の左のXと右のXはページ1のX from/toと同じ値になります。

  1. ヘッダファイル、wizDlg.hをユーザファイルフォルダ\OriginC\ フォルダに追加します。以下のコードをヘッダファイルに入力してサブクラスをOrigin C 組み込みの X-Functionウィザードクラスに入力します。Xファンクションの基本的なウィザードクラスは次の通りです。
    #ifndef __WIZ_DLG_H__
    #define __WIZ_DLG_H__
     
    #include <..\OriginLab\XFWiz.h>
    #include <..\OriginLab\XFCore.h>
     
    #include <..\OriginLab\WizOperation.h>
    #include <..\OriginLab\XFWizNavigation.h>
    #include <..\OriginLab\XFWizManager.h>
    #include <..\OriginLab\XFWizScript.h>
    #include <..\OriginLab\XFWizDlg.h>
     
    #include <..\OriginLab\XFWizard_utils.h>
     
    ///////////////////////////////////////////////////////////////////////////
    class WizDlgCore : public XFCore
    {
    public:
            WizDlgCore()
            {
            }
     
            void SetXRange(double from, double to)
            {
                    m_dFrom = from;
                    m_dTo = to;
            }
     
            void GetXRange(double& from, double& to)
            {
                    from = m_dFrom;
                    to = m_dTo;
            }
     
    private:
            double m_dFrom;
            double m_dTo;
    };
     
    ///////////////////////////////////////////////////////////////////////////
    class WizDlgTheme : public XFWizTheme
    {
    };
     
    ///////////////////////////////////////////////////////////////////////////
    class WizDlgInputOutputRange : public XFWizInputOutputRange
    {
    };
     
    ///////////////////////////////////////////////////////////////////////////
    class WizDlgManager : public XFWizManager
    {
    public:
            WizDlgManager(LPCSTR lpcszThemeName = NULL, 
            const XFWizTheme *pXFWizTheme = NULL, 
            const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwUIDOp = 0);
     
    protected: 
            virtual XFCore*    CreateXFCore() { return new WizDlgCore; }
            virtual XFWizTheme*        CreateXFWizTheme() { return new WizDlgTheme; }
            virtual XFWizInputOutputRange* CreateXFWizInputOutputRange() 
            { 
                    return new WizDlgInputOutputRange; 
            }
     
            virtual string  GetClassName() { return "WizDlgExample"; }   
    };
     
    #define STR_XFNAME_PAGE_1                       "wizPage1"
    #define STR_XFNAME_PAGE_2                       "wizPage2"
     
    #define STR_LABEL_XFNAME_PAGE_1         "Page 1"
    #define STR_LABEL_XFNAME_PAGE_2         "Page 2"
     
    WizDlgManager::WizDlgManager(LPCSTR lpcszThemeName, 
            const XFWizTheme *pXFWizTheme, const XFWizInputOutputRange *pXFWizIO, 
            DWORD dwUIDOp) // = NULL, NULL, NULL, 0
    : XFWizManager(lpcszThemeName, pXFWizTheme, pXFWizIO, dwUIDOp)
    {
            StringArray saMapXFNames = {STR_XFNAME_PAGE_1, STR_XFNAME_PAGE_2};
            StringArray saMapXFLabels = {STR_LABEL_XFNAME_PAGE_1, 
                                    STR_LABEL_XFNAME_PAGE_2};
            m_saMapXFNames = saMapXFNames;
            m_saMapXFLabels = saMapXFLabels;
            ASSERT( m_saMapXFNames.GetSize() == m_saMapXFLabels.GetSize() );
     
            m_saDefaultXFNames = saMapXFNames;
    }
     
    ///////////////////////////////////////////////////////////////////////////
    int run_wiz_nodlg(LPCSTR lpcszThemeName = NULL, 
            const XFWizTheme *pXFWizTheme = NULL, 
            const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwOPUID = 0)
    {
            TEMPLATE_run_wiz_nodlg(WizDlgManager, lpcszThemeName, pXFWizTheme, 
                            pXFWizIO, dwOPUID)
    }
     
    int open_wiz_dlg(LPCSTR lpcszThemeName = NULL, 
            const XFWizTheme *pXFWizTheme = NULL, 
            const XFWizInputOutputRange *pXFWizIO = NULL, DWORD dwOPUID = 0)
    {
            TEMPLATE_open_wiz_dlg(WizDlgManager, lpcszThemeName, pXFWizTheme, 
                            pXFWizIO, dwOPUID)
    }
     
    #endif  //__WIZ_DLG_H__
            
    
  2. F10を押してXファンクションビルダを開き、メインのXファンクションを以下のように作成します。
    OCguide xf wizard main dlg vars.png
    Ocguide xfdialog savebutton.pngボタンをクリックして、Xファンクションを保存します。Xファンクションビルダ を閉じます。
  3. コードビルダを開き、wizDlg.OXFファイルを開いて現在のワークスペースに追加します。//put additional include files here行の後に、次のヘッダファイルを追加します。
    #include <..\OriginLab\XFWiz.h>
     
    #include <event_utils.h>
    #include <..\OriginLab\WksOperation.h>
    #include <..\OriginLab\WizOperation.h>
     
    #include <..\OriginLab\XFCore.h>
    #include <..\OriginLab\XFWizNavigation.h>
    #include <..\OriginLab\XFWizManager.h>
    #include <..\OriginLab\XFWizScript.h>
    #include <..\OriginLab\XFWizDlg.h>
    #include <..\OriginLab\XFWizard_utils.h>
     
    #include <..\Originlab\wizDlg.h> // ユーザはこのサンプルのためにヘッダファイルを追加
            
    
  4. 以下のコードをメインのwizDlg関数に追加してください。
    WizDlgInputOutputRange objXFWizIO;
    if(!xfwiz_construct_input_range(&objXFWizIO, STR_XFNAME_PAGE_1,  iy))
    {
            XF_THROW(XFERR_FAIL_TO_UPDATE_GETN_TREE);     
    }        
     
    if( script )
    {
            run_wiz_nodlg(theme, NULL, &objXFWizIO);
    }
    else
    {
            open_wiz_dlg(theme, NULL, &objXFWizIO);
    }
    
  5. F10を押してXファンクションビルダを開き、ウィザードのページ1のためのXファンクションのwizPage1 を以下のように作成します。
    OCguide xf wizard page1 vars.png
  6. //put additional include files here行の後に、次のユーザ定義ヘッダファイルを次のように入力します。
    #include <..\Originlab\wizDlg.h> // ユーザはこの例のためにヘッダファイルを追加
            
    
  7. 以下のコードを、ページ1のメイン関数wizPage1に貼り付けます。
    WizDlgCore* pWizCore = 
            (WizDlgCore*)get_xf_core_handler(NODE_NAME_XF_WIZ_CORE_POINTER);
    ASSERT(pWizCore);
     
    // X From/To をWizCore クラスオブジェクトにセット
    pWizCore->SetXRange(xfrom, xto);
            
    
  8. 以下のコードをwizPage1 Xファンクションの_event1関数、wizPage1_before_executeに追加して、xfrom とxtoのコントロールを入力データ範囲に応じて起動します。
    if( PDS_AUTO == okutil_cvt_str_to_predefined_type(trGetN.xfrom.strVal) 
            || PDS_AUTO == okutil_cvt_str_to_predefined_type(trGetN.xto.strVal) )
    {
            DataRange dr;
            TreeNode trRange = trGetN.iy;
            okxf_resolve_tree_construct_range(&trRange, &dr);
     
            vector vx;
            dr.GetData(DRR_GET_DEPENDENT, 0, NULL, NULL, NULL, &vx);
     
            double from, to;
            vx.GetMinMax(from, to);
     
            trGetN.xfrom.dVal = from;
            trGetN.xto.dVal = to;
    }
    
  9. Xファンクションビルダを開き、2ページ目のwizPage2 Xファンクションを作成します。Xファンクション名と変数を以下の図のように設定して保存します。
    OCguide xf wizard page2 vars.png
  10. コードビルダでwizPage2.OXFファイルを開き、現在のワークスペースに追加して以下のヘッダファイルを入力します。
    //put additional include files here
    #include <..\Originlab\wizDlg.h>
    #include <..\Originlab\grobj_utils.h>
            
    
  11. メイン関数wizPage2を探し、次のコードを入力します。このコードはページ1で指定したxfrom と xto の値を元に長方形を入力する際に使用します。
    WizDlgCore* pWizCore = 
            (WizDlgCore*)get_xf_core_handler(NODE_NAME_XF_WIZ_CORE_POINTER);
    ASSERT(pWizCore);
     
    // ページ1で指定したx from/to の値を入手
    double xfrom, xto;
    pWizCore->GetXRange(xfrom, xto);
     
    // 入力範囲を入手
    XFWizNavigation* pXFWizNavg = 
            (XFWizNavigation*)(pWizCore->GetXFWizNavigation());
    WizDlgInputOutputRange* pwizInputOutputRange = 
            (WizDlgInputOutputRange*)(pXFWizNavg->GetXFWizInputOutputRange());
     
    // ページ1から入力範囲を入手
    Array<DataRange&> arrdr;
    if( pwizInputOutputRange->Get(&arrdr, STR_XFNAME_PAGE_1, true) ) 
    {
            DataRange& dr = arrdr.GetAt(0);
     
            vector<uint> vUIDs;
            DataPlot dp;
            if( dr.GetPlots(vUIDs) > 0 )
            {
                    // 入力範囲から元のグラフのレイヤを入手
                    dp = (DataPlot)Project.GetObject(vUIDs[0]);
                    GraphLayer gl;
                    dp.GetParent(gl);
     
                    // 長方形をグラフに追加
                    GraphObject go;
                    add_rect(gl, go, xfrom, 0, xto, 0, color, 2, LN_VERTICAL, 
                            true, false);
            }
    }
    

Xファンクションを使用する

サンプルのをざーどを実行する前に、新しいワークシートの2列にデータを入力して折れ線グラフをこの2列のデータで作図します。

ウィザードダイアログの実行

  1. グラフウィンドウをアクティブのまま、次の操作を行います。コマンドウィンドウで「wizDlg」を実行します。
  2. ダイアログが開き、xfromとxtoの値をコントロール上で変更します。進むボタンをクリックします。
  3. 次のページで塗り色を青に変更します。
  4. テーマボタンOcguide dialog theme.pngをクリック、名前を付けて保存を選び、名前にtheme1と入力し、OKをクリックします。
  5. 「完了」ボタンをクリックします。ウィザードダイアログが閉じ、青い長方形が元のグラフに追加されます。

ダイアログなしのスクリプトモードで実行

グラフウィンドウをアクティブのまま、次の操作を行います。コマンドウィンドウで「wizDlg s:=1 t:=theme1」を実行します。ダイアログが開かずに、指定したテーマファイルの設定に従って矩形がアクティブグラフに追加されます。