2.2.4.6.5 DataObject::GetInternalDataBufferGetInternalDataBuffer
Description
Get internal Data buffer of Column or MatrixObject.
Syntax
LPVOID GetInternalDataBuffer( int * pnElementSize = NULL, uint * pnNumElements = NULL )
Parameters
- pnElementSize
- [output] if it is not NULL, get the size of data type of element.
- pnNumElements
- [output] if it is not NULL, get the number of element in the object.
Return
If the data type is mixed, return NULL, otherwise return internal data buffer.
Examples
EX1
void DataObject_GetInternalDataBuffer_Ex1()
{
Worksheet wks = Project.ActiveLayer();
if(wks)
{
Column col(wks, 0); // first column
if( col )
{
int nElementSize;
uint nNum;
LPVOID pData = col.GetInternalDataBuffer(&nElementSize, &nNum);
if(NULL == pData)
out_str("return NULL if col is Text type or mixed type");
else
{
if(0 != nNum)
{
double *pTemp = (double*)pData; // cast to double since cannot direclty access the value of void type pointer point to
*pTemp = 0.5; // change the value of first item
col.ReleaseBuffer(); // after call this, first row of first column will change to 0.5
}
}
}
}
}
EX2
//This example show how to set a column to two-byte integers and get its
//pointer to assign values to
void DataObject_GetInternalDataBuffer_Ex2(int nRows = 10000)
{
Worksheet wks = Project.ActiveLayer();
if(wks)
{
Column col(wks, 0); // first column
if( col )
{
col.SetFormat(OKCOLTYPE_NUMERIC);
col.SetInternalData(FSI_SHORT);
col.SetUpperBound(nRows-1);//index of last row, 0 offset
int nElementSize;
uint nNum;
LPVOID pData = col.GetInternalDataBuffer(&nElementSize, &nNum);
printf("nElementSize = %d, Num Rows = %d\n", nElementSize, nNum);
short* psBuff = (short*)pData;
// OC loop is still slow, but you might pass this pointer to your DLL
// for much faster manipulation, here we just show that the pointer works
for(int ii = 0; ii < nRows; ii++, psBuff++)
{
*psBuff = (ii+1)*2;
}
col.ReleaseBuffer();
}
}
}
EX3
//This example will double all the cell's value of the active matrixobject
void DataObject_GetInternalDataBuffer_Ex3()
{
//assume there exists an active matrixsheet
MatrixLayer mtx = Project.ActiveLayer();
if ( !mtx )
{
printf("Can not get active matrixsheet");
return;
}
MatrixObject mo = mtx.MatrixObjects(0); //get first matrix object
int nEleSize;
uint nSize;
mo.SetFormat(OKCOLTYPE_NUMERIC);
mo.SetInternalData(FSI_SHORT);
LPVOID lpData = mo.GetInternalDataBuffer(&nEleSize, &nSize);
short* psData = (short*)lpData;
for ( int ii = 0; ii < nSize; ii++, psData++)
{
*psData = *psData * 2;
}
mo.ReleaseBuffer();
return;
}
Remark
You need to call SetUpperBound in a column before you can access the data, unless the column already has upper bound set.
See Also
DataObject::ReleaseBuffer
Header to Include
origin.h
|