标题:寻求个解决方案
只看楼主
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:15 
第一个问题:显示中文标题
 
若是数据库表,可修改表结构,设置每个字段的 Caption(标题)为中文,如:将 name 的 Caption 设置为“姓名”。然后,设置表格的 ComumnCount = -1 即可在 Grid 中显示中文列标题。
若是自由表,只能通过修改 Header 的 Caption 了。如:将第一列的列标题设置为“姓名”:THISFORM.Grid1.Columns[1].Header1.Cpation = "姓名"
 
第二个问题:锁定姓名列
 
这个比较 Easy,在表单的 Init 事件中输入:THIS.Grid1.LockColumns = 1。注:若 Grid.ColumnCount=-1,则无法在设计环境下直接修改属性 Grid.LockColumn=1
 
第三个问题:单击列标题实现排序
 
这个有点难度。
第一步:准备两张图片,第一张是向上箭头 up.bmp,表示升序,第二张是向下箭头 down.bmp,表示降序。
第二步:新建一个 MyProc.prg,其中定义了一个 Header 类:
程序代码:
DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
                SET ORDER TO &cFldName DESC
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESC && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        GO TOP
        THISFORM.Refresh
        SELECT (nSelect)
    ENDPROC
ENDDEFINE

第三步:在表格的 Init 事件中输入以下代码:
LOCAL oCol,cOldCaption
FOR EACH oCol IN THIS.Columns
    cOldCaption = oCol.Header1.Caption    && 保存原标题
    oCol.RemoveObject('Header1')          && 移除原 Header
    oCol.NewObject('Header1','MyHeader','myproc.prg')    && 添加新 Header
    oCol.Header1.Caption = cOldCaption    && 恢复原标题
NEXT


[此贴子已经被作者于2016-3-11 14:55编辑过]


泉城飞狐
2016-03-11 14:28
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
上面实现排序的代码是通过为表建立结构化索引来实现的,因此,要求以独占方式打开表。为了提高效率,若已按字段建立了索引,则直接激活索引,否则新建索引。

若表以共享方式打开,则可修改代码,将结构化索引更改为独立复合索引即可。如:index on &cFldName tag (cFldName) of tmp.cdx

泉城飞狐
2016-03-11 14:49
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
以下是引用baichuan在2016-3-11 08:21:07的发言:




为什么啊?我没调整哪个参数啊,怎么都凑到一起去了呢?



谁能帮帮我啊,我发现新建一个表格都是好好的,只要修改了font size 就凑到一起了!为什么呢?

怎么能设定每一个column的宽度呢?

这个问题搞明白了,可以设置宽度的!setall

[此贴子已经被作者于2016-3-14 15:35编辑过]


2016-03-14 11:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 23楼 baichuan
将你的东东打包放上来吧
2016-03-14 11:20
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
以下是引用liuxingang28在2016-3-11 14:28:43的发言:

第一个问题:显示中文标题
 
若是数据库表,可修改表结构,设置每个字段的 Caption(标题)为中文,如:将 name 的 Caption 设置为“姓名”。然后,设置表格的 ComumnCount = -1 即可在 Grid 中显示中文列标题。
若是自由表,只能通过修改 Header 的 Caption 了。如:将第一列的列标题设置为“姓名”:THISFORM.Grid1.Columns[1].Header1.Cpation = "姓名"
 
第二个问题:锁定姓名列
 
这个比较 Easy,在表单的 Init 事件中输入:THIS.Grid1.LockColumns = 1。注:若 Grid.ColumnCount=-1,则无法在设计环境下直接修改属性 Grid.LockColumn=1
 
第三个问题:单击列标题实现排序
 
这个有点难度。
第一步:准备两张图片,第一张是向上箭头 up.bmp,表示升序,第二张是向下箭头 down.bmp,表示降序。
第二步:新建一个 MyProc.prg,其中定义了一个 Header 类:DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
                SET ORDER TO &cFldName DESC
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESC && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        GO TOP
        THISFORM.Refresh
        SELECT (nSelect)
    ENDPROC
ENDDEFINE
第三步:在表格的 Init 事件中输入以下代码:
LOCAL oCol,cOldCaption
FOR EACH oCol IN THIS.Columns
    cOldCaption = oCol.Header1.Caption    && 保存原标题
    oCol.RemoveObject('Header1')          && 移除原 Header
    oCol.NewObject('Header1','MyHeader','myproc.prg')    && 添加新 Header
    oCol.Header1.Caption = cOldCaption    && 恢复原标题
