⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gotchas.prg

📁 MSComm控件资料,Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。它不但保留了原先Basic语言的全部功能
💻 PRG
📖 第 1 页 / 共 3 页
字号:
*  Program...........: Gotchas.PRG
*  Author............: Steven Black
*  Project...........: Steve Hack
*  Created...........: 11/02/96  10:24:04
*  Copyright.........: (c) SBC, 1996
*) Description.......: PROGRAM Gotchas.PRG
*)                   : Creates a punch list of things to
*)                   : be careful of when localizing an application.
*  Calling Samples...:
*  Parameter List....: tcProject: A project table, fully specified
*  Major change list.:
*  ERs...............:
*  Usage.............: DO Gotchas WITH cProjectName

LPARAMETER tcProject

loAction= CREATE( "Gotchas", tcProject)
loAction.Execute()


DEFINE CLASS Gotchas AS Custom
  cSourceName= ''

  *====================================
  *-- Gotchas::Init( x)
  *====================================
  FUNCTION Init( tuPassed)

  *-- For now we just do whole projects
  IF EMPTY( tuPassed)
    tuPassed= GETFILE("PJX", "Pick a project")
  ENDIF
  
  LOCAL lcSource
  *-- trim, and pad out .pjx file name
  lcSource= ALLTRIM( tuPassed)
  lcSource= lcSource + IIF(AT(".",tuPassed)=0, ".pjx","")

  *-- No such project, man.
  IF !FILE( lcSource)
    WAIT WINDOW PROGRAM() + " can't figure out what project you want to audit"
    RETURN .F.
  ENDIF
  
  this.cSourceName= lcSource
  
  IF ! USED( "Gotchas")
    USE Gotchas IN 0 SHARED
    REPLACE ALL Hits_Found with ""
  ENDIF
  
  *====================================
  *-- Gotchas::Execute()
  *====================================
  FUNCTION Execute
  Clear
  * SET PROC TO INTLTOOL ADDITIVE

  loIterator     = CREATE( "cProjectIterator", THIS.cSourceName)
  loGitchasVisitor= CREATE( "GotchasVisitor")
  loIterator.Accept( loGitchasVisitor)

ENDDEFINE


DEFINE CLASS GotchasVisitor AS cRecursiveMetadataVisitor

  *====================================
  *-- GitchasVisitor::VisitString( c[c])
  *====================================
  FUNCTION VisitString( tcElement, tcOrigin)
  LOCAL lcElement, llFound
  lcElement= UPPER( tcElement)
  SELECT Gotchas
  LOCATE
  SCAN
    IF UPPER( ALLTRIM( Cookie))  $ lcElement
      llFound= .T.
      EXIT
    ENDIF
  ENDSCAN
  
  IF llFound
    llFound= .F.
    LOCAL lcOrigin
    lcOrigin= tcOrigin

    IF EMPTY( lcOrigin) OR TYPE ('lcOrigin')<> "C"
      lcOrigin= THIS.GetCurrentSourceID()
    ENDIF
    IF EMPTY( Hits_Found)
       REPLACE Hits_Found with "Hits for " + ALLTRIM( Descript)
    ENDIF
    REPLACE Hits_Found with Hits_Found+ ;
                          CHR(13)+ ;
                          lcOrigin + ;
                          " ===> " + ;
                          ALLTRIM( STRTRAN(tcElement,CHR(9)," "))
  ENDIF
   
  *====================================
  *-- GitchasVisitor::VisitSCXRecord( o)
  *====================================
  FUNCTION VisitSCXRecord( loIterator)
    LOCAL lcAlias, lcProperties, lcMethods, lcProp, lnI
    lcAlias= loIterator.GetAlias()
    lcProperties=ALLTRIM(&lcAlias..Properties)
    lcMethods=ALLTRIM(&lcAlias..Methods)    

   
    IF!EMPTY( lcProperties)
      THIS.VisitMemo( lcProperties)
    ENDIF
  
    IF!EMPTY( lcMethods)
      THIS.VisitMemo( lcMethods)
    ENDIF

ENDDEFINE

