主题:[原创]对程序段进行缩进处理源代码.
*在编写程序源代码时,对结构语句的命令行进行缩进处理,可增加代码的可读性。有些编程工具能够自动缩进,但VFP在这一方面相对较差,特别是经过反复修改后,代码将变得很不工整。下面的程序段,能够自动去掉命令行中的空行前后空格并进行缩进处理。
*使用方法:将正在编辑的代码全部剪下来,运行下面的程序段,按CTRL+V粘贴到原位置。该程序段有一个小的限制,既自定义过程名的前面不要有结构语句命令保留字。如SCANDIR(),该程序认为是SCAN命令。
*如果经常用的话,可以在启动项目时给系统菜单增加一菜单命令,并设置快捷键,使该命令自动剪切正在编辑的全部代码,并进行处理,然后自动粘贴到原位置。有兴趣的同志不妨试试。
LPARAMETERS Lprg
SET MEMOWIDTH TO 8192
CREATE CURSOR temp_clip(TXT1 M,TXT2 M)
APPEND BLANK
IF PCOUNT()=0
IF TYPE('_CLIPTEXT')='C'
REPLACE txt1 WITH _CLIPTEXT
ELSE
=MESSAGEBOX('请剪切完整的过程文本内容!',48,'提示')
return
ENDIF
ELSE
IF FILE(lprg) AND UPPER(JUSTEXT(lprg))='PRG'
APPEND MEMO txt1 FROM (lprg)
ELSE
=MESSAGEBOX(' 程序文件不存在! ',48,'提示')
return
ENDIF
ENDIF
FOR i=1 TO MEMLINES(txt1)
CmdLine=ALLTRIM(MLINE(txt1,i))&&去掉前后空格
IF ISBLANK(CmdLine) &&去掉空行
LOOP
ENDIF
DO WHILE .t. &&去掉前TAB
IF ASC(CmdLine)=9
CmdLine=SUBSTR(CmdLine,2)
ELSE
EXIT
ENDIF
ENDDO
REPLACE txt2 WITH txt2+CmdLine+CHR(13)
ENDFOR
TABNO=0
REPLACE TXT1 WITH ''
FOR i=1 TO MEMLINES(txt2)
CmdLine=ALLTRIM(MLINE(txt2,I))
DO CASE
CASE UPPER(CmdLine)='DO WHIL' OR UPPER(CmdLine)='IF ' OR UPPER(CmdLine)='FOR ' OR UPPER(CmdLine)='SCAN' ;
OR UPPER(CmdLine)='FUNC' OR UPPER(CmdLine)='PROCED' OR UPPER(CmdLine)='WITH ' OR UPPER(CmdLine)='TRY'
CmdLine1=REPLICATE(CHR(9),TABNO)+CmdLine
TABNO=TABNO+1
CASE UPPER(CmdLine)='DO CASE'
CmdLine1=REPLICATE(CHR(9),TABNO)+UPPER(CmdLine)
TABNO=TABNO+2
CASE UPPER(CmdLine)='ENDD'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDDO'
CASE UPPER(CmdLine)='ENDI'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDIF'
CASE UPPER(CmdLine)='ENDFO' OR UPPER(CmdLine)='NEXT'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDFOR'
CASE UPPER(CmdLine)='ENDS'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDSCAN'
CASE UPPER(CmdLine)='ENDW'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDWITH'
CASE UPPER(CmdLine)='ENDTRY'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDTRY'
CASE UPPER(CmdLine)='ENDFU'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+ 'ENDFUNC'+CHR(13)
CASE UPPER(CmdLine)='ENDP'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDPROC'+CHR(13)
CASE UPPER(CmdLine)='ENDC'
TABNO=MAX(TABNO-2,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDCASE'
OTHERWISE
CmdLine1=REPLICATE(CHR(9),TABNO)+CmdLine
ENDCASE
REPLACE txt1 WITH TXT1+CmdLine1+CHR(13)
ENDFOR
TABNO=0
REPLACE TXT2 WITH ''
FOR i=1 TO MEMLINES(txt1)
CmdLine=MLINE(txt1,i)
CmdLine1=ALLTRIM(CmdLine)
DO while .t.
IF ASC(CmdLine1)=9
CmdLine1=SUBSTR(CmdLine1,2)
ELSE
EXIT
ENDIF
ENDDO
TABNO=MAX(OCCURS(CHR(9),CmdLine),0)
IF UPPER(CmdLine1)='ELSE' OR UPPER(CmdLine1)='CASE ' OR UPPER(CmdLine1)='OTHERW' OR UPPER(CmdLine1)='CATCH' OR UPPER(CmdLine1)='FINALLY'
REPLACE txt2 WITH TXT2+REPLICATE(CHR(9),MAX(0,TABNO-1))+CmdLine1+CHR(13)
ELSE
REPLACE txt2 WITH TXT2+CmdLine+CHR(13)
ENDIF
ENDFOR
IF TABNO<>0 AND 1=MESSAGEBOX('结构语句命令不配对,或书写错误',16,'错误')
ENDIF
_cliptext=txt2
RETURN txt2
*使用方法:将正在编辑的代码全部剪下来,运行下面的程序段,按CTRL+V粘贴到原位置。该程序段有一个小的限制,既自定义过程名的前面不要有结构语句命令保留字。如SCANDIR(),该程序认为是SCAN命令。
*如果经常用的话,可以在启动项目时给系统菜单增加一菜单命令,并设置快捷键,使该命令自动剪切正在编辑的全部代码,并进行处理,然后自动粘贴到原位置。有兴趣的同志不妨试试。
LPARAMETERS Lprg
SET MEMOWIDTH TO 8192
CREATE CURSOR temp_clip(TXT1 M,TXT2 M)
APPEND BLANK
IF PCOUNT()=0
IF TYPE('_CLIPTEXT')='C'
REPLACE txt1 WITH _CLIPTEXT
ELSE
=MESSAGEBOX('请剪切完整的过程文本内容!',48,'提示')
return
ENDIF
ELSE
IF FILE(lprg) AND UPPER(JUSTEXT(lprg))='PRG'
APPEND MEMO txt1 FROM (lprg)
ELSE
=MESSAGEBOX(' 程序文件不存在! ',48,'提示')
return
ENDIF
ENDIF
FOR i=1 TO MEMLINES(txt1)
CmdLine=ALLTRIM(MLINE(txt1,i))&&去掉前后空格
IF ISBLANK(CmdLine) &&去掉空行
LOOP
ENDIF
DO WHILE .t. &&去掉前TAB
IF ASC(CmdLine)=9
CmdLine=SUBSTR(CmdLine,2)
ELSE
EXIT
ENDIF
ENDDO
REPLACE txt2 WITH txt2+CmdLine+CHR(13)
ENDFOR
TABNO=0
REPLACE TXT1 WITH ''
FOR i=1 TO MEMLINES(txt2)
CmdLine=ALLTRIM(MLINE(txt2,I))
DO CASE
CASE UPPER(CmdLine)='DO WHIL' OR UPPER(CmdLine)='IF ' OR UPPER(CmdLine)='FOR ' OR UPPER(CmdLine)='SCAN' ;
OR UPPER(CmdLine)='FUNC' OR UPPER(CmdLine)='PROCED' OR UPPER(CmdLine)='WITH ' OR UPPER(CmdLine)='TRY'
CmdLine1=REPLICATE(CHR(9),TABNO)+CmdLine
TABNO=TABNO+1
CASE UPPER(CmdLine)='DO CASE'
CmdLine1=REPLICATE(CHR(9),TABNO)+UPPER(CmdLine)
TABNO=TABNO+2
CASE UPPER(CmdLine)='ENDD'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDDO'
CASE UPPER(CmdLine)='ENDI'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDIF'
CASE UPPER(CmdLine)='ENDFO' OR UPPER(CmdLine)='NEXT'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDFOR'
CASE UPPER(CmdLine)='ENDS'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDSCAN'
CASE UPPER(CmdLine)='ENDW'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDWITH'
CASE UPPER(CmdLine)='ENDTRY'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDTRY'
CASE UPPER(CmdLine)='ENDFU'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+ 'ENDFUNC'+CHR(13)
CASE UPPER(CmdLine)='ENDP'
TABNO=MAX(TABNO-1,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDPROC'+CHR(13)
CASE UPPER(CmdLine)='ENDC'
TABNO=MAX(TABNO-2,0)
CmdLine1=REPLICATE(CHR(9),TABNO)+'ENDCASE'
OTHERWISE
CmdLine1=REPLICATE(CHR(9),TABNO)+CmdLine
ENDCASE
REPLACE txt1 WITH TXT1+CmdLine1+CHR(13)
ENDFOR
TABNO=0
REPLACE TXT2 WITH ''
FOR i=1 TO MEMLINES(txt1)
CmdLine=MLINE(txt1,i)
CmdLine1=ALLTRIM(CmdLine)
DO while .t.
IF ASC(CmdLine1)=9
CmdLine1=SUBSTR(CmdLine1,2)
ELSE
EXIT
ENDIF
ENDDO
TABNO=MAX(OCCURS(CHR(9),CmdLine),0)
IF UPPER(CmdLine1)='ELSE' OR UPPER(CmdLine1)='CASE ' OR UPPER(CmdLine1)='OTHERW' OR UPPER(CmdLine1)='CATCH' OR UPPER(CmdLine1)='FINALLY'
REPLACE txt2 WITH TXT2+REPLICATE(CHR(9),MAX(0,TABNO-1))+CmdLine1+CHR(13)
ELSE
REPLACE txt2 WITH TXT2+CmdLine+CHR(13)
ENDIF
ENDFOR
IF TABNO<>0 AND 1=MESSAGEBOX('结构语句命令不配对,或书写错误',16,'错误')
ENDIF
_cliptext=txt2
RETURN txt2