Nueva version con copiar y pegar para browses, y adem谩s la primera implementaci贸n de un visor gen茅rico de documentos:
#include "FiveWin.ch"
#include "xbrowse.ch"
#ifdef __XHARBOUR__
聽 聽#define hb_CurDrive() CurDrive()
#endif 聽
REQUEST DBFCDX
static oWndMain, oMruDBFs, aSearches := {}
//----------------------------------------------------------------------------//
function Main( cDbfName )
聽 聽local oBar, oBmpTiled
聽 聽
聽 聽SET DATE FORMAT TO "DD/MM/YYYY"
聽 聽SetDlgGradient( { { 1, RGB( 199, 216, 237 ), RGB( 237, 242, 248 ) } } )
聽 聽DEFINE BITMAP oBmpTiled RESOURCE "background"
聽 聽DEFINE WINDOW oWndMain TITLE "FiveDBU" MDI MENU BuildMenu()
聽 聽DEFINE BUTTONBAR oBar OF oWndMain 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "New" RESOURCE "new" ACTION New()
聽 聽DEFINE BUTTON OF oBar PROMPT "Open" RESOURCE "open" ACTION Open()
聽 聽DEFINE BUTTON OF oBar PROMPT "Copy" RESOURCE "copy" ACTION Copy() GROUP
聽 聽DEFINE BUTTON OF oBar PROMPT "Paste" RESOURCE "paste" ACTION Paste()
聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION oWndMain:PrevWindow() GROUP WHEN Len( oWndMain:oWndClient:aWnd ) > 1
聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION oWndMain:NextWindow() WHEN Len( oWndMain:oWndClient:aWnd ) > 1
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWndMain:End() GROUP
聽 聽DEFINE MSGBAR PROMPT "FiveDBU 32/64 bits, (c) FiveTech Software 2012" ;
聽 聽 聽 OF oWndMain 2010 KEYBOARD DATE
聽 聽if ! Empty( cDbfName )
聽 聽 聽 Open( cDbfName )
聽 聽endif 聽
聽 聽ACTIVATE WINDOW oWndMain MAXIMIZED ;
聽 聽 聽 VALID MsgYesNo( "Want to end ?" ) ;
聽 聽 聽 ON PAINT DrawTiled( hDC, oWndMain, oBmpTiled )
聽 聽
聽 聽oBmpTiled:End() 聽 聽 聽
return nil
//----------------------------------------------------------------------------//
function BuildMenu()
聽 聽local oMenu
聽 聽
聽 聽MENU oMenu
聽 聽 聽 MENUITEM "Files"
聽 聽 聽 MENU
聽 聽 聽 聽 聽MENUITEM "New..."
聽 聽 聽 聽 聽MENUITEM "Open..." ACTION Open()
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Recent files"
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 MRU oMruDBFs ;
聽 聽 聽 聽 聽 聽 聽 聽FILENAME ".\FiveDBU.ini" ; 聽 聽// .INI to manipulate. '\.' for local
聽 聽 聽 聽 聽 聽 聽 聽SECTION 聽"Recent DBF files" ; // The name of the INI section
聽 聽 聽 聽 聽 聽 聽 聽ACTION 聽 Open( cMruItem ) ; 聽 // cMruItem is automatically provided
聽 聽 聽 聽 聽 聽 聽 聽MESSAGE 聽"Open this file" ; 聽 // The message for all of them
聽 聽 聽 聽 聽 聽 聽 聽SIZE 聽 聽 10
聽 聽 聽 聽 聽ENDMENU 聽 聽 聽
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 聽 聽MENUITEM "Exit" ACTION oWndMain:End()
聽 聽 聽 ENDMENU
聽 聽 聽
聽 聽 聽 // oMenu:AddEdit()
聽 聽 聽 oMenu:AddMdi()
聽 聽 聽 oMenu:AddHelp( "FiveDBU", "(c) FiveTech Software 2012" )
聽 聽ENDMENU
聽 聽
return oMenu 聽 聽 聽
//----------------------------------------------------------------------------//
function Open( cFileName )
聽 聽local oWnd, oBar, oBrw, oMsgBar, oMsgDeleted, oMsgTagName
聽 聽local oPopup, cAlias, n, cClrBack, nTags
聽 聽
聽 聽DEFAULT cFileName := cGetFile( "*.dbf", "Please select a DBF" )
聽 聽
聽 聽if Empty( cFileName )
聽 聽 聽 return nil
聽 聽endif 聽
聽 聽
聽 聽if ! "." $ cFileName
聽 聽 聽 cFileName += ".dbf"
聽 聽endif 聽
聽 聽
聽 聽if ! File( cFileName )
聽 聽 聽 MsgStop( "File not found: " + cFileName )
聽 聽 聽 return nil
聽 聽endif
聽 聽
聽 聽if File( cFileNoExt( cFileName ) + ".ntx" )
聽 聽 聽 USE ( cFileName ) VIA "DBFNTX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽else 聽
聽 聽 聽 USE ( cFileName ) VIA "DBFCDX" NEW SHARED ;
聽 聽 聽 聽 聽ALIAS ( cGetNewAlias( cFileName( cFileNoExt( cFileName ) ) ) )
聽 聽 聽 cAlias = Alias()
聽 聽endif 聽 聽 聽 聽
聽 聽
聽 聽oMruDBFs:Save( cFileName )
聽 聽
聽 聽MENU oPopup POPUP
聽 聽 聽 MENUITEM "Natural order" ;
聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( 0 ) ), oBrw:Refresh(), oBrw:SetFocus(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ( cAlias )->( Eval( oBrw:bChange ) ) )
聽 聽 聽
聽 聽 聽 if ( nTags := ( cAlias )->( OrdTagsCount() ) ) > 0
聽 聽 聽 聽 聽SEPARATOR
聽 聽 聽 endif 聽
聽 聽 聽
聽 聽 聽 for n = 1 to nTags
聽 聽 聽 聽 聽if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽 聽 if ! Empty( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbSetOrder( OrdName( 1 ) )
聽 聽 聽 聽 聽 聽 聽 聽DbGoTop()
聽 聽 聽 聽 聽 聽 endif 聽
聽 聽 聽 聽 聽 聽 MENUITEM OrdName( n ) ;
聽 聽 聽 聽 聽 聽 聽 聽ACTION ( ( cAlias )->( DbSetOrder( oMenuItem:cPrompt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oBrw:Refresh(), ( cAlias )->( Eval( oBrw:bChange ) ), oBrw:SetFocus() )
聽 聽 聽 聽 聽endif
聽 聽 聽 next 聽 聽
聽 聽ENDMENU 聽
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Browse " + cFileName MDICHILD
聽 聽oWnd:bCopy = { || MsgInfo( "copy" ) }
聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( ( oBrw:cAlias )->( DbAppend() ), oBrw:Refresh(), oBrw:SetFocus() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Edit() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION ( obrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) )
聽 聽DEFINE BUTTON OF oBar PROMPT "Search" RESOURCE "search" ;
聽 聽 聽 GROUP ACTION ( cAlias )->( Search( oBrw ) )
聽 聽DEFINE BUTTON OF oBar PROMPT "Index" RESOURCE "index" ;
聽 聽 聽 MENU oPopup ACTION ( cAlias )->( Indexes() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Top" RESOURCE "prev" ;
聽 聽 聽 ACTION ( oBrw:GoTop(), oBrw:SetFocus() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Bottom" RESOURCE "next" ;
聽 聽 聽 ACTION ( oBrw:GoBottom(), oBrw:SetFocus() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Struct" RESOURCE "struct" ;
聽 聽 聽 ACTION ( oBrw:cAlias )->( Struct() ) GROUP
聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ACTION oWnd:End() GROUP
聽 聽@ 0, 0 XBROWSE oBrw OF oWnd LINES ;
聽 聽 聽 ON CHANGE ( oMsgBar:cMsgDef := "Alias: " + Alias() + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽" RecNo: " + AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( RecCount() ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgBar:Refresh(),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgTagName:SetText( "Ordered by: " + If( ! Empty( OrdName() ), OrdName(), "Natural order" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetText( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"DELETED", "NON DELETED" ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oMsgDeleted:SetBitmap( If( ( oBrw:cAlias )->( Deleted() ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"deleted", "nondeleted" ) ) )
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_BLACK ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽RGB( 0x33, 0x66, 0xCC ) } }
聽 聽cClrBack = Eval( oBrw:bClrSelFocus )[ 2 ] 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:bClrSelFocus = { || { If( ( oBrw:cAlias )->( Deleted() ), CLR_HRED, CLR_WHITE ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 cClrBack } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽oBrw:bLDblClick = { || ( oBrw:cAlias )->( Edit() ) } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽oWnd:oControl = oBrw
聽 聽DEFINE MSGBAR oMsgBar PROMPT "Alias: " + Alias() + " | RecNo: " + ;
聽 聽 聽 AllTrim( Str( RecNo() ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( RecCount() ) ) ;
聽 聽 聽 OF oWnd 2010
聽 聽DEFINE MSGITEM oMsgTagName OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT "Ordered by: " + ;
聽 聽 聽 聽 聽 If( ! Empty( ( oBrw:cAlias )->( OrdName() ) ),;
聽 聽 聽 聽 聽 聽 聽 ( oBrw:cAlias )->( OrdName() ), "Natural order" ) ;
聽 聽 聽 聽 聽 SIZE 150
聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( oBrw:cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS "nondeleted" ;
聽 聽 聽 聽 聽 ACTION ( oBrw:cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽
聽 聽 聽 聽 聽
聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 VALID ( ( cAlias )->( DbCloseArea() ), oBrw:cAlias := "", .T. )
聽 聽
return nil 聽
//----------------------------------------------------------------------------//
function Copy()
聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Copy()
聽 聽endif 聽
return nil
//----------------------------------------------------------------------------//
聽 聽
function DelRecord( oBrw, oMsgDeleted )
聽 聽if ! Deleted()
聽 聽 聽 if ! MsgYesNo( "Want to delete this record ?" )
聽 聽 聽 聽 聽return nil
聽 聽 聽 endif 聽
聽 聽 聽 DbRLock() 聽
聽 聽 聽 DbDelete() 聽
聽 聽 聽 DbUnlock() 聽
聽 聽 聽 oMsgDeleted:SetText( "DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "deleted" )
聽 聽else
聽 聽 聽 DbRLock() 聽
聽 聽 聽 DbRecall() 聽
聽 聽 聽 DbUnlock() 聽 聽 聽 聽
聽 聽 聽 oMsgDeleted:SetText( "NON DELETED" )
聽 聽 聽 oMsgDeleted:SetBitmap( "nondeleted" )
聽 聽 聽 MsgInfo( "UnDeleted record" )
聽 聽endif
聽 聽
聽 聽Eval( oBrw:bChange )
聽 聽oBrw:Refresh()
return nil 聽
//----------------------------------------------------------------------------//
聽 聽
function Edit()
聽 聽local oWnd, aRecord := ( Alias() )->( LoadRecord() ), oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), oBtnSave, nRecNo := ( Alias() )->( RecNo() )
聽 聽local oMsgDeleted
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Edit " + Alias() MDICHILD
聽 聽oWndMain:oBar:AEvalWhen()
聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON oBtnSave OF oBar PROMPT "Save" RESOURCE "save" ;
聽 聽 聽 ACTION ( ( cAlias )->( SaveRecord( aRecord, nRecNo ) ), oBtnSave:Disable() )
聽 聽oBtnSave:Disable()
聽 聽DEFINE BUTTON OF oBar PROMPT "Prev" RESOURCE "prev" ;
聽 聽 聽 ACTION GoPrevRecord( oBrw, aRecord, oMsgDeleted ) GROUP
聽 聽DEFINE BUTTON OF oBar PROMPT "Next" RESOURCE "next" ;
聽 聽 聽 ACTION GoNextRecord( oBrw, aRecord, oMsgDeleted ) GROUP
聽 聽DEFINE BUTTON OF oBar PROMPT "Report" RESOURCE "report" ;
聽 聽 聽 ACTION oBrw:Report()
聽 聽DEFINE BUTTON OF oBar PROMPT "View" RESOURCE "view" ;
聽 聽 聽 ACTION View( oBrw:aRow[ 2 ], oWnd )
聽 聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP
聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aRecord AUTOCOLS LINES ;
聽 聽 聽 HEADERS "FieldName", "Value" COLSIZES 150, 400 FASTEDIT ;
聽 聽 聽 ON CHANGE ( ( cAlias )->( SetEditType( oBrw, oBtnSave ) ), oBrw:DrawLine( .T. ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:cMsgDef := " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"/" + AllTrim( Str( ( cAlias )->( RecCount() ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 oMsgBar:Refresh() ) 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:nEditTypes = EDIT_GET
聽 聽oBrw:aCols[ 1 ]:nEditType = 0 // Don't allow to edit first column
聽 聽oBrw:aCols[ 2 ]:bOnChange = { || oBtnSave:Enable() }
聽 聽oBrw:aCols[ 2 ]:lWillShowABtn = .T.
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽DEFINE MSGBAR oMsgBar ;
聽 聽 聽 PROMPT " RecNo: " + AllTrim( Str( ( cAlias )->( RecNo() ) ) ) + "/" + ;
聽 聽 聽 AllTrim( Str( ( cAlias )->( RecCount() ) ) ) OF oWnd 2010
聽 聽DEFINE MSGITEM oMsgDeleted OF oMsgBar ;
聽 聽 聽 聽 聽 PROMPT If( ( cAlias )->( Deleted() ), "DELETED", "NON DELETED" ) ;
聽 聽 聽 聽 聽 SIZE 130 ;
聽 聽 聽 聽 聽 BITMAPS If( ( cAlias )->( Deleted() ), "deleted", "nondeleted" ) ;
聽 聽 聽 聽 聽 ACTION ( cAlias )->( DelRecord( oBrw, oMsgDeleted ) ) 聽
聽 聽
聽 聽ACTIVATE WINDOW oWnd
聽 聽
return nil 聽 聽 聽
//----------------------------------------------------------------------------//
function GoPrevRecord( oBrw, aRecord, oMsgDeleted )
聽 聽DbSkip( -1 )
聽 聽
聽 聽oBrw:SetArray( aRecord := LoadRecord() )
聽 聽oBrw:SetFocus()
聽 聽Eval( oBrw:bChange )
聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil
//----------------------------------------------------------------------------//
function GoNextRecord( oBrw, aRecord, oMsgDeleted )
聽 聽DbSkip( 1 )
聽 聽
聽 聽If Eof()
聽 聽 聽 DbSkip( -1 )
聽 聽else
聽 聽 聽 oBrw:SetArray( aRecord := LoadRecord() )
聽 聽 聽 oBrw:SetFocus()
聽 聽 聽 Eval( oBrw:bChange )
聽 聽endif 聽
聽 聽oMsgDeleted:SetText( If( Deleted(), "DELETED", "NON DELETED" ) )
聽 聽oMsgDeleted:SetBitmap( If( Deleted(), "deleted", "nondeleted" ) )
聽 聽
return nil
//----------------------------------------------------------------------------//
function SetEditType( oBrw, oBtnSave )
聽 聽local cType := FieldType( oBrw:nArrayAt )
聽 聽
聽 聽do case
聽 聽 聽 case cType == "M"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { | c | c := oBrw:aRow[ 2 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽MemoEdit( @oBrw:aRow[ 2 ], FieldName( oBrw:nArrayAt ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( ! c == oBrw:aRow[ 2 ], oBtnSave:Enable(),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:aRow[ 2 ] }
聽 聽
聽 聽 聽 case cType == "D"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_BUTTON
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:bEditBlock = { || If( ! Empty( oBrw:aRow[ 2 ] ) .and. ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽! AllTrim( oBrw:aRow[ 2 ] ) == "/ 聽/",;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( CtoD( oBrw:aRow[ 2 ] ) ) ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DToC( MsgDate( Date() ) ) ) }
聽 聽
聽 聽 聽 case cType == "L"
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_LISTBOX
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:aEditListTxt 聽 = { ".T.", ".F." }
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽oBrw:aCols[ 2 ]:nEditType = EDIT_GET
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽
//----------------------------------------------------------------------------//
function IndexBuilder()
聽 聽local oDlg, cKey := Space( 80 )
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Index builder" SIZE 600, 500
聽 聽oDlg:lDesign = .T.
聽 聽@ 0.5, 聽2 SAY "Index on" OF oDlg SIZE 40, 8
聽 聽@ 1.4, 1 GET cKey OF oDlg SIZE 140, 11 ACTION ExpBuilder()
聽 聽
聽 聽@ 0.5, 15 SAY "Tag" OF oDlg SIZE 40, 8
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
return nil
//----------------------------------------------------------------------------//
function Indexes()
聽 聽local oWnd, oBar, oBrw, oMsgBar
聽 聽local cAlias := Alias(), aIndexes := {}, n
聽 聽
聽 聽for n = 1 to 15
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽AAdd( aIndexes, { n,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdKey( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdFor( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagName( n ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽OrdBagExt( n ) } )
聽 聽 聽 endif 聽
聽 聽next 聽 聽
聽 聽
聽 聽DEFINE WINDOW oWnd TITLE "Indexes of " + Alias() MDICHILD
聽 聽oWndMain:oBar:AEvalWhen()
聽 聽DEFINE BUTTONBAR oBar OF oWnd 2010 SIZE 70, 70
聽 聽DEFINE BUTTON OF oBar PROMPT "Add" RESOURCE "add" ;
聽 聽 聽 ACTION ( MsgInfo( "Add Tag" ), oBrw:Refresh(), oBrw:SetFocus() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Edit" RESOURCE "edit" ;
聽 聽 聽 ACTION ( MsgInfo( "Edit" ) )
聽 聽DEFINE BUTTON OF oBar PROMPT "Del" RESOURCE "del" ;
聽 聽 聽 ACTION If( MsgYesNo( "Want to delete this tag ?" ),;
聽 聽 聽 聽 聽 聽 聽 聽 ( ( cAlias )->( OrdBagClear( oBrw:nArrayAt ) ), oBrw:Refresh() ),)
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oWnd:End() GROUP
聽 聽@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aIndexes AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Order", "TagName", "Expression", "For", "BagName", "BagExt" ;
聽 聽 聽 COLSIZES 50, 150, 400, 400, 150, 150
聽 聽oBrw:nMarqueeStyle = MARQSTYLE_HIGHLROW 聽
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽oBrw:SetFocus()
聽 聽
聽 聽oWnd:oClient = oBrw
聽 聽DEFINE MSGBAR oMsgBar 2010
聽 聽
聽 聽ACTIVATE WINDOW oWnd
return nil
//----------------------------------------------------------------------------//
function ExpBuilder()
聽 聽local oDlg
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Expression builder"
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
return nil
//----------------------------------------------------------------------------//
function LoadRecord()
聽 聽local aRecord := {}, n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 AAdd( aRecord, { FieldName( n ), FieldGet( n ) } )
聽 聽next
聽 聽
return aRecord 聽 聽 聽
聽 聽
//----------------------------------------------------------------------------//
function Search( oBrw )
聽 聽local oDlg, oCbx, cSearch := Space( 50 )
聽 聽local nRecNo := RecNo(), lInc := .T.
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "Search: " + Alias() SIZE 400, 200
聽 聽
聽 聽@ 0.5, 1.5 SAY "Ordered by: " + OrdName() OF oDlg
聽 聽
聽 聽@ 1.2, 1.5 SAY "Key: " + OrdKey() OF oDlg
聽 聽
聽 聽@ 2.4, 1.2 COMBOBOX oCbx VAR cSearch ITEMS aSearches OF oDlg SIZE 180, 150 ;
聽 聽 聽STYLE CBS_DROPDOWN
聽 聽
聽 聽oCbx:oGet:bChange = { || DbSeek( AllTrim( oCbx:GetText() ), lInc ), oBrw:Refresh() }
聽 聽
聽 聽@ 3.7, 1.5 CHECKBOX lInc PROMPT "&Incremental" OF oDlg SIZE 80, 10
聽 聽
聽 聽@ 4, 7 BUTTON "&Ok" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! DbSeek( AllTrim( cSearch ), lInc ), DbGoTo( nRecNo ),),;
聽 聽 聽 聽 聽 聽 聽 聽AAdd( aSearches, AllTrim( cSearch ) ), oDlg:End() )
聽 聽@ 4, 18 BUTTON "&Cancel" OF oDlg SIZE 45, 13 ACTION oDlg:End()
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED
聽 聽
return nil 聽
//----------------------------------------------------------------------------//
function SaveRecord( aRecord, nRecNo )
聽 聽local n
聽 聽( Alias() )->( DbGoTo( nRecNo ) )
聽 聽
聽 聽if ( Alias() )->( DbRLock( nRecNo ) )
聽 聽 聽 for n = 1 to Len( aRecord )
聽 聽 聽 聽 聽( Alias() )->( FieldPut( n, aRecord[ n ][ 2 ] ) )
聽 聽 聽 next
聽 聽 聽 ( Alias() )->( DbUnLock() )
聽 聽 聽 MsgInfo( "Record updated" )
聽 聽else
聽 聽 聽 MsgAlert( "Record in use, please try it again" )
聽 聽endif 聽 聽 聽 聽
return nil 聽 聽 聽
//----------------------------------------------------------------------------//
function Struct()
聽 聽local oDlg, oBrw, aFields := DbStruct()
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE Alias() + " fields" SIZE 400, 400
聽 聽@ 0, 0 XBROWSE oBrw ARRAY aFields AUTOCOLS LINES ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 150, 50, 80, 80
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽
聽 聽oBrw:CreateFromCode()
聽 聽 聽
聽 聽oDlg:oClient = oBrw
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTERED ;
聽 聽 聽 ON INIT ( BuildStructBar( oDlg, oBrw ), oDlg:Resize(), oBrw:SetFocus() )
聽 聽
return nil 聽
//----------------------------------------------------------------------------//
function BuildStructBar( oDlg, oBrw )
聽 聽local oBar
聽 聽DEFINE BUTTONBAR oBar OF oDlg 2010 SIZE 70, 70
聽 聽
聽 聽DEFINE BUTTON OF oBar PROMPT "Code" RESOURCE "code" ;
聽 聽 聽 ACTION ( TxtStruct(), oBrw:SetFocus() )
聽 聽DEFINE BUTTON OF oBar PROMPT "Exit" RESOURCE "exit" ;
聽 聽 聽 ACTION oDlg:End() GROUP
return nil
//----------------------------------------------------------------------------//
function TxtStruct()
聽 聽local cCode := "local aFields := { ", n
聽 聽
聽 聽for n = 1 to FCount()
聽 聽 聽 if n > 1
聽 聽 聽 聽 聽cCode += Space( 27 )
聽 聽 聽 endif 聽
聽 聽 聽 cCode += '{ "' + FieldName( n ) + '", "' + ;
聽 聽 聽 聽 聽 聽 聽 聽FieldType( n ) + '", ' + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldLen( n ) ) ) + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽AllTrim( Str( FieldDec( n ) ) ) + " },;" + CRLF
聽 聽next
聽 聽
聽 聽cCode = SubStr( cCode, 1, Len( cCode ) - 4 ) + " }"
聽 聽
聽 聽MemoEdit( cCode, "Code" )
return nil
//----------------------------------------------------------------------------// 聽
function View( cFileName, oWnd )
聽 聽local cExt := Lower( cFileExt( cFileName ) )
聽 聽
聽 聽do case
聽 聽 聽 case cExt == "bmp"
聽 聽 聽 聽 聽 聽WinExec( "mspaint" + " " + cFileName )
聽 聽 聽 聽 聽 聽
聽 聽 聽 case cExt == "txt"
聽 聽 聽 聽 聽 聽WinExec( "notepad" + " " + cFileName ) 聽 聽
聽 聽 聽 聽 聽 聽
聽 聽 聽 otherwise
聽 聽 聽 聽 聽 聽ShellExecute( oWnd:hWnd, "Open", cFileName )
聽 聽endcase
聽 聽
return nil 聽 聽 聽 聽 聽 聽 聽 聽
//----------------------------------------------------------------------------// 聽
function New()
聽 聽local oDlg, oGet, oBrw
聽 聽local cFieldName := Space( 10 ), cType, nLen := 10, nDec := 0
聽 聽local aFields := { Array( 4 ) }, cDbfName := Space( 8 ), aTemp
聽 聽
聽 聽DEFINE DIALOG oDlg TITLE "DBF builder" SIZE 415, 400
聽 聽@ 0.5, 聽2 SAY "Field Name" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 10 SAY "Type" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 17 SAY "Len" OF oDlg SIZE 40, 8
聽 聽@ 0.5, 22 SAY "Dec" OF oDlg SIZE 20, 8
聽 聽
聽 聽@ 1.4, 1 GET oGet VAR cFieldName PICTURE "!!!!!!!!!!" OF oDlg SIZE 41, 11
聽 聽
聽 聽@ 1.3, 6.5 COMBOBOX cType ITEMS { "Character", "Number", "Date", "Logical", "Memo" } ;
聽 聽 聽 OF oDlg ON CHANGE ( If( cType == "Character", ( nLen := 10, nDec := 0 ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Number", nDec := 0,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Date", ( nLen := 8, nDec := 0 ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Logical", ( nLen := 1, nDec := 0 ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( cType == "Memo", ( nLen := 10, nDec := 0 ),),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oDlg:Update() )
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽@ 1.4, 11.9 GET nLen PICTURE "999" OF oDlg SIZE 25, 11 UPDATE
聽 聽@ 1.4, 15.4 GET nDec PICTURE "999" OF oDlg SIZE 25, 11 WHEN cType = "Number" UPDATE
聽 聽
聽 聽@ 0.9, 26 BUTTON "&Add" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION AddField( @aFields, @cFieldName, @cType, @nLen, @nDec, oGet, oBrw )
聽 聽@ 2.2, 2 SAY "Fields" OF oDlg SIZE 40, 8
聽 聽
聽 聽@ 3.2, 1 XBROWSE oBrw ARRAY aFields AUTOCOLS ;
聽 聽 聽 HEADERS "Name", "Type", "Len", "Dec" ;
聽 聽 聽 COLSIZES 90, 55, 40, 40 ;
聽 聽 聽 SIZE 140, 130 OF oDlg
聽 聽oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 聽
聽 聽oBrw:bClrStd = { || If( oBrw:KeyNo() % 2 == 0, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 198, 255, 198 ) }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽{ CLR_BLACK, RGB( 232, 255, 232 ) } ) }
聽 聽oBrw:bClrSel = { || { CLR_WHITE, RGB( 0x33, 0x66, 0xCC ) } } 聽 聽
聽 聽oBrw:SetColor( CLR_BLACK, RGB( 232, 255, 232 ) )
聽 聽oBrw:CreateFromCode()
聽 聽@ 2.4, 26 BUTTON "&Edit" OF oDlg SIZE 45, 13
聽 聽@ 3.4, 26 BUTTON "&Delete" OF oDlg SIZE 45, 13
聽 聽@ 4.4, 26 BUTTON "Move &Up" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt > 1,;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt - 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt - 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoUp() ),)
聽 聽@ 5.4, 26 BUTTON "Move D&own" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION If( oBrw:nArrayAt < Len( aFields ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽( aTemp := aFields[ oBrw:nArrayAt ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt ] := aFields[ oBrw:nArrayAt + 1 ],;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽aFields[ oBrw:nArrayAt + 1 ] := aTemp,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽oBrw:GoDown() ),)
聽 聽@ 12.1, 2 SAY "DBF Name:" OF oDlg SIZE 30, 8
聽 聽@ 14, 6 GET cDbfName PICTURE "!!!!!!!!!!!!" OF oDlg SIZE 100, 11
聽 聽@ 10, 26 BUTTON "&Create" OF oDlg SIZE 45, 13 ;
聽 聽 聽 ACTION ( If( ! Empty( cDbfName ) .and. Len( aFields ) > 0,;
聽 聽 聽 聽 聽 DbCreate( AllTrim( cDbfName ), aFields ),), oDlg:End(),;
聽 聽 聽 聽 聽 Open( hb_CurDrive() + ":\" + CurDir() + "\" + AllTrim( cDbfName ) ) )
聽 聽ACTIVATE DIALOG oDlg CENTERED
return nil
//----------------------------------------------------------------------------//
function AddField( aFields, cFieldName, cType, nLen, nDec, oGet, oBrw )
聽 聽if Empty( cFieldName )
聽 聽 聽 oGet:SetPos( 0 )
聽 聽 聽 return nil
聽 聽endif 聽
聽 聽if Len( aFields ) == 1 .and. Empty( aFields[ 1 ][ 1 ] )
聽 聽 聽 aFields = { { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } }
聽 聽else 聽
聽 聽 聽 AAdd( aFields, { cFieldName, Upper( Left( cType, 1 ) ), nLen, nDec } )
聽 聽endif
聽 聽 聽
聽 聽oBrw:SetArray( aFields )
聽 聽oGet:VarPut( cFieldName := Space( 10 ) )
聽 聽oGet:SetPos( 0 )
聽 聽oGet:SetFocus()
聽 聽oBrw:GoBottom()
聽 聽 聽 聽 聽 聽 聽 聽
return nil
//----------------------------------------------------------------------------// 聽
function OrdTagsCount()
聽 聽local n, nCount := 0
聽 聽
聽 聽for n = 1 to 100
聽 聽 聽 if ! Empty( OrdName( n ) )
聽 聽 聽 聽 聽nCount++
聽 聽 聽 endif 聽
聽 聽next
聽 聽
return nCount 聽
聽 聽
//----------------------------------------------------------------------------// 聽
function Paste()
聽 聽if oWndMain:oWndActive != nil
聽 聽 聽 oWndMain:oWndActive:Paste()
聽 聽endif 聽
return nil
//----------------------------------------------------------------------------// 聽
#pragma BEGINDUMP
#include <hbapi.h>
#include <hbapirdd.h>
HB_FUNC( ORDCONDGET )
{
聽 聽AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
聽 聽
聽 聽if( pArea )
聽 聽{
聽 聽 聽 LPDBORDERCONDINFO lpdbOrdCondInfo = pArea->lpdbOrdCondInfo;
聽 聽 聽
聽 聽 聽 if( lpdbOrdCondInfo && lpdbOrdCondInfo->abWhile )
聽 聽 聽 聽 聽hb_retc( lpdbOrdCondInfo->abWhile );
聽 聽 聽 else
聽 聽 聽 聽 聽hb_retc( "" ); 聽
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" ); 聽 聽
}
#pragma ENDDUMP
//----------------------------------------------------------------------------//