Sample Code for SD DataGrid
These examples from the SD DataGrid Trial Version show how easy it is to use SD DataGrid in your application.
BCX sample.
Screen Shot.
PureBasic ODBC sample.
Screen Shot.
Liberty BASIC ODBC sample.
Screen Shot.
C/C++ Sample
The following code compiles with
- MinGW-3.1.0-1 as C or C++.
- Pelles C.
- LccWin32
- Dev-C++
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <stdio.h>
#include "SdDataGrid.h"
#define ID_MENU 2001
#define ID_EXIT 6001
#define ID_EDIT 1
#define ID_UNDOFIELD 6002
#define ID_UNDOROW 6003
#define ID_UNDELETEROW 6004
#define ID_GRID 901
HINSTANCE AppInst;
HINSTANCE hLibGrid;
HWND Form1;
HWND hGrid;
INT retval;
CHAR ClassName[20];
COL_INFO CI; // must have global scope.
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT HandleGridMsg(UINT);
VOID HandleMenu(WPARAM, LPARAM);
VOID LoadGridData(HWND);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR CmdLine,int CmdShow)
{
WNDCLASS Wc;
MSG Msg;
strcpy(ClassName,"SDDGtest");
AppInst = hInst;
Wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
Wc.lpfnWndProc = WndProc;
Wc.cbClsExtra = 0;
Wc.cbWndExtra = 0;
Wc.hInstance = hInst;
Wc.hIcon = NULL;
Wc.hCursor = LoadCursor(NULL,IDC_ARROW);
Wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
Wc.lpszMenuName = MAKEINTRESOURCE(ID_MENU);
Wc.lpszClassName = ClassName;
RegisterClass(&Wc);
Form1 = CreateWindowEx(0,ClassName,"SD DataGrid Demo",WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
20,20,600,400,NULL,(HMENU)NULL,AppInst,NULL);
ShowWindow(Form1,SW_SHOW);
if(hGrid) LoadGridData(hGrid);
while(GetMessage(&Msg,NULL,0,0))
{
HWND hActiveWindow = GetActiveWindow();
if(!IsWindow(hActiveWindow) || !IsDialogMessage(hActiveWindow,&Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
INT LwP;
RECT rc;
if(Msg >= ROW_BEFORE_NAVIGATE && Msg <= COMBO_FILL)
{
return HandleGridMsg(Msg);
}
switch(Msg)
{
case WM_CREATE:
{
hLibGrid = LoadLibrary("sd_datagrid_demo.dll");
if(hLibGrid)
{
if(C_initGridfuncs(hLibGrid))
{
GetClientRect(Form1,&rc);
hGrid = CreateGrid(hWnd,AppInst,GRIDSTYLE_SUNKEN,ID_GRID,0,0,rc.right,rc.bottom);
}
}
break;
}
case WM_INITMENUPOPUP:
{
HandleMenu(wParam,lParam);
break;
}
case WM_COMMAND:
{
if(!HIWORD(wParam))
{
LwP = LOWORD(wParam);
if(LwP == ID_EXIT)
{
PostMessage(hWnd,WM_CLOSE,0,0);
}
if(LwP == ID_UNDOFIELD)
{
UndoField(hGrid);
}
if(LwP == ID_UNDOROW)
{
UndoRow(hGrid);
}
if(LwP == ID_UNDELETEROW)
{
UndeleteRow(hGrid);
}
}
break;
}
case WM_SIZE:
{
GetClientRect(Form1,&rc);
MoveWindow(hGrid,0,0,rc.right,rc.bottom,FALSE);
break;
}
case WM_CLOSE:
{
if(hGrid)
{
FreeGrid(hGrid);
DestroyWindow(hGrid);
}
if(hLibGrid) FreeLibrary(hLibGrid);
break;
}
case WM_DESTROY:
{
UnregisterClass(ClassName,AppInst);
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
VOID LoadGridData(HWND hg)
{
//Creates 100 rows x 15 columns and fills the grid with imaginary data.
//This is the slowest way to load data.
INT iRow=0;
INT iColumn;
COLORREF x;
CHAR tmp[51];
CHAR tmp2[51];
CHAR fooData[20];
iRow = DimCols(hg,15);
if(iRow != 1) return;
SetRowHeight(hGrid,35);
CI.FldSize = 50;
CI.DataType = SD_CHAR; //fields are strings.
CI.Precision = 0;
x = RGB(244, 240, 228);
for(iColumn = 1; iColumn <= 15; iColumn++)
{
// set alternating display properties for example.
if(CI.ColBackClr == x)
{
CI.ColWidth = 130;
CI.ColBackClr = RGB(250, 250, 238);
CI.ColForeClr = RGB(250, 150, 150);
CI.Alignment = HDF_RIGHT;
CI.MultiLine = FALSE;
CI.FontName = "Times New Roman";
CI.PointSize = 10;
CI.Bold = FW_BOLD;
CI.Italic = 1;
CI.Underline = 1;
}
else
{
CI.ColWidth = 70;
CI.ColBackClr = x;
CI.ColForeClr = 0;
CI.Alignment = HDF_CENTER;
CI.MultiLine = TRUE;
CI.FontName = "Arial";
CI.PointSize = 8;
CI.Bold = 0;
CI.Italic = 0;
CI.Underline = 0;
}
// create some column labels.
sprintf(tmp,"%d",iColumn);
sprintf(tmp2,"%s%s","Column ",tmp);
CI.ColName = (CHAR*)tmp2;
// define the field.
DefineField(hg,iColumn,FIELD_EDITBOX, &CI);
}
// create some data.
for(iRow = 1; iRow <= 100; iRow++)
{
sprintf(tmp,"%d",iRow);
for(iColumn = 1; iColumn <= 15; iColumn++)
{
sprintf(tmp2,"%d",iColumn);
sprintf(fooData,"%s%s%s%s","Row ",tmp," Column ",tmp2);
// create the cell with the data.
CreateCell(hg,iRow,iColumn,fooData);
}
}
SetUndoBuffer(hg);
return;
}
LRESULT HandleGridMsg(UINT Msg)
{
LRESULT ret = 0;
switch(Msg)
{
case ROW_BEFORE_NAVIGATE:
{
//returns: 0 = continue, 1 = cancel row navigation
MessageBox(Form1,"ROW_BEFORE_NAVIGATE","Message",0);
break;
}
case ROW_BEFORE_DELETE:
{
//returns: 0 = continue, 1 = cancel
MessageBox(Form1,"ROW_BEFORE_DELETE","Message",0);
break;
}
case ROW_DELETED:
{
//returns: None
MessageBox(Form1,"ROW_DELETED","Message",0);
break;
}
case ROW_UNDELETED:
{
//returns: None
MessageBox(Form1,"ROW_UNDELETED","Message",0);
break;
}
case CELL_BEFORE_UPDATE:
{
//returns: 0 = continue, 1 = cancel
MessageBox(Form1,"CELL_BEFORE_UPDATE","Message",0);
break;
}
case CELL_AFTER_UPDATE:
{
//returns: None
MessageBox(Form1,"CELL_AFTER_UPDATE","Message",0);
break;
}
case ROW_BEFORE_SELECT:
{
//returns: 0 = continue, 1 = cancel
MessageBox(Form1,"ROW_BEFORE_SELECT","Message",0);
break;
}
case GRID_RIGHT_CLICK:
{
//returns: None
MessageBox(Form1,"GRID_RIGHT_CLICK","Message",0);
break;
}
case COMBO_FILL:
{
//returns: None
MessageBox(Form1,"COMBO_FILL","Message",0);
break;
}
}
return ret;
}
VOID HandleMenu(WPARAM wParam, LPARAM lParam)
{
HMENU hMnuEdit = GetSubMenu(GetMenu(Form1),ID_EDIT);
if((HMENU)wParam == hMnuEdit)
{
EnableMenuItem(hMnuEdit,ID_UNDOFIELD,!CanUndoField(hGrid));
EnableMenuItem(hMnuEdit,ID_UNDOROW,!CanUndoRow(hGrid));
EnableMenuItem(hMnuEdit,ID_UNDELETEROW,!CanUndeleteRow(hGrid));
}
return;
}
BCX Sample
GUI "SDDGtest", PIXELS
#include "SdDataGrid.h"
CONST ID_MENU = 2001
CONST ID_EXIT = 6001
CONST ID_EDIT = 1
CONST ID_UNDOFIELD = 6002
CONST ID_UNDOROW = 6003
CONST ID_UNDELETEROW = 6004
CONST ID_GRID = 901
DIM CI AS COL_INFO
DIM retval AS INT
DIM AppInst AS HINSTANCE
DIM hLibGrid AS HINSTANCE
DIM Form1 AS HWND
DIM hGrid AS HWND
GLOBAL MainMenu AS HMENU
GLOBAL FileMenu AS HMENU
GLOBAL EditMenu AS HMENU
SUB FORMLOAD
Form1 = BCX_FORM ("SD DataGrid Demo", 0, 0, 600, 400, WS_OVERLAPPEDWINDOW OR WS_CLIPCHILDREN)
MainMenu = CreateMenu()
FileMenu = CreateMenu()
EditMenu = CreateMenu()
InsertMenu(MainMenu, 0, MF_POPUP, FileMenu, "&File")
AppendMenu(FileMenu, MF_STRING, ID_EXIT, "E&xit")
InsertMenu(MainMenu, 1, MF_POPUP, EditMenu, "&Edit")
AppendMenu(EditMenu, MF_STRING, ID_UNDOFIELD, "Undo &Field")
AppendMenu(EditMenu, MF_STRING, ID_UNDOROW, "Undo &Row")
AppendMenu(EditMenu, MF_STRING, ID_UNDELETEROW, "&Undelete Row")
SetMenu (Form1, MainMenu)
CENTER (Form1)
SHOW (Form1)
CALL LoadGridData(hGrid)
END SUB
BEGIN EVENTS
DIM rc AS RECT
IF(Msg >= ROW_BEFORE_NAVIGATE AND Msg <= COMBO_FILL) THEN
FUNCTION = HandleGridMsg(Msg)
END IF
SELECT CASE CBMSG
CASE WM_CREATE
AppInst = BCX_HINSTANCE
hLibGrid = LoadLibrary("sd_datagrid_demo.dll")
IF hLibGrid THEN
IF C_initGridfuncs(hLibGrid) THEN
GetClientRect(Form1,&rc)
hGrid = CreateGrid(CBHNDL,AppInst,GRIDSTYLE_SUNKEN,ID_GRID,0,0,rc.right,rc.bottom)
END IF
END IF
CASE WM_COMMAND
IF |