List All Columns of Workbook in Grid Dialog
Version Info
Minimum Origin Version Required: Origin 2022
Summary
In this tutorial we show
- how to build a grid dialog
- how to get all columns in a workbook
- how to list columns attributes in grid
- how to use the selected column in grid to make a plot
Make a Simple Grid Dialog
In this section, we show how to make SimpleGridDlg.h and SimpleGridDlg.cpp these two files to create a simple grid dialog.
SimpleGridDlg.h
Open Code Builder, create SimpleGridDlg.h. You can set Location to User File Folder.
#ifndef SIMPLE_GRID_DLG_H
#define SIMPLE_GRID_DLG_H
class SimpleGridDlg : public ResizeDialog
{
public:
SimpleGridDlg(string strColHeaders, vector<string> vstrContent, bool bByRow, string strDLG);
~SimpleGridDlg();
int DoModalEx(HWND hWndParent = NULL);
int GetSelAfterOK(vector<string>& vsSel);
protected:
EVENTS_BEGIN
ON_INIT(OnInitDialog)
ON_READY(OnReady)
ON_SIZE(OnDlgResize)
ON_GETMINMAXINFO(OnMinMaxInfo)
ON_OK(OnOK)
EVENTS_END
BOOL OnInitDialog();
BOOL OnReady();
BOOL OnDlgResize(int nType, int cx, int cy);
BOOL OnOK();
private:
string m_strDlgName;
string m_strColHeaders;
vector<string> m_vstrContent;
bool m_bByRow;
GridListControl m_list;
};
#endif //SIMPLE_GRID_DLG_H
SimpleGridDlg.cpp
In Code Builder, create SimpleGridDlg.cpp. This file should be in the same folder as SimpleGridDlg.h.
#include <Origin.h>
#pragma labtalk(0)
#include <..\OriginLab\DialogEx.h>
#include "SimpleGridDlg.h"
#define STR_ODLG8_DLL GetAppPath(TRUE)+"\\OriginC\\OriginLab\\ODlg8.dll"
SimpleGridDlg::SimpleGridDlg(string strColHeaders, vector<string> vstrContent, bool bByRow, string strDLG) : ResizeDialog(IDD_GRIDLIST_DLG, STR_ODLG8_DLL)
{
m_strDlgName = strDLG;
m_strColHeaders = strColHeaders;
m_vstrContent = vstrContent;
m_bByRow = bByRow;
}
SimpleGridDlg::~SimpleGridDlg()
{
}
int SimpleGridDlg::DoModalEx(HWND hWndParent/* = NULL*/)
{
InitMsgMap();
int nRet = ResizeDialog::DoModal(hWndParent);
return nRet;
}
int SimpleGridDlg::GetSelAfterOK(vector<string>& vsSel)
{
vsSel = m_vstrContent;
return vsSel.GetSize();
}
BOOL SimpleGridDlg::OnInitDialog()
{
ResizeDialog::OnInitDialog(IDC_LIST, m_strDlgName);
Text = m_strDlgName;
m_list.Init(IDC_LIST, *this);
m_list.SetEditable();
m_list.SetColHeader(m_strColHeaders);
int nRow = m_vstrContent.GetSize()/m_list.GetNumCols();
m_list.SetRows(nRow);
m_list.SetTableValue(m_vstrContent, m_bByRow);
m_list.ResizeCols();
return true;
}
BOOL SimpleGridDlg::OnReady()
{
SetInitReady(true);
return true;
}
BOOL SimpleGridDlg::OnDlgResize(int nType, int cx, int cy)
{
if(!IsInitReady())
return true;
MoveControlsHelper _temp(this);
int nGap = GetControlGap();
RECT rrOK;
Button btnOK = GetItem(IDOK);
GetControlClientRect(IDOK, rrOK);
int nButtonHeight = RECT_HEIGHT(rrOK);
int nButtonWidth = RECT_WIDTH(rrOK);
RECT rList;
rList.left = nGap;
rList.top = nGap;
rList.right = cx - nGap;
rList.bottom = cy - 2 * nGap - nButtonHeight;
Control ctrlList = GetItem(IDC_LIST);
MoveControl(ctrlList, rList);
RECT rrCancel;
rrCancel.right = cx - nGap;
rrCancel.left = rrCancel.right - nButtonWidth;
rrCancel.bottom = cy - nGap;
rrCancel.top = rrCancel.bottom - nButtonHeight;
MoveControl(GetItem(IDCANCEL), rrCancel);
rrOK = rrCancel;
rrOK.right = rrCancel.left - nGap;
rrOK.left = rrOK.right - nButtonWidth;
MoveControl(GetItem(IDOK), rrOK);
return true;
}
BOOL SimpleGridDlg::OnOK()
{
return m_list.GetRowValues(m_list.GetSelectedRow(), m_vstrContent) == true;
}
bool open_simple_grid_dlg(string strColHeaders, vector<string>& vstrContent, bool bByRow, string strDLG)
{
SimpleGridDlg mydlg(strColHeaders, vstrContent, bByRow, strDLG);
if(mydlg.DoModalEx() == IDOK)
{
int nRet = mydlg.GetSelAfterOK(vstrContent);
return nRet > 0;
}
return false;
}
Note: This dialog use the built-in Resource DLL ODlg8.dll. You can also use another Resource DLL. To learn more: read here. |
Find All Columns in Workbook and Show in Grid
In this section we show how to get all columns in a workbook and display these columns' attributes in grid.
mytest.c
In Code Builder, create mytest.c. This file should be in the same folder as SimpleGridDlg.h and SimpleGridDlg.cpp.
#include <Origin.h>
#include <xfutils.h>
typedef bool (*PFN_SIMPLE_GRID_DLG)(string strColHeaders, vector<string>& vstrContent, bool bByRow, string strDLG);
#define _GET_COL_INFO(_TYPE, _ISNAME, _ROW) \
{ \
vector<string> vsInfo; \
if(_ISNAME) \
qr.GetNames(vsInfo, _TYPE); \
else \
qr.GetColInfo(vsInfo, _TYPE, _ROW); \
vstrContent.Append(vsInfo); \
}
void list_current_book_col()
{
WorksheetPage wp = Project.Pages();
if(!wp)
return;
bool bByRow = false;
string strDLG = "Select a Column in " + wp.GetName();
string strHeaders = "Sheet|Col|Type|LName|Value|U1|U2|Range";//range string will be used to construct the column
vector<string> vstrContent;
string strQuery;
strQuery.Format("Select Column from %s", wp.GetName());
QueryResult qr;
int nFound = qr.Build(strQuery);
//follow the order in strHeaders to get the column attributes
_GET_COL_INFO(QUERYRESULTNAME_SHEET, true, 0)
_GET_COL_INFO(QUERYRESULTNAME_SNAME, true, 0)
_GET_COL_INFO(QUERYRESULTCOL_TYPE, false, 0)
_GET_COL_INFO(QUERYRESULTNAME_LNAME, true, 0)
_GET_COL_INFO(QUERYRESULTCOL_VALUE, false, 0)
_GET_COL_INFO(QUERYRESULTCOL_UDL, false, 0)
_GET_COL_INFO(QUERYRESULTCOL_UDL, false, 1)
_GET_COL_INFO(QUERYRESULTNAME_RANGE, true, 0)
//this file should be in the same folder with SimpleGridDlg.cpp/h
string strFile = GetFilePath(__FILE__) + "SimpleGridDlg.cpp";
PFN_SIMPLE_GRID_DLG pfn = Project.FindFunction("open_simple_grid_dlg", strFile, true);
//display vstrContent in a simple grid dialog
if( pfn && pfn(strHeaders, vstrContent, bByRow, strDLG) )
{
Column col;
int nRangeCol = 7;
if(vstrContent.GetSize() > nRangeCol)
okxf_resolve_string_get_origin_object(vstrContent[nRangeCol], &col);
if(col)
{
string strCol;
col.GetRangeString(strCol);
printf("Column: %s\n", strCol);
//use the seleced column to make xy plot
string strLT;
strLT.Format("plotxy iy:=%s", strCol);
LT_execute(strLT);
return;
}
}
out_str("error or no column selected");
}
Note:
- Origin Class QueryResult is used to search origin object in project. To learn how to query, read this page.
- Function QueryResult::GetNames() and QueryResult::GetColInfo() are used to get different properties of the found objects. These properties are stored in column order in string array vstrContent, so the value of variable bByRow is false.
- Function open_simple_grid_dlg is used to receive the column names and content to show in the grid dialog. This function is in SimpleGridDlg.cpp. It's called by Project::FindFunction().
- X-Function plotxy is used to plot with the selected column.
|
To Launch The Dialog
- Add mytest.c to workspace and build
- Run function list_current_book_col
- The dialog should be:
- Select a row and click OK, the dialog will close and it will make a plot with corresponding column of the selected row
|