NEXT


请问:代码中引入的up down 两张BMP文件怎么使用啊?

2016-03-14 11:20
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
以下是引用liuxingang28在2016-3-11 14:28:43的发言:

第一个问题:显示中文标题
 
若是数据库表,可修改表结构,设置每个字段的 Caption(标题)为中文,如:将 name 的 Caption 设置为“姓名”。然后,设置表格的 ComumnCount = -1 即可在 Grid 中显示中文列标题。
若是自由表,只能通过修改 Header 的 Caption 了。如:将第一列的列标题设置为“姓名”:THISFORM.Grid1.Columns[1].Header1.Cpation = "姓名"
 
第二个问题:锁定姓名列
 
这个比较 Easy,在表单的 Init 事件中输入:THIS.Grid1.LockColumns = 1。注:若 Grid.ColumnCount=-1,则无法在设计环境下直接修改属性 Grid.LockColumn=1
 
第三个问题:单击列标题实现排序
 
这个有点难度。
第一步:准备两张图片,第一张是向上箭头 up.bmp,表示升序,第二张是向下箭头 down.bmp,表示降序。
第二步:新建一个 MyProc.prg,其中定义了一个 Header 类:DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
                SET ORDER TO &cFldName DESC
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESC && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        GO TOP
        THISFORM.Refresh
        SELECT (nSelect)
    ENDPROC
ENDDEFINE
第三步:在表格的 Init 事件中输入以下代码:
LOCAL oCol,cOldCaption
FOR EACH oCol IN THIS.Columns
    cOldCaption = oCol.Header1.Caption    && 保存原标题
    oCol.RemoveObject('Header1')          && 移除原 Header
    oCol.NewObject('Header1','MyHeader','myproc.prg')    && 添加新 Header
    oCol.Header1.Caption = cOldCaption    && 恢复原标题
NEXT


请教:这样进行点head排序了,可是问题又来了,就是点滚动条拖出来的那些列排序的时候,一刷新就回到初始画面了,能否保持在拖滚动条那里呢?不知道我说的是否明白!

2016-03-14 15:34
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
回复 25楼 baichuan
up.bmp 和 down.bmp 两张图片用于表示升序和降序。Header控件有一个 Picture 属性,可将图片文件名赋于该属性,则在标题文字的前边显示该图片。

在我提供的代码中,第一次单击一个标题时,按升序排列,再次单击该标题则是降序,第三次单击则恢复物理顺序。

因为每个Column都有Header,挨个修改每个 Header1.CLick 太麻烦,而且当列数不确定时,无法在设计时指定 Header.Click 代码。因此,我采用了类。

在VFP 9下,也可以不采用类,直接为表单添加一个自定义方法,如:HeaderClick,将排序的代码放入该方法中,然后再在Form.Init 或 Grid.Init 中使用 BindEvent()将每列的 Header1.Click 绑定到 Form.HeaderClick。

泉城飞狐
2016-03-14 15:41
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
回复 26楼 baichuan
还是没听明白,请再详细描述一下,最好能示例一下

泉城飞狐
2016-03-14 15:45
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
以下是引用liuxingang28在2016-3-14 15:45:08的发言:

还是没听明白,请再详细描述一下,最好能示例一下


我新开了个贴,谢谢!

2016-03-14 16:03
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
以下是引用liuxingang28在2016-3-14 15:41:59的发言:

up.bmp 和 down.bmp 两张图片用于表示升序和降序。Header控件有一个 Picture 属性,可将图片文件名赋于该属性,则在标题文字的前边显示该图片。

在我提供的代码中,第一次单击一个标题时,按升序排列,再次单击该标题则是降序,第三次单击则恢复物理顺序。

因为每个Column都有Header,挨个修改每个 Header1.CLick 太麻烦,而且当列数不确定时,无法在设计时指定 Header.Click 代码。因此,我采用了类。

在VFP 9下,也可以不采用类,直接为表单添加一个自定义方法,如:HeaderClick,将排序的代码放入该方法中,然后再在Form.Init 或 Grid.Init 中使用 BindEvent()将每列的 Header1.Click 绑定到 Form.HeaderClick。



我试验了下,只有一种排序啊,再点没有反应了!
两张图片,怎么给header赋值呢?

2016-03-14 16:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-462325-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.217718 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved