* Program..: DbEditor.prg * Author...: Jeremy Suiter * Date.....: 19/03/2003 * * Last Modification : * 18/04/2003 V2.01 Michael McVicker (MMM comments). * Will now run from any directory. Double clicking of file will open it. * Browse will now update while dragging scroll tab. * 18/04/2003 V2.02 James Loughner. * Added ALT-I to insert record. * 22/04/2003 V2.02 Jeremy Suiter. * Added support for SET CHARSET and SET COLLATION to .ini file instead of default (OEM) and ASCII. * Added ability to stop same file being opened twice. Added date format to .ini file. * Added RUSHMORE, SMARTFILTER and OPTIMIZE settings to .ini file. Added file overwrite checking. * Added correct display of EOF instead of record number 1 for empty table * 22/04/2003 V2.03 James Loughner. * Added support to compile using version prior to 1.82. Added ability to compile so it acts like a * function instead of standalone application . See notes below. * 23/04/2003 V2.04 Jeremy Suiter. * Added maths functions count, sum and average. * 24/04/2003 V2.05 Jeremy Suiter. * Cell edit moves to next field in record on ENTER key being pressed. * Fixed modality problems with some popup windows. * ESC now closes popup windows. * Added menu for hotkey items * Fixed structure mod problems * 24/04/2003 V2.05 John Lau. * Fix problem of bombing out when exiting a browse after editing a memo field. * Fix problem of "APPQUIT" not defined when linking in versions with /dDBEDFUNCTION * 24/04/2003 V2.05 Jim Loughner. * Fix problem of Close push button (APPQUIT) when compiled with /dDBEDFUNCTION in utilities.prg * 30/11/2009 V2.06 Till Warweg * Closing modal dialogs no longer produces flickers. Corrected resize * management under Windows Vista, Windows 7. Misc. changes for * themes support (see $TW marks). * * Notice...: Copyright (c) 2003, Jeremy Suiter, All Rights Reserved * Copyright (c) 1999-2003, Alaska Software, All Rights Reserved (for code taken from ATSAG samples) * * There are some code examples/ideas used that were put on the Oasis or the ASTAG newsgroups. Grateful acknowledgement * goes to those people who posted those code/ideas. * Please feel free to use/modify this program as you would like. * * Notes....: Visual DbEditor main procedures /* * Linking with other apps * Compile all modules with -DDBEDFUNCTION to link with other applications * Call with DBEDITOR(DATAPATH,oOwner,defaultDBE) */ /* * Unremark the following line to compile with versions previous to 1.82. */ #Define MINUS182 #Include "Gra.ch" #Include "Xbp.ch" #Include "Appevent.ch" #Include "DbEditor.ch" #Include "Resources.ch" #Include "Dll.ch" #Include "Font.ch" #Include "Dmlb.ch" #Include "FoxDbe.ch" #Include "CdxDbe.ch" #Include "NtxDbe.ch" #Include "DbfDbe.ch" #Include "SdfDbe.ch" #Include "DelDbe.ch" Static oOldApp, oOldFocus ********* Proc Main(cfile) ********* * main procedure Local nEvent:=Nil, mp1:=Nil, mp2:=Nil, oXbp:=Nil Public cDBE:="", cExtension:="", cExtDesc:="", cDirectory:="", oFocusBrowse:=Nil, cPath:=Nil, lShowDeleted, lMultiUser, ; cUpperCase:="", aRelations:={}, lEditable := .t. oOldApp := SetAppWindow(MainWindow()) oOldFocus := SetAppFocus(MainWindow()) // load ini file settings LoadIniSettings() Do While .T. nEvent := AppEvent(@mp1, @mp2, @oXbp) oXbp:handleEvent(nEvent, mp1, mp2) if !Empty(cFile) OpenFile(cFile, MainWindow()) cFile := NIL EndIf Enddo Return *********** Func AppSys() *********** Local oDlg SetCancel(.F.) SET EXCLUSIVE OFF SET CENTURY ON SET EPOCH TO 1990 // Create application window oDlg:=XbpMainDialog():New(AppDesktop(), , {0, 30}, NIL, {{XBP_PP_BGCLR, GraMakeRGBColor({153, 255, 255})},; {XBP_PP_FGCLR, GRA_CLR_WHITE},; {XBP_PP_COMPOUNDNAME, "8.Helv"}}, .f.) oDlg:create() // Display application window oDlg:show() Return Nil *********** Proc DbeSys() *********** * Load and build all DBE's Local x Local aDbes:={{"DBFDBE", .T.}, ; {"NTXDBE", .T.}, ; {"CDXDBE", .T.}, ; {"DELDBE", .F.}, ; {"SDFDBE", .F.}, ; {"FOXDBE", .T.}} Local aBuild :={{"DBFNTX", 1, 2},; {"DBFCDX", 1, 3},; {"FOXCDX", 6, 3},; {"FOXNTX", 6, 2}, ; {"SDFNTX", 5, 2}, ; {"SDFCDX", 5, 3}, ; {"DELNTX", 4, 2}, ; {"DELCDX", 4, 3}} Begin Sequence // load DBE's For x:=1 To Len(aDbes) If !DbeLoad(aDbes[x][1], aDbes[x][2]) Errm(aDbes[x][1]+" DBE not loaded") EndIf Next x // build database engines For x:=1 To Len(aBuild) If !DbeBuild(aBuild[x][1], aDbes[aBuild[x][2]][1], aDbes[aBuild[x][3]][1]) Errm(aBuild[x][1]+" DBE not built") EndIf Next x End Return *************** Func HelpObject(cHelpFile,cTitle) *************** Static soHelp := NIL If soHelp == NIL soHelp := XbpHelp():new() soHelp:resGeneralHelp := ID_HELP_GENERAL soHelp:resKeysHelp := ID_HELP_KEYS soHelp:create(MainWindow(),cHelpFile,cTitle) EndIf Return soHelp ************ Proc AppQuit() ************ If YesNo("Do you really want to exit","Exit") MainWindow():destroy() SetAppWindow(oOldApp) SetAppFocus(oOldFocus) QUIT EndIf Return ******************** Func LoadIniSettings() ******************** * load ini file settings Local aIniFile:={} aIniFile:=IniLoad("DbEditor.ini") // Default file extension cExtension:=IniGet(aIniFile, "DEFAULTS", "TABLE_EXT") cExtDesc:=IniGet(aIniFile, "DEFAULTS", "EXT_DESC") // Default data directory cDirectory:=IniGet(aIniFile, "DEFAULTS", "DATA_DIR") // Default DBE and settings cDBE:=IniGet(aIniFile, "DEFAULTS", "DBE") DbeSetDefault(cDBE) LoadDbeSettings(aIniFile) // deleted status If IniGet(aIniFile, "DEFAULTS", "SET_DELETED")="On" lShowDeleted:=.F. Set Deleted On Else lShowDeleted:=.T. Set Deleted Off EndIf // multi user status If IniGet(aIniFile, "DEFAULTS", "MULTI_USER")="True" lMultiUser:=.T. Else lMultiUser:=.F. EndIf // uppercase field definitions cUpperCase:=IniGet(aIniFile, "DEFAULTS", "UPPER_CASE") // collation and charset setting Set(_SET_COLLATION, GetDefine(IniGet(aIniFile, "DEFAULTS", "COLLATION"))) Set(_SET_CHARSET, GetDefine(IniGet(aIniFile, "DEFAULTS", "CHARSET"))) // rushmore Set(_SET_RUSHMORE, IniGet(aIniFile, "DEFAULTS", "RUSHMORE")) // smart filtering Set(_SET_SMARTFILTER, IniGet(aIniFile, "DEFAULTS", "SMARTFILTER")) // optimize Set(_SET_OPTIMIZE, IniGet(aIniFile, "DEFAULTS", "OPTIMIZE")) // date format Set(_SET_DATEFORMAT, IniGet(aIniFile, "DEFAULTS", "DATE_FORMAT")) MainWindow():oInfoLine:SetCaption(IIf(lMultiUser,"MULTI-USER","NON MULTI-USER")+", "+"SET DELETED "+IIf(lShowDeleted,"ON","OFF")) Return Nil ******************** Func LoadDbeSettings(aIniFile) ******************** * load DBE settings from ini file Local nCount:=1, cTemp:="", nDefine:="", nSetting1:="", nSetting2:=Nil Do While .T. cTemp:=IniGet(aIniFile, cDbe, "SETTING"+Ntrim(nCount)) If Empty(cTemp) Exit EndIf nDefine:=GetDefine(Left(cTemp,At(",",cTemp)-1)) nSetting1:=GetDefine(SubStr(cTemp,At(",",cTemp)+1,Rat(",",cTemp)-At(",",cTemp)-1)) nSetting2:=Right(cTemp,Len(cTemp)-Rat(",",cTemp)) If nSetting2=".F." nSetting2:=.F. ElseIf nSetting2=".T." nSetting2:=.T. Else nSetting2:=Iif(GetDefine(nSetting2)==0,Val(nSetting2),GetDefine(nSetting2)) EndIf DbeInfo(nDefine,nSetting1,nSetting2) nCount++ EndDo Return Nil ************** Func GetDefine(cDefine) ************** * Return correct define Local nRetVal:=0, nScan Local aDefines:={ {"CDXDBE_COMIX" , CDXDBE_COMIX }, ; {"CDXDBE_FOXPRO2X" , CDXDBE_FOXPRO2X }, ; {"CDXDBE_LIFETIME" , CDXDBE_LIFETIME }, ; {"CDXDBE_LOCKDELAY" , CDXDBE_LOCKDELAY }, ; {"CDXDBE_LOCKDELAY_MIN" , CDXDBE_LOCKDELAY_MIN }, ; {"CDXDBE_LOCKOFFSET" , CDXDBE_LOCKOFFSET }, ; {"CDXDBE_LOCKRETRY" , CDXDBE_LOCKRETRY }, ; {"CDXDBE_LOCKRETRY_MIN" , CDXDBE_LOCKRETRY_MIN }, ; {"CDXDBE_MODE" , CDXDBE_MODE }, ; {"CDXDBE_SIX3" , CDXDBE_SIX3 }, ; {"CDXDBE_VFOXPRO" , CDXDBE_VFOXPRO }, ; {"CDXORD_COLLATION" , CDXORD_COLLATION }, ; {"CDXORD_KEYTYPE" , CDXORD_KEYTYPE }, ; {"CDXORD_LOCKMODE" , CDXORD_LOCKMODE }, ; {"CDXORD_MODE" , CDXORD_MODE }, ; {"COLLAT_SYSTEM" , COLLAT_SYSTEM }, ; {"COLLAT_GERMAN" , COLLAT_GERMAN }, ; {"COLLAT_BRITISH" , COLLAT_BRITISH }, ; {"COLLAT_AMERICAN" , COLLAT_AMERICAN }, ; {"COLLAT_FINNISH" , COLLAT_FINNISH }, ; {"COLLAT_FRENCH" , COLLAT_FRENCH }, ; {"COLLAT_DANISH" , COLLAT_DANISH }, ; {"COLLAT_GREEK437" , COLLAT_GREEK437 }, ; {"COLLAT_GREEK851" , COLLAT_GREEK851 }, ; {"COLLAT_ICELANDIC850" , COLLAT_ICELANDIC850 }, ; {"COLLAT_ICELANDIC861" , COLLAT_ICELANDIC861 }, ; {"COLLAT_ITALIAN" , COLLAT_ITALIAN }, ; {"COLLAT_NORWEGIAN" , COLLAT_NORWEGIAN }, ; {"COLLAT_PORTUGUESE" , COLLAT_PORTUGUESE }, ; {"COLLAT_SPANISH" , COLLAT_SPANISH }, ; {"COLLAT_SWEDISH" , COLLAT_SWEDISH }, ; {"COLLAT_DUTCH" , COLLAT_DUTCH }, ; {"COLLAT_USER" , COLLAT_USER }, ; {"COLLAT_ASCII" , COLLAT_ASCII }, ; {"COMPONENT_DATA" , COMPONENT_DATA }, ; {"COMPONENT_ORDER" , COMPONENT_ORDER }, ; {"DBE_DATATYPES" , DBE_DATATYPES }, ; {"DBE_EXTENSION" , DBE_EXTENSION }, ; {"DBE_LOCKMODE" , DBE_LOCKMODE }, ; {"DBE_MANUFACTURER" , DBE_MANUFACTURER }, ; {"DBE_NAME" , DBE_NAME }, ; {"DBE_VERSION" , DBE_VERSION }, ; {"DELDBE_AUTOFIELD" , DELDBE_AUTOFIELD }, ; {"DELDBE_DECIMAL_TOKEN" , DELDBE_DECIMAL_TOKEN }, ; {"DELDBE_DELIMITER_TOKEN" , DELDBE_DELIMITER_TOKEN }, ; {"DELDBE_FIELD_TOKEN" , DELDBE_FIELD_TOKEN }, ; {"DELDBE_FIELD_TYPES" , DELDBE_FIELD_TYPES }, ; {"DELDBE_LOGICAL_TOKEN" , DELDBE_LOGICAL_TOKEN }, ; {"DELDBE_MAX_BUFFERSIZE" , DELDBE_MAX_BUFFERSIZE }, ; {"DELDBE_MODE" , DELDBE_MODE }, ; {"DELDBE_MULTIFIELD" , DELDBE_MULTIFIELD }, ; {"DELDBE_RECORD_TOKEN" , DELDBE_RECORD_TOKEN }, ; {"DELDBE_SINGLEFIELD" , DELDBE_SINGLEFIELD }, ; {"DELDBO_MODE" , DELDBO_MODE }, ; {"FOXDBE_CACHESIZE" , FOXDBE_CACHESIZE }, ; {"FOXDBE_CREATE_2X" , FOXDBE_CREATE_2X }, ; {"FOXDBE_LIFETIME" , FOXDBE_LIFETIME }, ; {"FOXDBE_LOCKDELAY" , FOXDBE_LOCKDELAY }, ; {"FOXDBE_LOCKDELAY_MIN" , FOXDBE_LOCKDELAY_MIN }, ; {"FOXDBE_LOCKMODE" , FOXDBE_LOCKMODE }, ; {"FOXDBE_LOCKMODE_2X" , FOXDBE_LOCKMODE_2X }, ; {"FOXDBE_LOCKMODE_AUTO" , FOXDBE_LOCKMODE_AUTO }, ; {"FOXDBE_LOCKMODE_VISUAL" , FOXDBE_LOCKMODE_VISUAL }, ; {"FOXDBE_LOCKOFFSET" , FOXDBE_LOCKOFFSET }, ; {"FOXDBE_LOCKRETRY" , FOXDBE_LOCKRETRY }, ; {"FOXDBE_LOCKRETRY_MIN" , FOXDBE_LOCKRETRY_MIN }, ; {"FOXDBE_MEMOBLOCKSIZE" , FOXDBE_MEMOBLOCKSIZE }, ; {"FOXDBE_MEMOFILE_EXT" , FOXDBE_MEMOFILE_EXT }, ; {"ISOLATIONLEVEL_READ_COMMITED" , ISOLATIONLEVEL_READ_COMMITED }, ; {"ISOLATIONLEVEL_READ_REPEATABLE", ISOLATIONLEVEL_READ_REPEATABLE}, ; {"ISOLATIONLEVEL_READ_UNCOMMITED", ISOLATIONLEVEL_READ_UNCOMMITED}, ; {"ISOLATIONLEVEL_SERIALIZABLE" , ISOLATIONLEVEL_SERIALIZABLE }, ; {"ISOLATIONLEVEL_SNAPSHOT" , ISOLATIONLEVEL_SNAPSHOT }, ; {"ISOLATIONLEVEL_UNUSED1" , ISOLATIONLEVEL_UNUSED1 }, ; {"ISOLATIONLEVEL_UNUSED2" , ISOLATIONLEVEL_UNUSED2 }, ; {"ISOLATIONLEVEL_UNUSED3" , ISOLATIONLEVEL_UNUSED3 }, ; {"LOCKING_EXCLUSIVE" , LOCKING_EXCLUSIVE }, ; {"LOCKING_EXTENDED" , LOCKING_EXTENDED }, ; {"LOCKING_FORCESINGLE" , LOCKING_FORCESINGLE }, ; {"LOCKING_SHARED" , LOCKING_SHARED }, ; {"LOCKING_UPDATE" , LOCKING_UPDATE }, ; {"NTXDBE_LOCKDELAY" , NTXDBE_LOCKDELAY }, ; {"NTXDBE_LOCKDELAY_MIN" , NTXDBE_LOCKDELAY_MIN }, ; {"NTXDBE_LOCKOFFSET" , NTXDBE_LOCKOFFSET }, ; {"NTXDBE_LOCKRETRY" , NTXDBE_LOCKRETRY }, ; {"NTXDBE_LOCKRETRY_MIN" , NTXDBE_LOCKRETRY_MIN }, ; {"NTXDBE_SIGN" , NTXDBE_SIGN }, ; {"SDFDBE_AUTOCREATION" , SDFDBE_AUTOCREATION }, ; {"SDFDBE_DECIMAL_TOKEN" , SDFDBE_DECIMAL_TOKEN }, ; {"SDFDBE_LOGICAL_TOKEN" , SDFDBE_LOGICAL_TOKEN }, ; {"SDFDBE_STRUCTURE_EXT" , SDFDBE_STRUCTURE_EXT }, ; {"SDFDBO_DECIMAL_TOKEN" , SDFDBO_DECIMAL_TOKEN }, ; {"SDFDBO_LOGICAL_TOKEN" , SDFDBO_LOGICAL_TOKEN } } nScan:=Ascan(aDefines,{|aE| aE[1]==cDefine}) If !nScan==0 nRetVal:=aDefines[nScan,2] EndIf Return nRetVal