3.2.2 List All Columns of Workbook in Grid Dialog


Version Info

Minimum Origin Version Required: Origin 2022

Summary

In this tutorial we show

  1. how to build a grid dialog
  2. how to get all columns in a workbook
  3. how to list columns attributes in grid
  4. 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:
  1. Origin Class QueryResult is used to search origin object in project. To learn how to query, read this page.
  2. 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.
  3. 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().
  4. X-Function plotxy is used to plot with the selected column.

To Launch The Dialog

  1. Add mytest.c to workspace and build
  2. Run function list_current_book_col
  3. The dialog should be:
    LIST COL IN GRID.png
  4. Select a row and click OK, the dialog will close and it will make a plot with corresponding column of the selected row