回 帖 发 新 帖 刷新版面

主题:[原创]对程序段进行缩进处理源代码.

*在编写程序源代码时,对结构语句的命令行进行缩进处理,可增加代码的可读性。有些编程工具能够自动缩进,但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

回复列表 (共7个回复)

沙发

好帖!
我先顶了!
以后多发点这些东西!
谢谢

板凳

好贴,收藏

3 楼

4 楼

VFP已经为我们提供了这个功能,选择菜单“工具/修饰”即可弹出一对话框,在对话框中可对当前打开的代码片断进行大小写、缩进等设置,点击“运行”按钮即可。

5 楼


顶!在编辑.prg时用右键菜单beautify...,......

6 楼

精神可嘉。
4、5楼正解。

原来是老帖......[em10][em10][em10]

7 楼

[quote]精神可嘉。
4、5楼正解。

原来是老帖......[em10][em10][em10][/quote]

我来回复

您尚未登录,请登录后再回复。点此登录或注册