'---------------- ' Blood_Sugar.iwb '---------------- AUTODEFINE "off" $INCLUDE "windowssdk.inc" $INCLUDE "commctrl.inc" $INCLUDE "ctl.inc" BITMAP bm DOCINFO di SYSTEMTIME st FILETIME ft PRINTDLG pd LVCOLUMN lvFormat ENUM RGB_Colors AliceBlue = 0xFFF8F0 AntiqueWhite = 0xD7EBFA Aquamarine = 0xD4FF7F ArmyGreen = 0x669966 AutumnOrange = 0x3366FF AvocadoGreen = 0x339966 Azure = 0xFFFFF0 BabyBlue = 0xFF9966 BananaYellow = 0x33CCCC Beige = 0xDCF5F5 Bisque = 0xC4E4FF Black = 0x000000 BlanchedAlmond = 0xCDEBFF Blue = 0xFF0000 BlueViolet = 0xE22B8A Brown = 0x2A2AA5 BurlyWood = 0x87B8DE CadetBlue = 0xA09E5F Chalk = 0x99FFFF Chartreuse = 0x00FF7F Chocolate = 0x1E69D2 Coral = 0x507FFF CornflowerBlue = 0xED9564 Cornsilk = 0xDCF8FF Crimson = 0x3C14DC Cyan = 0xFFFF00 DarkBlue = 0x8B0000 DarkBrown = 0x333366 DarkCrimson = 0x663399 DarkCyan = 0x8B8B00 DarkGold = 0x3399CC DarkGoldenrod = 0x0B86B8 DarkGray = 0xA9A9A9 DarkGreen = 0x006400 DarkKhaki = 0x6BB7BD DarkMagenta = 0x8B008B DarkOliveGreen = 0x2F6B55 DarkOrange = 0x008CFF DarkOrchid = 0xCC3299 DarkRed = 0x00008B DarkSalmon = 0x7A96E9 DarkSeaGreen = 0x8BBC8F DarkSlateBlue = 0x8B3D48 DarkSlateGray = 0x4F4F2F DarkTurquoise = 0xD1CE00 DarkViolet = 0xD30094 DeepAzure = 0xFF3366 DeepPink = 0x9314FF DeepPurple = 0x660033 DeepRiver = 0xCC0066 DeepRose = 0x9933CC DeepSkyBlue = 0xFFBF00 DeepYellow = 0x00CCFF DesertBlue = 0x996633 DimGray = 0x696969 DodgerBlue = 0xFF901E DullGreen = 0x66CC99 EasterPurple = 0xFF99CC FadeGreen = 0x99CC99 Firebrick = 0x2222B2 FloralWhite = 0xF0FAFF ForestGreen = 0x228B22 Gainsboro = 0xDCDCDC GhostGreen = 0xCCFFCC GhostWhite = 0xFFF8F8 Gold = 0x00D7FF Goldenrod = 0x20A5DA Grape = 0x993366 GrassGreen = 0x339900 Gray = 0x808080 Green = 0x008000 GreenYellow = 0x2FFFAD Honeydew = 0xF0FFF0 HotPink = 0xB469FF IndianRed = 0x5C5CCD Indigo = 0x82004B Ivory = 0xF0FFFF KentuckyGreen = 0x669933 Khaki = 0x8CE6F0 Lavender = 0xFAE6E6 LavenderBlush = 0xF5F0FF LawnGreen = 0x00FC7C LemonChiffon = 0xCDFAFF LightBlue = 0xE6D8AD LightCoral = 0x8080F0 LightCyan = 0xFFFFE0 LightGoldenrod = 0x82DDEE LightGoldenrodYellow = 0xD2FAFA LightGray = 0xD3D3D3 LightGreen = 0x90EE90 LightOrange = 0x3399FF LightPink = 0xC1B6FF LightSalmon = 0x7AA0FF LightSeaGreen = 0xAAB220 LightSkyBlue = 0xFACE87 LightSlateGray = 0x998877 LightSteelBlue = 0xDEC4B0 LightViolet = 0xFF99FF LightYellow = 0xE0FFFF Lime = 0x00FF00 LimeGreen = 0x32CD32 Linen = 0xE6F0FA Magenta = 0xFF00FF Maroon = 0x000080 MartianGreen = 0x33CC99 MediumAquamarine = 0xAACD66 MediumBlue = 0xCD0000 MediumOrchid = 0xD355BA MediumPurple = 0xDB7093 MediumSeaGreen = 0x71B33C MediumSlateBlue = 0xEE687B MediumSpringGreen = 0x9AFA00 MediumTurquoise = 0xCCD148 MediumVioletRed = 0x8515C7 MidnightBlue = 0x701919 MintCream = 0xFAFFF5 MistyRose = 0xE1E4FF Moccasin = 0xB5E4FF MoonGreen = 0x66FFCC MossGreen = 0x666633 NavajoWhite = 0xADDEFF Navy = 0x800000 OceanGreen = 0x999966 OldLace = 0xE6F5FD Olive = 0x008080 OliveDrab = 0x238E6B Orange = 0x00A5FF OrangeRed = 0x0045FF Orchid = 0xD670DA PaleGoldenrod = 0xAAE8EE PaleGreen = 0x98FB98 PaleTurquoise = 0xEEEEAF PaleVioletRed = 0x9370DB PaleYellow = 0xCCFFFF PapayaWhip = 0xD5EFFF PeachPuff = 0xB9DAFF Peru = 0x3F85CD Pink = 0xCBC0FF Plum = 0xDDA0DD PowderBlue = 0xE6E0B0 Purple = 0x800080 Red = 0x0000FF RosyBrown = 0x8F8FBC RoyalBlue = 0xE16941 SaddleBrown = 0x13458B Salmon = 0x7280FA Sand = 0x99CCFF SandyBrown = 0x60A4F4 SeaGreen = 0x578B2E SeaShell = 0xEEF5FF Sienna = 0x2D52A0 Silver = 0xC0C0C0 SkyBlue = 0xEBCE87 SlateBlue = 0xCD5A6A SlateGray = 0x908070 Snow = 0xFAFAFF SpringGreen = 0x7FFF00 SteelBlue = 0xB48246 Ttan = 0x8CB4D2 Teal = 0x808000 Thistle = 0xD8BFD8 Tomato = 0x4763FF Transparentx = 0xFEFFFF TropicalPink = 0x6666FF Turquoise = 0xD0E040 Violet = 0xEE82EE VioletRed = 0x9020D0 Walnut = 0x003366 Wheat = 0xB3DEF5 White = 0xFFFFFF WhiteSmoke = 0xF5F5F5 Yellow = 0x00FFFF YellowGreen = 0x32CD9A ENDENUM ENUM Controls main_DtPick1 = 1000 main_DtPick2 main_Static1 main_Checkbox1 main_Edit1 main_Static2 main_Edit2 main_Checkbox2 main_B_AddRecord main_B_Backup main_B_Restore main_B_Exit main_B_WeekSugar main_B_MonthSugar main_ListView main_gBox main_Image ENDENUM DEF background, backpenc, header, mainbox, dates:UINT DEF dailyline, noonlineup, noontext, bloodsugarline:UINT DEF bloodsugarvalueline, datetimevalues:UINT DEF lvi:INT ' DB fields DEF pDB:POINTER DEF sDB[512]:ISTRING DEF errorcode:STRING DEF iDB:UINT DEF dbNM[32]:ISTRING dbNM = "Blood_Sugar.mdb" ' File Fields DEF myFile:FILE DEF flNM:STRING flNM = "Blood_Sugar.txt" DEF year, month, day, hour, minute:INT DEF ampm[16]:ISTRING DEF getLine,c:STRING DEF answer, cntr, i, j, l, fMax, v:INT DEF aDate[32], aTime[32], tTime[32], pDate[32]:ISTRING DEF hDate[32,80], hTime[32,80]:ISTRING DEF aSugar, aInsulin, acb, ccb:INT DEF tab[8]="\t":ISTRING DEF f[10]:STRING DEF sDate[32], sTime[32], sLancet[16]:ISTRING DEF sSugar, sInsulin:INT DEF hcntr, hSugar[725], pcntr:INT DEF oDays, oHours:INT DEF d[5]:ISTRING DEF MaxDate[32], MinDate[32]:ISTRING ' Max Date in file DEF MaxDateP1[32], MinDateM1[32]:ISTRING ' Begin and end dates DEF FsDate[32], FsTime[32]:ISTRING ' First Date and Time DEF LsDate[32], LsTime[32]:ISTRING ' Last Date and Time DEF dDate[32,31]:ISTRING DEF sugar, offset, x1, x2, y1, y2, t1, t2:INT DEF main, loading:DIALOG DEF graphw, graphm:WINDOW UINT left,top,width,height INT clipNprint aDate = DATE$("yyyy-MM-dd") year = VAL(MID$(aDate,1,4)) month = VAL(MID$(aDate,6,2)) day = VAL(MID$(aDate,9,2)) aTime = TIME$() hour = VAL(MID$(aTime,1,2)) minute = VAL(MID$(aTime,4,2)) fMax = 9 CREATEDIALOG main,0,0,726,704,0x80CA0080,0,"Blood Sugar",&handler_main DATETIMEPICKER main,"Pick a Date",15,5,150,26,@BORDER|@DTS_SHOWNONE,0,main_DtPick1 DATETIMEPICKER main,"Pick a Time",326,5,150,26,@BORDER|@DTS_TIMEFORMAT,0,main_DtPick2 CONTROL main,@GROUPBOX," Input Data ",495,65,214,112,0x50000007,main_gBox CONTROL main,@EDIT,"150",515,95,40,25,@CTEDITMULTI|@CTEDITRETURN|@CTEDITAUTOH,main_Edit1 CONTROL main,@STATIC,"Blood Sugar",576,97,110,25,0,main_Static1 CONTROL main,@EDIT,"0",515,135,40,25,@CTEDITMULTI|@CTEDITRETURN|@CTEDITAUTOH,main_Edit2 CONTROL main,@STATIC,"Insulin",576,138,80,25,0,main_Static2 CONTROL main,@CHECKBOX,"Changed Lancet",522,190,160,25,0,main_Checkbox2 CONTROL main,@BUTTON,"Add Record",522,234,158,25,0,main_B_AddRecord CONTROL main,@BUTTON,"Backup",522,299,158,25,0,main_B_Backup CONTROL main,@BUTTON,"Restore",522,364,158,25,0,main_B_Restore CONTROL main,@BUTTON,"Exit",522,429,158,25,0,main_B_Exit CONTROL main,@BUTTON,"Week",15,36,100,22,0,main_B_WeekSugar CONTROL main,@CHECKBOX,"Black/White Color Scheme",166,38,156,22,0,main_Checkbox1 CONTROL main,@BUTTON,"Month",374,36,100,22,0,main_B_MonthSugar CONTROL main,@LISTVIEW,"Blood Sugar",15,66,460,625,@LVSREPORT|@LVSSHOWSELALWAYS|@VSCROLL|@BORDER,main_ListView CONTROL main,@STATIC,"",538,520,128,128,@CTLSTCBITMAP,main_Image 'Static bitmap ' CONTROL main,@BUTTON,"",538,520,128,128,@CTLBTNBITMAP,main_Image 'Bitmap as button CREATEDIALOG loading,0,0,300,58,0x80C00080,0,"Blood Sugar",&loading_handler CONTROL loading,@Static,"Loading Database - please wait . . .",15,21,272,34,0x5000010B,1 SHOWDIALOG main SHOWDIALOG loading,main OpenDatabase() LoadDatabase() CloseDatabase() DestroyWindow(loading.hWnd) WindowOnTop(main.hWnd,1) WAITUNTIL IsWindowClosed(main) END '------------------- SUB BackupDatabase() '------------------- IF OPENFILE(myFile,GETSTARTPATH + flNM,"W")=0 'Backup Blood Sugar sDB="SELECT sDate, sTime, sugar, insulin, lancet FROM blood_sugar ORDER BY 1,2" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE 'Write to Backup file WHILE DBGET(iDB) DBGETDATA(iDB,1,sDate) DBGETDATA(iDB,2,sTime) DBGETDATA(iDB,3,sSugar) DBGETDATA(iDB,4,sInsulin) DBGETDATA(iDB,5,sLancet) WRITE(myFile,sDate+tab+sTime+tab+USING("0###",sSugar)+tab+USING("0##",sInsulin)+tab+sLancet) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL ENDIF CLOSEFILE myFile RETURN ENDSUB '--------------------------------------------------------------------------------------- SUB bitmapRotate90(HDC dc,HBITMAP hBMP,UINT width,UINT height,INT plane,INT pixel),HBITMAP '--------------------------------------------------------------------------------------- HDC dcsrc=CreateCompatibleDC(dc) HDC dcdst=CreateCompatibleDC(dc) HBITMAP src=SelectObject(dcsrc,hBMP) HBITMAP ret=CreateBitmap(height,width,plane,pixel,0) HBITMAP dst=SelectObject(dcdst,ret) INT x,y FOR x=0 TO width-1 FOR y=0 TO height-1 SetPixel(dcdst,y,x,_GetPixel(dcsrc,x,height -y - 1)) NEXT y NEXT x SelectObject(dcsrc,src) SelectObject(dcdst,dst) DeleteDC(dcsrc) DeleteDC(dcdst) DeleteObject(hBMP) RETURN ret ENDSUB '------------------------ SUB ClearListview(lv:INT) '------------------------ ' clear listview SENDMESSAGE main,LVM_DeleteAllItems,0,0,lv RETURN ENDSUB '------------------ SUB CloseDatabase() '------------------ IF pDB <> NULL THEN DBDISCONNECT(pDB) pDB = NULL RETURN ENDSUB /* '----------------------------------------------------------------------- SUB CopyBarToClipboard(WINDOW win,UINT left,UINT top,UINT width,UINT height) '----------------------------------------------------------------------- IF (OpenClipboard(win.hWnd)) ' create a memory bitmap HDC hdc=GetDC(0) HDC cDC=CreateCompatibleDC(hdc) HBITMAP hBM=SelectObject(cDC,CreateCompatibleBitmap(hdc,width,height)) ' copy window pixels to this bitmap HDC dc=GETHDC(win) BitBlt(cDC,0,0,width,height,dc,left,top,SRCCOPY) RELEASEHDC(win,dc) hBM=SelectObject(cDC,hBM) DeleteDC(cDC) ReleaseDC(0,hdc) ' put the bitmap into clipboard EmptyClipboard() SetClipboardData(CF_BITMAP,hBM) 'do not delete hBM after this! CloseClipboard() ENDIF ENDSUB */ '------------------------------------------------------------------------ SUB CopyToClipboard(WINDOW win,UINT left,UINT top,UINT width,UINT height) '------------------------------------------------------------------------ IF (OpenClipboard(win.hWnd)) ' create a memory bitmap HDC hdc=GetDC(0) HDC cDC=CreateCompatibleDC(hdc) HBITMAP hBM=SelectObject(cDC,CreateCompatibleBitmap(hdc,width,height)) ' copy window pixels to this bitmap HDC dc=GETHDC(win) BitBlt(cDC,0,0,width,height,dc,left,top,SRCCOPY) RELEASEHDC(win,dc) hBM=SelectObject(cDC,hBM) DeleteDC(cDC) ReleaseDC(0,hdc) ' put the bitmap into clipboard EmptyClipboard() SetClipboardData(CF_BITMAP,hBM) 'do not delete hBM after this! CloseClipboard() IF clipNPrint=1 THEN PrintImageDialog(win,hBM,360) 'last param: vertical margin ENDIF ENDSUB '---------------- SUB CreateTable() '---------------- DBCREATEMDB(GETSTARTPATH + dbNM) pDB = DBCONNECT("Microsoft Access Driver (*.mdb)",GETSTARTPATH + dbNM,"",main) IF pDB <> NULL 'Create Blood Sugar Table sDB = "CREATE TABLE blood_sugar (sDate char(10), sTime char(5), sugar int, insulin int, lancet char(1))" iDB = DBEXECSQL(pDB,sDB) 'Check for errors errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB = NULL ENDIF RETURN ENDSUB '-------------------------------- SUB GetPrinterDC(HWND handle),INT '-------------------------------- ZeroMemory(&pd,LEN(pd)) pd.lStructSize=LEN(pd) pd.hWndOwner=handle pd.Flags=PD_RETURNDC PrintDlg(&pd) RETURN pd.hDC ENDSUB '----------------------- SUB Handler_graphm(),INT '----------------------- SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW graphm CASE @IDCLOSEWINDOW CASE& @IDDESTROY CLOSEWINDOW graphm CASE @IDCONTROL SELECT @CONTROLID CASE 1 'Exit/Return CLOSEWINDOW graphm CASE 2 'Use IrfanView clipNprint=0 GETCLIENTSIZE graphm,left,top,width,height CopyToClipboard(graphm,left,top,width,height) SYSTEM "C:\\Program Files\\IrfanView\\i_view64.exe","/clippaste" CASE 3 'To Clipboard clipNprint=1 GETCLIENTSIZE graphm,left,top,width,height CopyToClipboard(graphm,left,top,width,height) ENDSELECT ENDSELECT RETURN 0 ENDSUB '----------------------- SUB Handler_graphw(),INT '----------------------- SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW graphw CASE @IDCLOSEWINDOW CASE& @IDDESTROY CLOSEWINDOW graphw WindowOnTop(main.hWnd,1) CASE @IDCONTROL SELECT @CONTROLID CASE 1 'Exit/Return CLOSEWINDOW graphw CASE 2 'Use IrfanView clipNprint=0 GETCLIENTSIZE graphw,left,top,width,height CopyToClipboard(graphw,left,top,width,height) SYSTEM "C:\\Program Files\\IrfanView\\i_view64.exe","/clippaste" CASE 3 'To Clipboard clipNprint=1 GETCLIENTSIZE graphw,left,top,width,height CopyToClipboard(graphw,left,top,width,height) ENDSELECT ENDSELECT RETURN 0 ENDSUB '--------------------- SUB handler_main(),INT '--------------------- SELECT @MESSAGE CASE @IDINITDIALOG ' Initiate Main Screen and load listview CENTERWINDOW main SetLV() SETCONTROLTEXT main,main_Image,GETSTARTPATH+"graph128.bmp" CASE @IDCLOSEWINDOW CASE& @IDDESTROY ' Close Main Screen CLOSEDIALOG main,@IDOK CASE @IDCONTROL SELECT @CONTROLID CASE main_Listview SELECT @NOTIFYCODE CASE @NMCLICK lvi = *@LPARAM.iItem SETFONT main,"Andale Mono",12,400,0 answer = MESSAGEBOX main," Yes - Delete&Add again,\n No - Do nothing,\n Cancel - Delete","Option",@MB_YESNOCANCEL|@MB_ICONQUESTION SELECT answer CASE @IDNO lvi = 0 CASE @IDCANCEL CONTROLCMD main,main_Listview,@LVDELETEITEM,lvi CASE @IDYES CONTROLCMD main,main_Listview,@LVDELETEITEM,lvi ENDSELECT ENDSELECT CASE main_Edit1 ' Process ENTER and TAB on Edit1 SELECT @NOTIFYCODE CASE @ENENTERKEY SETFOCUS main,main_Edit2 CASE @ENTABKEY SETFOCUS main,main_Edit2 ENDSELECT CASE main_Edit2 ' Process ENTER and TAB on Edit2 SELECT @NOTIFYCODE CASE @ENENTERKEY SETFOCUS main,main_Edit1 CASE @ENTABKEY SETFOCUS main,main_Edit1 ENDSELECT CASE main_B_AddRecord ' Add record to DB aSugar = VAL(GETCONTROLTEXT(main,main_Edit1)) aInsulin = VAL(GETCONTROLTEXT(main,main_Edit2)) OpenDatabase() IF acb = 1 THEN sLancet = "Y" ELSE sLancet = "N" sDB = "INSERT INTO blood_sugar (sDate, sTime, sugar, insulin, lancet) " sDB += "VALUES('"+aDate+"','"+aTime+"','"+STR$(aSugar)+"','"+STR$(aInsulin)+"','"+sLancet+"')" iDB = DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB = NULL SHOWDIALOG loading,main LoadDatabase() CloseDatabase() DestroyWindow(loading.hWnd) WindowOnTop(main.hWnd,1) 'SETFOCUS main CASE main_B_Backup 'Backup Data OpenDatabase() BackupDatabase() CloseDatabase() CASE main_B_Restore 'Restore Data SHOWDIALOG loading,main OpenDatabase() RestoreDatabase() CloseDatabase() DestroyWindow(loading.hWnd) WindowOnTop(main.hWnd,1) CASE main_B_Exit 'Exit CLOSEDIALOG main,@IDOK CASE main_Image 'Bitmap button INT result=MESSAGEBOX(main,"The Graphing Button was pressed!","Graphing Button",@MB_ICONINFORMATION|@MB_OKCANCEL) CASE main_B_WeekSugar ' Display Weekly Chart WindowOnTop(main.hWnd,0) Weekly() CASE main_B_MonthSugar ' Display Monthly Chart WindowOnTop(main.hWnd,0) Monthly() CASE main_DtPick1 'access the date/time set in the CONTROL IF @NOTIFYCODE = @DTN_DATETIMECHANGE IF *@LPARAM.dwFlags <> GDT_NONE day = *@LPARAM.st.wDay month = *@LPARAM.st.wMonth year = *@LPARAM.st.wYear aDate = USING("0####",year) + "-" + USING("0##",month) + "-" + USING("0##",day) ENDIF ENDIF CASE main_DtPick2 'access the date/time set in the CONTROL IF @NOTIFYCODE = @DTN_DATETIMECHANGE IF *@LPARAM.dwFlags <> GDT_NONE hour = *@LPARAM.st.wHour minute = *@LPARAM.st.wMinute aTime = USING("0##",hour) + ":" + USING("0##",minute) ENDIF ENDIF CASE main_Checkbox1 ' Swap Black to White Color Scheme on Graphs ccb = 1 - ccb IF ccb = 1 ' White Color Scheme background = White backpenc = White header = SlateBlue mainbox = Black dates = Blue dailyline = BabyBlue noonlineup = Crimson noontext = Magenta bloodsugarline = YellowGreen bloodsugarvalueline = DarkBlue datetimevalues = Peru ELSE ' Black Color Scheme background = Black backpenc = Black header = Lime mainbox = White dates = White dailyline = LightGoldenRod noonlineup = Crimson noontext = Lime bloodsugarline = Yellow bloodsugarvalueline = BabyBlue datetimevalues = Peru ENDIF CASE main_Checkbox2 ' Swap status of Checkbox acb = 1 - acb ENDSELECT ENDSELECT RETURN 0 ENDSUB '----------------- SUB LoadDatabase() '----------------- ClearListview(main_ListView) lvi = -1 'Load ListView sDB="SELECT sDate, sTime, sugar, insulin, lancet FROM blood_sugar WHERE lancet<>'T' ORDER BY 1,2" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE 'Load ListView WHILE DBGET(iDB) lvi++ DBGETDATA(iDB,1,sDate) DBGETDATA(iDB,2,sTime) DBGETDATA(iDB,3,sSugar) DBGETDATA(iDB,4,sInsulin) DBGETDATA(iDB,5,sLancet) hour = VAL(MID$(sTime,1,2)) minute = VAL(MID$(sTime,4,2)) ampm = "AM" IF hour = 0 hour = 12 ELSEIF hour > 11 ampm = "PM" hour -= 12 ENDIF IF hour = 0 THEN hour = 12 sTime = USING("##",hour) + ":" + USING("0##",minute) + " " + ampm IF sLancet = "N" THEN sLancet = "" CONTROLCMD main,main_ListView,@LVINSERTITEM,0,sDate CONTROLCMD main,main_ListView,@LVSETTEXT,0,1,sTime IF sSugar <> 0 CONTROLCMD main,main_ListView,@LVSETTEXT,0,2,USING("###",sSugar) ELSE CONTROLCMD main,main_ListView,@LVSETTEXT,0,2,"" ENDIF IF sInsulin <> 0 CONTROLCMD main,main_ListView,@LVSETTEXT,0,3,USING("##",sInsulin) ELSE CONTROLCMD main,main_ListView,@LVSETTEXT,0,3,"" ENDIF CONTROLCMD main,main_ListView,@LVSETTEXT,0,4,sLancet ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL RETURN ENDSUB '------------------------ SUB loading_handler(),INT '------------------------ SELECT @MESSAGE CASE @IDINITDIALOG CENTERWINDOW loading SETCONTROLCOLOR loading,1,White,DesertBlue CASE WM_CTLCOLORDLG RETURN CreateSolidBrush(DesertBlue) CASE @IDCLOSEWINDOW CASE& @IDDESTROY CLOSEDIALOG loading,@IDOK ENDSELECT RETURN 0 ENDSUB '---------------------------------------------- SUB MinutesSince(sDate:STRING,eDate:STRING),INT '---------------------------------------------- TYPE DateType DEF LowDW:UINT DEF HighDW:UINT ENDTYPE UNION uDT DEF qVar:UINT64 DEF dtVar:DateType ENDUNION DEF s,e,d:uDT DEF iVar,rtn:INT ' First get the system time so that all the other structure members are filled. GetSystemTime(st) 'Setup the SYSTEMTIME structure with the original date like so: st.wYear = VAL(MID$(sDate,1,4)) st.wMonth = VAL(MID$(sDate,6,2)) st.wDay = VAL(MID$(sDate,9,2)) st.wHour = VAL(MID$(sDate,11,2)) st.wMinute = VAL(MID$(sDate,14,2)) st.wSecond = 0 st.wMilliseconds = 0 ' Convert the system time to file time. rtn = SystemTimeToFileTime(st, ft) ' Move the FILETIME info into a UINT64 variable ' and add days using the Quad variable. (This is how M$ recommends doing it) s.dtVar.LowDW = ft.dwLowDateTime s.dtVar.HighDW = ft.dwHighDateTime ' First get the system time so that all the other structure members are filled. GetSystemTime(st) 'Setup the SYSTEMTIME structure with the original date like so: st.wYear = VAL(MID$(eDate,1,4)) st.wMonth = VAL(MID$(eDate,6,2)) st.wDay = VAL(MID$(eDate,9,2)) st.wHour = VAL(MID$(eDate,11,2)) st.wMinute = VAL(MID$(eDate,14,2)) st.wSecond = 0 st.wMilliseconds = 0 ' Convert the system time to file time. rtn = SystemTimeToFileTime(st, ft) ' Move the FILETIME info into a UINT64 variable ' and add days using the Quad variable. (This is how M$ recommends doing it) e.dtVar.LowDW = ft.dwLowDateTime e.dtVar.HighDW = ft.dwHighDateTime d.qVar = e.qVar - s.qVar iVar = d.qVar / (600000000q) RETURN iVar ENDSUB '------------ SUB Monthly() '------------ sDate = "" sTime = "" MaxDate = "" FsDate = "" FsTime = "" LsDate = "" LsTime = "" pDate = "" FOR i = 0 TO 4 d[i] = "" NEXT i FOR i = 0 TO 30 dDate[0,i] = "XX:XX" NEXT i FOR i = 0 TO 722 hSugar[i] = 0 NEXT i OPENWINDOW graphm,0,0,1078,680,@MINBOX,0,"Blood Sugar - Monthly",&Handler_graphm CONTROL graphm,@BUTTON,"Exit/Return",926,550,120,25,0,1 CONTROL graphm,@BUTTON,"Use IrfanView",926,580,120,25,0,2 CONTROL graphm,@BUTTON,"Clip'n'Print",926,610,120,25,0,3 SETWINDOWCOLOR graphm,background BACKPEN graphm,backpenc OpenDatabase() ' Delete temp records sDB="DELETE FROM blood_sugar WHERE lancet='T'" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Max first date sDB="SELECT MIN(sDate) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MinDate) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Max first date sDB="SELECT MAX(sDate) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MaxDate) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Max date plus 1 sDB="SELECT DATEADD('d',1,DATEVALUE('"+MaxDate+"')) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MaxDateP1) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL MaxDateP1 = MID$(MaxDateP1,1,10) ' Insert MaxDateP1 sDB="INSERT INTO blood_sugar VALUES('"+MaxDateP1+"','00:00',200,0,'T')" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Min date minus 1 sDB="SELECT DATEADD('d',-1,DATEVALUE('"+MinDate+"')) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MinDateM1) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL MinDateM1 = MID$(MinDateM1,1,10) ' Insert MinDateM1 sDB="INSERT INTO blood_sugar VALUES('"+MinDateM1+"','00:00',200,0,'T')" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB=NULL LABEL retry ' Get last record before 1st Date shown sDB="SELECT sDate, MAX(sTime) FROM blood_sugar " sDB+="WHERE DATEADD('d',-31,DATEVALUE('"+aDate+"')) = DATEVALUE(sDate) " sDB+="GROUP BY sDate" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,FsDate) DBGETDATA(iDB,2,FsTime) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL IF FsDate = "" FsDate = MinDateM1 ENDIF ' Get First record after last day sDB="SELECT sDate, MIN(sTime) FROM blood_sugar " sDB+="WHERE DATEADD('d',1,DATEVALUE('"+aDate+"')) = DATEVALUE(sDate) " sDB+="GROUP BY sDate" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,LsDate) DBGETDATA(iDB,2,LsTime) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL IF LsDate = "" aDate = MaxDate GOTO retry ENDIF SETFONT graphm,"Andale Mono",6,400 ' Select data from start to end date range sDB="SELECT sDate, sTime, sugar FROM blood_sugar " sDB+="WHERE sDate+sTime Between '"+FsDate+FsTime+"' AND '"+LsDate+LsTime+"' " sDB+="AND sugar>0 ORDER BY 1, 2" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphm,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION END ELSE ' Print data on screen FRONTPEN graphm,datetimevalues x1 = 790 i = -1 y2 = 620 pDate = FsDate cntr = -1 pcntr = 0 oDays = 1 WHILE DBGET(iDB) cntr++ DBGETDATA(iDB,1,sDate) DBGETDATA(iDB,2,sTime) DBGETDATA(iDB,3,sugar) i++ y1 = i * 10 + 20 IF y1 > y2 x1 += 90 i = 0 y1 = 20 y2 = 530 ENDIF MOVE graphm,x1,y1 PRINT graphm,MID$(sDate,6,5),"-",sTime," ",USING("0###",sugar) IF cntr = 0 hSugar[0] = sugar ELSE IF cntr = 1 FsDate = sDate pDate = sDate dDate[0,0] = sDate ENDIF IF sDate = LsDate and sTime = LsTime sTime = "00:00" ENDIF IF pDate <> sDate oDays++ pcntr++ dDate[0,pcntr] = sDate pDate = sDate ENDIF oHours = VAL(MID$(sTime,1,2)) v = ((oDays-1)*24)+oHours IF v < 721 hSugar[v] = sugar ENDIF ENDIF ENDWHILE hcntr = cntr ENDIF ' Fix first and last dates to start at midnight DBFREESQL(iDB) iDB=NULL CloseDatabase() ' Display Header info FRONTPEN graphm,header SETFONT graphm,"Arial",14,400,@SFITALIC MOVE graphm,186,4 PRINT graphm,"Blood Sugar - Monthly ",FsDate," Thru ",LsDate SETFONT graphm,"Andale Mono",10,400 MOVE graphm,790,4 PRINT graphm,"MaxDate Start Date: ", MaxDate SETFONT graphm,"Arial",10,400,0 ' Show Red line where Blood Sugar is over 400 RECT graphm,50,550-404,719,8,Red,Red ' Show Tomato line where Blood Sugar is over 300 RECT graphm,50,550-304,719,8,Tomato,Tomato ' Load dates and Noon cntr = -1 FOR i = 45 TO 766 STEP 24 cntr++ d[0] = MID$(dDate[0,cntr],6,1) d[1] = MID$(dDate[0,cntr],7,1) d[2] = MID$(dDate[0,cntr],8,1) d[3] = MID$(dDate[0,cntr],9,1) d[4] = MID$(dDate[0,cntr],10,1) FRONTPEN graphm,dates MOVE graphm,i,555 PRINT graphm,d[0] MOVE graphm,i,570 PRINT graphm,d[1] MOVE graphm,i+2,585 PRINT graphm,"/" MOVE graphm,i,600 PRINT graphm,d[3] MOVE graphm,i,615 PRINT graphm,d[4] IF cntr < 30 ' Daily line LINE graphm,i+5,30,i+5,550,dailyline ENDIF NEXT i ' Write out Blood Sugar values in 50 unit increments FOR i = 0 TO 500 STEP 50 IF i <> 0 THEN LINE graphm,50,550-i,770,550-i,bloodsugarline MOVE graphm,20,540-i PRINT graphm,USING("0###",i) NEXT i FRONTPEN graphm,bloodsugarvalueline ' First point is special FOR i = 1 TO 19 IF hSugar[i] > 0 LINE graphm,50,550 - hSugar[0],i + 50,550 - hSugar[i] j = i BREAKFOR ENDIF NEXT i FOR i = j TO 720 IF hSugar[i] > 0 THEN LINETO graphm,i + 50,550 - hSugar[i] NEXT i ' Write main box FRONTPEN graphm,mainbox RECT graphm,50,30,720,520 RETURN ENDSUB '----------------- SUB OpenDatabase() '----------------- IF FileExists (GETSTARTPATH + dbNM) = 0 THEN CreateTable() IF pDB = NULL pDB = DBCONNECT("Microsoft Access Driver (*.mdb)",GETSTARTPATH + dbNM,"",0) ENDIF IF pDB = NULL THEN MESSAGEBOX 0,"Database not available","Problem",@MB_ICONEXCLAMATION RETURN ENDSUB '--------------------------------------------------------- SUB PrintImageDialog(WINDOW w1,HBITMAP iHandle,INT margin) '--------------------------------------------------------- GetObject(iHandle,LEN(bm),&bm) INT bmpW=bm.bmWidth INT bmpH=bm.bmHeight ZeroMemory(&di,LEN(di)) di.cbSize=LEN(di) di.lpszDocName="Printing Picture..." HDC prn=GetPrinterDC(w1.hWnd) INT cyPage=GetDeviceCaps(prn,VERTRES)-2 * margin INT cxPage=(bmpH*cyPage)/(bmpW*1.0) INT dif=(GetDeviceCaps(prn,HORZRES)-cxPage)/2.0 INT hdcMem=CreateCompatibleDC(prn) iHandle=bitmapRotate90(prn,iHandle,bmpW,bmpH,bm.bmPlanes,bm.bmBitsPixel) HBITMAP hBMOld=SelectObject(hdcMem,iHandle) StartDoc(prn,&di) StartPage(prn) SetMapMode(prn,MM_ISOTROPIC) SetWindowExtEx(prn,cxPage,cyPage,NULL) SetViewportExtEx(prn,cxPage,cyPage,NULL) SetViewportOrgEx(prn,0,0,NULL) StretchBlt(prn,dif,margin,cxPage,cyPage,hdcMem,0,0,bmpH,bmpW,SRCCOPY) _EndPage(prn) EndDoc(prn) DeleteDC(prn) SelectObject(hdcMem,hBMOld) DeleteDC(hdcMem) ENDSUB '-------------------- SUB RestoreDatabase() '-------------------- ClearListview(main_ListView) lvi = -1 sDB = "DELETE FROM blood_sugar WHERE 1=1" iDB = DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB = NULL IF OPENFILE(myFile,GETSTARTPATH + flNM,"R")=0 ' Process data WHILE (READ(myFile,getLine)=0) j = 0 f[0] = "" l = LEN(getLine) FOR i = 1 TO l c = MID$(getLine,i,1) IF c = tab j++ f[j] = "" IF j > fMax MESSAGEBOX main,"("+STR$(__LINE__)+") "+USING("###",j)+" > "+USING("###",fMax),"Too Many tabs",@MB_ICONEXCLAMATION j = fMax ENDIF ELSE f[j] += c ENDIF NEXT i hour = VAL(MID$(f[1],1,2)) minute = VAL(MID$(f[1],4,2)) ampm = "AM" IF hour = 0 hour = 12 ELSEIF hour > 11 ampm = "PM" hour -= 12 ENDIF IF hour = 0 THEN hour = 12 tTime = USING("##",hour) + ":" + USING("0##",minute) + " " + ampm sDB = "INSERT INTO blood_sugar (sDate, sTime, sugar, insulin, lancet) " sDB += "VALUES('"+f[0]+"','"+f[1]+"','"+f[2]+"','"+f[3]+"','"+f[4]+"')" iDB = DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX main,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB = NULL IF val(f[2]) = 0 THEN f[2] = "" IF val(f[3]) = 0 THEN f[3] = "" IF f[4] = "N" THEN f[4] = "" CONTROLCMD main,main_ListView,@LVINSERTITEM,0,f[0] CONTROLCMD main,main_ListView,@LVSETTEXT,0,1,tTime CONTROLCMD main,main_ListView,@LVSETTEXT,0,2,f[2] CONTROLCMD main,main_ListView,@LVSETTEXT,0,3,f[3] CONTROLCMD main,main_ListView,@LVSETTEXT,0,4,f[4] ENDWHILE ELSE MESSAGEBOX main,"Could not open file: "+flNM,"Problem",@MB_ICONEXCLAMATION ENDIF RETURN ENDSUB '---------- SUB SetLV() '---------- SETFONT main,"Courier New",12,400,0,main_DtPick1 SETCONTROLCOLOR main,main_DtPick1,White,Black SETFONT main,"Courier New",12,400,0,main_DtPick2 SETCONTROLCOLOR main,main_DtPick2,White,Black SETFONT main,"Courier New",12,400,0,main_Static1 SETCONTROLCOLOR main,main_Static1,Red,GetSysColor(15) SETFONT main,"Courier New",12,400,0,main_Edit1 SETCONTROLCOLOR main,main_Edit1,Red,White SETFONT main,"Courier New",12,400,0,main_Static2 SETCONTROLCOLOR main,main_Static2,DarkBlue,GetSysColor(15) SETFONT main,"Courier New",12,400,0,main_Edit2 SETCONTROLCOLOR main,main_Edit2,DarkBlue,White SETCONTROLCOLOR main,main_Checkbox1,White,Black SETFONT main,"Courier New",12,400,0,main_Checkbox2 SETCONTROLCOLOR main,main_Checkbox2,VioletRed,GetSysColor(15) SETFONT main,"Arial",12,700,0,main_B_AddRecord SETCONTROLCOLOR main,main_B_AddRecord,White,Green SETFONT main,"Arial",12,700,0,main_B_Backup SETCONTROLCOLOR main,main_B_Backup,White,Black SETFONT main,"Arial",12,700,0,main_B_Restore SETCONTROLCOLOR main,main_B_Restore,White,CadetBlue SETFONT main,"Arial",12,700,0,main_B_Exit SETCONTROLCOLOR main,main_B_Exit,White,VioletRed SETFONT main,"Arial",12,700,0,main_B_WeekSugar SETCONTROLCOLOR main,main_B_WeekSugar,White,MediumOrchid SETFONT main,"Arial",12,700,0,main_B_MonthSugar SETCONTROLCOLOR main,main_B_MonthSugar,White,MediumVioletRed SETFONT main,"Courier New",14,400,0,main_ListView SETCONTROLCOLOR main,main_ListView,White,Black SETCONTROLCOLOR main,main_gBox,DarkBlue,GetSysColor(15) CONTROLCMD main,main_ListView,@LVINSERTCOLUMN,0,"Date" CONTROLCMD main,main_ListView,@LVINSERTCOLUMN,1,"Time" CONTROLCMD main,main_ListView,@LVINSERTCOLUMN,2,"BS#" CONTROLCMD main,main_ListView,@LVINSERTCOLUMN,3,"Insul" CONTROLCMD main,main_ListView,@LVINSERTCOLUMN,4,"Lanc" 'change some of the listview extended styles SENDMESSAGE main,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT,main_ListView 'set column width CONTROLCMD main,main_ListView,@LVSETCOLWIDTH,0,130 CONTROLCMD main,main_ListView,@LVSETCOLWIDTH,1,110 CONTROLCMD main,main_ListView,@LVSETCOLWIDTH,2,59 CONTROLCMD main,main_ListView,@LVSETCOLWIDTH,3,70 CONTROLCMD main,main_ListView,@LVSETCOLWIDTH,4,70 'Set text foreground colour */ SENDMESSAGE main.hWnd,0x1024,0,Black,main_ListView 'Set text background colour */ SENDMESSAGE main.hWnd,0x1026,0,RGB(144,232,255),main_ListView 'Set background colour */ SENDMESSAGE main.hWnd,0x1001,0,RGB(144,232,255),main_ListView 'Change column text alignments lvFormat.mask = LVCF_FMT lvFormat.fmt = LVCFMT_CENTER SENDMESSAGE(main,LVM_SETCOLUMN,0,lvFormat,main_ListView) SENDMESSAGE(main,LVM_SETCOLUMN,1,lvFormat,main_ListView) lvFormat.fmt = LVCFMT_RIGHT SENDMESSAGE(main,LVM_SETCOLUMN,2,lvFormat,main_ListView) lvFormat.fmt = LVCFMT_CENTER SENDMESSAGE(main,LVM_SETCOLUMN,3,lvFormat,main_ListView) SENDMESSAGE(main,LVM_SETCOLUMN,4,lvFormat,main_ListView) SETCONTROLNOTIFY(main,main_Edit1,1,1) SETCONTROLNOTIFY(main,main_Edit2,1,1) SETSTATE main,main_Checkbox1,0 ccb = 0 background = Black backpenc = Black header = Lime mainbox = White dates = White dailyline = LightGoldenRod noonlineup = Crimson noontext = Lime bloodsugarline = Yellow bloodsugarvalueline = BabyBlue datetimevalues = Peru SETSTATE main,main_Checkbox2,0 acb = 0 RETURN ENDSUB '----------- SUB Weekly() '----------- sDate = "" sTime = "" MaxDate = "" FsDate = "" FsTime = "" LsDate = "" LsTime = "" pDate = "" FOR i = 0 TO 4 d[i] = "" NEXT i FOR i = 0 TO 7 dDate[0,i] = "" NEXT i FOR i = 0 TO 79 hDate[0,i] = "" hTime[0,i] = "" hSugar[i] = 0 NEXT i OPENWINDOW graphw,0,0,1078,680,@MINBOX,0,"Blood Sugar - Weekly",&Handler_graphw CONTROL graphw,@BUTTON,"Exit/Return",926,530,120,25,0,1 CONTROL graphw,@BUTTON,"Use IrfanView",926,560,120,25,0,2 CONTROL graphw,@BUTTON,"Clip'n'Print",926,590,120,25,0,3 SETWINDOWCOLOR graphw,background BACKPEN graphw,backpenc OpenDatabase() ' Delete temp records sDB="DELETE FROM blood_sugar WHERE lancet='T'" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MinDate) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Min First date sDB="SELECT MIN(sDate) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MinDate) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Max Last date sDB="SELECT MAX(sDate) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MaxDate) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL IF aDate > MaxDate THEN aDate = MaxDate ' Determine Max date plus 1 sDB="SELECT DATEADD('d',1,DATEVALUE('"+MaxDate+"')) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MaxDateP1) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL MaxDateP1 = MID$(MaxDateP1,1,10) ' Insert MaxDateP1 sDB="INSERT INTO blood_sugar VALUES('"+MaxDateP1+"','00:00',200,0,'T')" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB=NULL ' Determine Min date minus 1 sDB="SELECT DATEADD('d',-1,DATEVALUE('"+MinDate+"')) FROM blood_sugar" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,MinDateM1) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL MinDateM1 = MID$(MinDateM1,1,10) ' Insert MinDateM1 sDB="INSERT INTO blood_sugar VALUES('"+MinDateM1+"','00:00',200,0,'T')" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ENDIF DBFREESQL(iDB) iDB=NULL LABEL retry ' Get last record before 1st Date shown sDB="SELECT sDate, MAX(sTime) FROM blood_sugar " sDB+="WHERE DATEADD('d',-7,DATEVALUE('"+aDate+"')) = DATEVALUE(sDate) " sDB+="GROUP BY sDate" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,FsDate) DBGETDATA(iDB,2,FsTime) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL IF FsDate = "" FsDate = MinDateM1 ENDIF ' Get First record after last day sDB="SELECT sDate, MIN(sTime) FROM blood_sugar " sDB+="WHERE DATEADD('d',8,DATEVALUE('"+FsDate+"')) = DATEVALUE(sDate) " sDB+="GROUP BY sDate" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION ELSE WHILE DBGET(iDB) DBGETDATA(iDB,1,LsDate) DBGETDATA(iDB,2,LsTime) ENDWHILE ENDIF DBFREESQL(iDB) iDB=NULL IF LsDate = "" LsDate = MaxDate aDate = MaxDate GOTO retry ENDIF ' Select data from start to end date range sDB="SELECT sDate, sTime, sugar FROM blood_sugar " sDB+="WHERE sDate+sTime Between '"+FsDate+FsTime+"' AND '"+LsDate+LsTime+"' " sDB+="AND sugar > 0 ORDER BY 1, 2" iDB=DBEXECSQL(pDB,sDB) errorcode=DBGETERRORCODE(iDB) IF LEN(errorcode) MESSAGEBOX graphw,"("+STR$(__LINE__)+") "+DBGETERRORTEXT(iDB)+"\n"+sDB,errorcode,@MB_ICONEXCLAMATION END ELSE pDate = FsDate cntr = -1 pcntr = -1 WHILE DBGET(iDB) cntr++ DBGETDATA(iDB,1,sDate) DBGETDATA(iDB,2,sTime) DBGETDATA(iDB,3,sugar) hDate[0,cntr] = sDate hTime[0,cntr] = sTime hSugar[cntr] = sugar IF pDate <> sDate pcntr++ dDate[0,pcntr] = sDate pDate = sDate ENDIF ENDWHILE hcntr = cntr ENDIF ' Fix first and last dates to start at midnight hDate[0,0] = hDate[0,1] hTime[0,0] = "00:00" hTime[0,hcntr] = "00:00" DBFREESQL(iDB) iDB=NULL CloseDatabase() ' Display Header info FRONTPEN graphw,header SETFONT graphw,"Arial",14,400,@SFITALIC MOVE graphw,166,4 PRINT graphw,"Blood Sugar - Weekly ",hDate[0,0]," Thru ",hDate[0,hcntr] SETFONT graphw,"Andale Mono",10,400 MOVE graphw,760,4 PRINT graphw,"MaxDate Start Date: ", MaxDate SETFONT graphw,"Arial",10,400,0 ' Show Red line where Blood Sugar is over 400 RECT graphw,50,550-404,672,8,Red,Red ' Show Tomato line where Blood Sugar is over 300 RECT graphw,50,550-304,672,8,Tomato,Tomato ' Load dates and Noon cntr = -1 FOR i = 45 TO 717 STEP 96 cntr++ d[0] = MID$(dDate[0,cntr],6,1) d[1] = MID$(dDate[0,cntr],7,1) d[2] = MID$(dDate[0,cntr],8,1) d[3] = MID$(dDate[0,cntr],9,1) d[4] = MID$(dDate[0,cntr],10,1) FRONTPEN graphw,dates MOVE graphw,i,555 PRINT graphw,d[0] MOVE graphw,i,570 PRINT graphw,d[1] MOVE graphw,i+2,585 PRINT graphw,"/" MOVE graphw,i,600 PRINT graphw,d[3] MOVE graphw,i,615 PRINT graphw,d[4] IF cntr < 7 ' Daily line LINE graphw,i+5,30,i+5,550,dailyline LINE graphw,i+53,30,i+53,550,noonlineup ' Short Red line above Noon LINE graphw,i+53,550,i+53,570,Red FRONTPEN graphw,noontext MOVE graphw,i+50,575 PRINT graphw,"N" MOVE graphw,i+51,590 PRINT graphw,"o" MOVE graphw,i+51,605 PRINT graphw,"o" MOVE graphw,i+51,620 PRINT graphw,"n" ENDIF NEXT i ' Write out Blood Sugar values in 50 unit increments FOR i = 0 TO 500 STEP 50 IF i <> 0 THEN LINE graphw,50,550-i,722,550-i,bloodsugarline MOVE graphw,20,540-i PRINT graphw,USING("0###",i) NEXT i ' Fix times to 15 minute intervals FOR i = 1 TO hcntr - 1 t1 = VAL(MID$(hTime[0,i],4,2)) SELECT true CASE t1 < 15 hTime[0,i] = MID$(hTime[0,i],1,3) + "00" CASE t1 < 30 hTime[0,i] = MID$(hTime[0,i],1,3) + "15" CASE t1 < 45 hTime[0,i] = MID$(hTime[0,i],1,3) + "30" CASE t1 < 60 hTime[0,i] = MID$(hTime[0,i],1,3) + "45" ENDSELECT NEXt i ' First point is special offset = MinutesSince(hDate[0,0]+hTime[0,0],hDate[0,1]+hTime[0,1]) x1 = 50 t1 = INT(offset / 15) x2 = 50 + t1 t2 = offset - (t1 * 15) SELECT true CASE t2 = 0 x2 += 0 CASE t2 = 15 x2 += 1 CASE t2 = 30 x2 += 2 CASE t2 = 45 x2 += 3 ENDSELECT y1 = 550 - hSugar[0] y2 = hSugar[1] FRONTPEN graphw,bloodsugarvalueline LINE graphw,x1,y1,x2,y2 ' Load lines to all other records FOR i = 2 TO hcntr offset = MinutesSince(hDate[0,i-1]+hTime[0,i-1],hDate[0,i]+hTime[0,i]) t1 = INT(offset / 15) x2 += t1 t2 = offset - (t1 * 15) SELECT true CASE t2 = 00 x2 += 0 CASE t2 = 15 x2 += 1 CASE t2 < 30 x2 += 2 CASE t2 < 45 x2 += 3 ENDSELECT y2 = 550 - hSugar[i] LINETO graphw,x2,y2 NEXT i ' Print data on screen FRONTPEN graphw,datetimevalues x1 = 760 FOR i = 0 TO hcntr y1 = i * 20 + 30 IF y1 > 610 x1 += 160 y1 -= 600 ENDIF MOVE graphw,x1,y1 PRINT graphw,hDate[0,i]," - ",hTime[0,i]," ",USING("0###",hSugar[i]) NEXT i ' Write main box FRONTPEN graphw,mainbox RECT graphw,50,30,673,520 RETURN ENDSUB