*///////////////////////////////////
*   cRecursiveMetadataVisitor
*
*  This visitor is designed to recursively audit 
*  the metadatd visitee for localizeable resources
*///////////////////////////////////
DEFINE CLASS cRecursiveMetadataVisitor AS Line
  oVisitee= .NULL.

  lVisitComments= .F.

  *====================================
  *-- cRecursiveMetadataVisitor::GetCurrentSourceID( o)
  *====================================
  * Return values suitable for the 
  * STRINGS.cWhere field
  *
  FUNCTION GetCurrentSourceID( toIterator)
    LOCAL lcType, lcAlias
    IF TYPE( "toIterator") <> "O"
      toIterator= THIS.oVisitee
    ENDIF
    lcType= toIterator.GetType()
    DO CASE
    CASE lcType= "Project"
       lcAlias= toIterator.GetAlias()
       RETURN FULLPATH( STRTRAN( ALLTRIM( &lcAlias..Name), CHR(0)), toIterator.GetHomeDir())    

    CASE lcType= "Form"
       lcAlias= toIterator.GetAlias()
       RETURN toIterator.GetStructure() + " -- "+ ALLTRIM( &lcAlias..oBjName)

    CASE lcType= "Visual Class Library"
       LOCAL lcAlias, lnOldSelect, lcRetVal
       lcAlias= toIterator.GetAlias()
       *-- Kluge here: "PARENT" is a keyword, and also a field in the VCX :-\
       lnOldSelect= SELECT()
       SELECT (lcAlias)
       lcRetVal= toIterator.GetStructure() + " -- "+ ;
              IIF(!EMPTY(Parent), ALLTRIM(Parent)+".","")+ ;
              ALLTRIM(ObjName)
       SELECT (lnOldSelect)
       RETURN lcRetVal
                         
    CASE lcType= "Report" OR ;
         lcType= "Menu"                
       RETURN toIterator.GetStructure()    
    
    OTHERWISE
       RETURN ''
    ENDCASE

  *====================================
  *-- cRecursiveMetadataVisitor::Visit( o)
  *====================================
  FUNCTION VISIT( toIterator)
    IF ISNULL( toIterator)
      RETURN .NULL.
    ENDIF
    
    *-- Hook here to visit .PRG files
    IF TYPE( "toIterator") = "C" 
      LOCAL lnPos, lcFName
      lcFName= toIterator
      lnPos=RAT(".", lcFName)
      IF lnPos>0
        LOCAL lcExt
        lcExt= UPPER( SUBSTR( lcFName, LnPos +1))
        IF INLIST( lcExt, "PRG", "MPR", "SPR", "H")
          RETURN THIS.VisitCodeFile( lcFName)
        ENDIF
      ENDIF
      RETURN .F.
    ENDIF
    
    IF TYPE( "toIterator") <> "O"
      RETURN .F.
    ENDIF
    
    THIS.oVisitee= toIterator
    toIterator.First()
    LOCAL lcType
    lcType= toIterator.GetType()
    DO CASE
    CASE PROPER( lcType)="Project"
      THIS.VisitPJX( toIterator)

    CASE PROPER( lcType)="Form"
      THIS.VisitMetaTable( toIterator, "VisitSCXRecord")

    CASE PROPER( lcType)="Visual Class Library"
      THIS.VisitMetaTable( toIterator, "VisitSCXRecord")

    CASE PROPER( lcType)="Menu"
      THIS.VisitMetaTable( toIterator, "VisitMNXRecord")

    CASE PROPER( lcType)="Report"
      THIS.VisitMetaTable( toIterator, "VisitFRXRecord")

    CASE PROPER( lcType)="Table"
      WAIT WINDOW toIterator.GetStructure() NOWAIT
      DO CASE
 
      CASE ".dbc" $ LOWER( toIterator.GetStructure())
        THIS.VisitMetaTable( toIterator, "VisitDBCRecord")
      ENDCASE
    ENDCASE
    WAIT CLEAR

  *====================================
  *-- cRecursiveMetadataVisitor::VisitCodeFile( c)
  *====================================
  FUNCTION VisitCodeFile( tcFileName)
  IF ISNULL( tcFileName)
    RETURN .NULL.
  ENDIF
  IF TYPE("tcFileName") <> "C"     
    RETURN .F.
  ENDIF
  
  LOCAL lcFileName
  lcFileName= ALLTRIM( UPPER( tcFilename))

  *-- Thanks to Mark Giesen at >MHS:MARK@AGIS for
  *-- the following fix for long file names with embedded spaces.
  IF " " $ lcFileName
    lcFileName= '"' + lcFilename+ '"'     
  ENDIF

  IF !FILE( lcFileName)
    WAIT WIND NOWAIT 'File ' + ;
                     lcFileName + ;
                     ' Not Found'
  ENDIF

  PRIVATE ;
    lcOldAlias, ;
    lcFirstChars, ;
    lcSnipLine, ;
    lni, ;
    lnNewLineCount, ;
    lnOldLineCount

  lcOldAlias  = ALIAS()
  WAIT WINDOW lcFileName NOWAIT
  IF ! USED( "IntlTemp")
    *-- Create a cursor if it's not open
    jnOldBlock = SET("BLOCKSIZE")
    SET BLOCKSIZE TO 32
    CREATE CURSOR IntlTemp ;
              ( mOld M, mNew M)

    SET BLOCKSIZE TO ( jnOldBlock)
    APPEND BLANK
  ELSE
    SELECT IntlTemp
    REPLACE mOld WITH "", ;
            mNew WITH ""
  ENDIF

  APPEND MEMO mOld FROM &lcFileName OVERWRITE
  lmPass= mOld
  USE IN IntlTemp
  IF !EMPTY( lcOldAlias) AND USED ( lcOldAlias)
    SELECT ( lcOldAlias)
  ENDIF
  WAIT CLEAR
  
  THIS.VisitMemo( lmPass, lcFileName)

  *====================================
  *-- cRecursiveMetadataVisitor::VisitMemo( tmMemo)
  *====================================
  FUNCTION VisitMemo( tmMemo, tcFileName)
  

  LOCAL lnOldLineCount, lcSnipLine, lcOrigin, lnOldMemoWidth
  lnOldMemoWidth= SET( "MEMOWIDTH")
  SET MEMOWIDTH TO 1000
  *-- Line counter
  lnOldLineCount = 0
  lcSnipLine= ''
  lcOrigin= tcfileName

  IF EMPTY( lcOrigin) OR TYPE ('lcOrigin')<> "C"
    lcOrigin= THIS.GetCurrentSourceID()
  ENDIF

  
  _MLINE = 0

  FOR lni = 1 to MEMLINES( tmMemo)
    lnOldLineCount = lnOldLineCount + 1
    IF lnOldLineCount % 20 = 0
      WAIT WINDOW lcOrigin + "-- " + ;
           ALLTRIM( STR( lnOldLineCount, 6))+ " lines" NOWAIT
    ENDIF

    *-- read the next line in the file
    lcSnipLine  = lcSnipLine+ STRTRAN( MLINE( tmMemo, 1, _MLINE), CHR(9), " ")
    *-- trim it
    lcSnipLine = TRIM( lcSnipLine)
    *-- Take it all in...
    IF RIGHT( lcSnipLine, 1)= CHR(59)  && Semicolon
      lcSnipLine= SUBS( lcSnipLine, LEN( lcSnipLine)- 1)+ " "
      LOOP
    ENDIF
    THIS.VisitCodeLine( lcSnipLine)
    lcSnipLine= ''
  ENDFOR
  SET MEMOWIDTH TO lnOldMemoWidth
  
  *====================================
  *-- cRecursiveMetadataVisitor::VisitMemoLine( tmMemo)
  *====================================
  FUNCTION VisitMemoLine( tcLine)
    THIS.VisitCodeLine( tcLine)  

  *====================================
  *-- cRecursiveMetadataVisitor::VisitCodeLine( c)
  *====================================
  FUNCTION VisitCodeLine( tcCodeLine)
    IF EMPTY( tcCodeLine) 
       RETURN
    ENDIF
  
    *-- comment maybe?
    lcFirstChars = LEFT( LTRIM( STRTRAN( tcCodeLine,CHR(9))), 2)
    IF lcFirstChars = "*" AND ! THIS.lVisitComments
      RETURN
    ENDIF
    
    THIS.VisitString( tcCodeLine)

  *====================================
  *-- cRecursiveMetadataVisitor::VisitMetaTable( o)
  *====================================
  FUNCTION VisitMetaTable( toIterator, tcMethod)
    LOCAL lcStructure
    lcStructure= toIterator.GetStructure()
    DO WHILE .T.
      WAIT WINDOW lcStructure NOWAIT    
      LOCAL loEngine
      loEngine= CREATE("cTableIterator", lcStructure)
      DO WHILE .T.
        LOCAL lcHold
        lcHold="THIS."+tcMethod
        &lcHold.( loEngine)
        IF loEngine.Next()
          LOOP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -