📄 gotchas.prg
字号:
ENDIF
EXIT
ENDDO
IF toIterator.Next()
LOOP
ENDIF
EXIT
ENDDO
*====================================
*-- cRecursiveMetadataVisitor::VisitDBCRecord( o)
*====================================
FUNCTION VisitDBCRecord( loIterator)
*? Not supported as of yet
RETURN
LOCAL lnOldSelect
lnOldSelect= SELECT()
SELECT( loIterator.cAlias)
IF ObjectType= "Field"
? "DBC Field Record", RECNO(loIterator.cAlias)
ENDIF
SELECT (lnOldSelect)
*====================================
*-- cRecursiveMetadataVisitor::VisitExpression( c)
*====================================
FUNCTION VisitExpression( tcExpression)
*====================================
*-- cRecursiveMetadataVisitor::VisitSCXRecord( o)
*====================================
FUNCTION VisitSCXRecord( loIterator)
*====================================
*-- cRecursiveMetadataVisitor::VisitMNXRecord( o)
*====================================
FUNCTION VisitMNXRecord( loIterator)
*====================================
*-- cRecursiveMetadataVisitor::VisitPJX( o)
*====================================
FUNCTION VisitPJX( toIterator)
LOCAL lcProjItem, nAtPos, lcExt, loEngine
DO WHILE .T.
lcProjItem= THIS.GetCurrentSourceID( toIterator)
nAtPos= RAT(".", lcProjItem)
IF nAtPos> 0
lcExt= LOWER( SUBS(lcProjItem, nAtPos))
DO CASE
CASE lcExt == ".scx"
loEngine= CREATE( "cSCXIterator", lcProjItem)
IF !ISNULL( loEngine) AND TYPE( "loEngine")= "O"
loEngine.Accept( THIS)
ENDIF
CASE lcExt == ".vcx"
loEngine= CREATE( "cVCXIterator", lcProjItem)
IF !ISNULL( loEngine) AND TYPE( "loEngine")= "O"
loEngine.Accept( THIS)
ENDIF
CASE lcExt == ".mnx"
loEngine= CREATE( "cMNXIterator", lcProjItem)
IF !ISNULL( loEngine) AND TYPE( "loEngine")= "O"
* THIS.Visit( loEngine)
loEngine.Accept( THIS)
ENDIF
CASE lcExt == ".frx"
loEngine= CREATE( "cFRXIterator", lcProjItem)
* THIS.Visit( loEngine)
IF !ISNULL( loEngine) AND TYPE( "loEngine")= "O"
loEngine.Accept( THIS)
ENDIF
CASE lcExt == ".dbc"
loEngine= CREATE( "cTableIterator", lcProjItem)
* THIS.Visit( loEngine)
IF !ISNULL( loEngine) AND TYPE( "loEngine")= "O"
loEngine.Accept( THIS)
ENDIF
CASE lcExt == ".prg" OR ;
lcExt == ".spr" OR ;
lcExt == ".mpr" OR ;
lcExt == ".ini" OR ;
lcExt == ".h"
THIS.VisitCodeFile( lcProjItem)
ENDCASE
ENDIF
IF toIterator.Next()
LOOP
ENDIF
EXIT
ENDDO
*====================================
*-- cRecursiveMetadataVisitor::VisitFRXRecord( o)
*-- Override to suit.
*====================================
FUNCTION VisitFRXRecord( loIterator)
*====================================
*-- cRecursiveMetadataVisitor::VisitString( c[c])
*-- Override to suit.
*====================================
FUNCTION VisitString( tcElement, tcOrigin)
ENDDEFINE
*///////////////////////////////////
* A B S T R A C T I T E R A T O R
*
* Abstract iterator class
*///////////////////////////////////
DEFINE CLASS cAbstractIterator AS Custom
cType= "Abstract"
Abstract_ID= "Visual INTL Iterator" && Class signature, don't change.
*====================================
*-- cAbstractIterator::Accept( o)
*====================================
* Accept a visitor object
*
FUNCTION Accept( toPassed)
IF TYPE( "toPassed")="O" AND PEMSTATUS( toPassed, "Visit", 5)
RETURN toPassed.Visit( THIS)
ENDIF
*====================================
*-- cAbstractIterator::Close()
*====================================
FUNCTION Close()
RETURN .NULL.
*====================================
*-- cAbstractIterator::First()
*====================================
FUNCTION First()
RETURN .NULL.
*====================================
*-- cAbstractIterator::GetAlias(c)
*====================================
FUNCTION GetAlias(x)
RETURN .NULL.
*====================================
*-- cAbstractIterator::GetCurrentSourceID(x)
*====================================
FUNCTION GetCurrentSourceID(x)
RETURN .NULL.
*====================================
*-- cAbstractIterator::GetStructure()
*====================================
FUNCTION GetStructure(x)
RETURN .NULL.
*====================================
*-- cAbstractIterator::GetType()
*====================================
FUNCTION GetType(x)
RETURN THIS.cType
*====================================
*-- cAbstractIterator::Init( x)
*====================================
FUNCTION Init( x)
*====================================
*-- cAbstractIterator::Last()
*====================================
FUNCTION LastItem()
RETURN .NULL.
*====================================
*-- cAbstractIterator::Next()
*====================================
FUNCTION Next
RETURN .NULL.
*====================================
*-- cAbstractIterator::Open(xx)
*====================================
FUNCTION Open( x,y)
RETURN .NULL.
*====================================
*-- cAbstractIterator::Prior()
*====================================
FUNCTION Prior()
RETURN .NULL.
*====================================
*-- cAbstractIterator::ProgrammaticChange()
*====================================
PROTECTED FUNCTION ProgrammaticChange()
RETURN .NULL.
*====================================
*-- cAbstractIterator::Release()
*====================================
FUNCTION Release()
RELEASE THIS
*====================================
*-- cAbstractIterator::SetAlias(c)
*====================================
FUNCTION SetAlias(x)
RETURN .NULL.
*====================================
*-- cAbstractIterator::SetStructure()
*====================================
FUNCTION SetStructure(x)
RETURN .NULL.
ENDDEFINE
*///////////////////////////////////
* T A B L E I T E R A T O R
*
* General purpose table iterator
*///////////////////////////////////
DEFINE CLASS cTableIterator AS cAbstractIterator
PROTECTED cType, cStructure, cAlias
cType = "Table"
cStructure = ''
cAlias = ''
cSuffix= ".DBF"
lTableOpened=.f.
*====================================
*-- cTableIterator::Close( )
*====================================
* Close the table
*
FUNCTION Close()
LOCAL llRetVal
IF USED( THIS.GetAlias())
LOCAL lcAlias
lcAlias= THIS.GetAlias()
USE IN ( lcAlias)
llRetVal= .T.
ENDIF
RETURN llRetVal
*====================================
*-- cTableIterator::Destroy( )
*====================================
FUNCTION Destroy()
IF THIS.lTableOpened
THIS.Close()
ENDIF
*====================================
*-- cTableIterator::First()
*====================================
* Go to top of file
*
FUNCTION First
IF ! USED( THIS.GetAlias())
RETURN .F.
ENDIF
IF ! BOF( THIS.GetAlias())
LOCAL lcAlias
lcAlias= THIS.GetAlias()
GO TOP IN (lcAlias)
ELSE
RETURN .F.
ENDIF
THIS.ProgrammaticChange()
*====================================
*-- cTableIterator::GetAlias()
*====================================
* Return the alias of the table being iterated
*
FUNCTION GetAlias( )
RETURN THIS.cAlias
*====================================
*-- cTableIterator::GetStructure( )
*====================================
* Return the name of the table being iterated
*
FUNCTION GetStructure()
RETURN THIS.cStructure
*====================================
*-- cTableIterator::Init( c)
*====================================
FUNCTION Init( tcPassed)
IF ISNULL( tcPassed) OR ;
EMPTY( tcPassed) OR ;
TYPE( "tcPassed") <> "C"
RETURN .F.
ENDIF
*-- Parse the passed string
THIS.SetAlias( STRTRAN(TrimPath( tcPassed),"."))
THIS.SetStructure( FULLPATH(tcPassed + IIF( "." $ tcPassed, '', THIS.cSuffix)))
IF !USED( THIS.GetAlias())
IF ! THIS.Open(THIS.GetStructure(), THIS.GetAlias())
RETURN .F.
ENDIF
ELSE
*-- could have the same alias used, but a different file!
IF ! THIS.GetStructure() $ DBF( THIS.GetAlias())
RETURN .F.
ENDIF
ENDIF
*====================================
*-- cTableIterator::Last()
*====================================
* Go to the last record in the table
*
FUNCTION Last
IF ! USED( THIS.GetAlias())
RETURN .F.
ENDIF
LOCAL lcAlias
lcAlias= THIS.GetAlias()
GO BOTTOM IN ( lcAlias)
THIS.ProgrammaticChange()
*====================================
*-- cTableIterator::Next()
*====================================
* Go to the last next record in the table
*
FUNCTION Next
LOCAL lcAlias
lcAlias= THIS.GetAlias()
IF ! USED( lcAlias)
RETURN .F.
ENDIF
IF ! EOF( lcAlias)
SKIP IN ( lcAlias)
IF EOF( lcAlias)
GO BOTTOM IN ( lcAlias)
RETURN .F.
ENDIF
ELSE
RETURN .F.
ENDIF
THIS.ProgrammaticChange()
*====================================
*-- cTableIterator::Open( x)
*====================================
* Open the table to be iterated
*
FUNCTION Open( tcFilename, tcAlias)
IF ISNULL(tcFilename) OR ISNULL(tcAlias)
RETURN .NULL.
ENDIF
IF EMPTY( tcFileName) OR TYPE( "tcFileName") <> "C"
tcFileName= THIS.GetStructure()
IF EMPTY( tcFileName) OR TYPE( "tcFileName") <> "C"
RETURN .F.
ENDIF
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -