找回密码
 立即注册

QQ登录

只需一步,快速开始

lifesky2006

注册会员

11

主题

79

帖子

152

积分

注册会员

积分
152

活字格认证

lifesky2006
注册会员   /  发表于:2014-10-22 10:40  /   查看:13245  /  回复:14
1、在使用SPREAD的时候,希望能自动的分配列宽以适应spread的总宽度,请问怎么自动分配列宽。
2、有时候希望自己来分配列宽,或者平均,或者不平均,但是使用spread.width/n的方式分配成n份宽度是不行的,尤其是当spread带有了滚动条后,这个宽度就更不能用spread.width来分配了。我曾测试过:
     for i=1 to 6
         spread.colwidth(i)=spread.width/6
     next
     证明不行,实际列宽总和超出了spread宽度跑到右边去了
     spread.colwidth(0)=10
     spread.colwidth(1)=30
     for i=2 to 6
        spread.colwidth(i)=(spread.width-40)/4
     next     也不对的
     有了滚动条后,我用数据测试滚动条宽度,有时候-300就够了,有时候要减500
后来经过测试,我发现spread的列宽每次增量是25(也许跟字体有关),进行分配的时候可能除数是小数了或者不在25份内,所以我用
     t=0
     for i=1 to 5
        spread.colwidth(i)=spread.width/6
        t=t+spread.colwidth(i)
     next
     spread.colwidth(6)=spread.width-t
还是不精确,有的时候还是列宽大于总宽度了
而且如果根据spread.width来分配列宽,如果设置了滚动条是自动出现,数据不够的时候隐藏的话,这样分配就更不行了
行高分配也是同理

希望能给出一个好的例子,谢谢

14 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2014-10-22 19:43:00
沙发
回复 1楼lifesky2006的帖子

问题1,
如果是绑定数据源可以通过 DAutoSizeCols  属性来设置列宽自动适应数据源字段:

  1. fpSpread1.DAutoSizeCols = DAutoSizeColsMax
复制代码


问题2、
请问您是希望时所有列宽度和刚好占满Spread 显示宽度吗?
回复 使用道具 举报
lifesky2006
注册会员   /  发表于:2014-10-23 16:38:00
板凳
问题1:
Dautosizecols不能占满SPREAD宽度
问题2:
是的,需要刚好所有列宽占满SPREAD显示宽度,而且当数据少的时候没有滚动条,数据多了有了滚动条也自动调整到占满宽度。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-24 20:16:00
地板
回复 3楼lifesky2006的帖子

spread 取 size 方法 :GetClientArea。
Column 和 Spread 宽度设置单位不同需要转换,方法为:ColWidthToTwips
滚动条宽度方法:ScrollBarWidth

请你先尝试实现,我也会继续跟进调查。
回复 使用道具 举报
lifesky2006
注册会员   /  发表于:2014-10-25 13:43:00
5#
好的谢谢,有空试试
回复 使用道具 举报
lifesky2006
注册会员   /  发表于:2014-10-25 14:13:00
6#
刚才测试了下,如果我想等分6等份,用下面的方法不对,超出了总宽度,鼠标放在最后一列左键点住向右拉动,可以看到右边还是有一点单元格没有显示出来。而如果等分了6份的话向右拖动是拖不动的。
Dim i As Integer
Dim width As Long, height As Long
fpSpread1.MaxCols = 6
fpSpread1.MaxRows = 10
fpSpread1.GetClientArea width, height
For i = 1 To 6
    fpSpread1.ColWidth(i) = (width - fpSpread1.ColWidth(0) - fpSpread1.ScrollBarWidth) / 6
Next
我感觉是/6的时候出现了小数导致的
获取滚动条宽度ScrollBarWidth =-1,没有办法根据滚动条进行设置

而且我用下面的方法,将最后一列的宽度改为总宽度-前5列宽度,也不对。
Dim i As Integer
Dim width As Long, height As Long
fpSpread1.MaxCols = 6
fpSpread1.MaxRows = 10
fpSpread1.GetClientArea width, height
For i = 1 To 5
    fpSpread1.ColWidth(i) = (width - fpSpread1.ColWidth(0) - fpSpread1.ScrollBarWidth) / 6 - 300
Next
fpSpread1.ColWidth(6) = (width - fpSpread1.ColWidth(0) - fpSpread1.ColWidth(1) - fpSpread1.ColWidth(2) - fpSpread1.ColWidth(3) - fpSpread1.ColWidth(4) - fpSpread1.ColWidth(5) - fpSpread1.ScrollBarWidth)

还请测试一下,谢谢!
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-27 19:55:00
7#
回复 6楼lifesky2006的帖子

好的,我会进一步跟进这个问题,有结果反馈给你。
回复 使用道具 举报
lifesky2006
注册会员   /  发表于:2014-10-30 14:36:00
8#
等待中。。。。。。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-30 19:14:00
9#
回复 8楼lifesky2006的帖子

这是我目前调查的进度,先共享给您:

  1. Private Sub Command1_Click()
  2.     fpSpread1.MaxCols = 3
  3.     fpSpread1.UnitType = UnitTypeTwips

  4.     Dim width As Long, height As Long
  5.    
  6.     Dim i As Long
  7.      
  8.     fpSpread1.GetClientArea width, height
  9.     If fpSpread1.BorderStyle = BorderStyleFixedSingle Then
  10.         width = width - (2 * Screen.TwipsPerPixelX)  ' Borders
  11.     End If
  12.     For i = 0 To fpSpread1.RowHeaderCols - 1
  13.         width = width - fpSpread1.ColWidth(i)
  14.         width = width - (1 * Screen.TwipsPerPixelX) ' Gridlines
  15.     Next i
  16.     For i = 1 To fpSpread1.MaxCols
  17.         width = width - (1 * Screen.TwipsPerPixelX) ' Gridlines
  18.     Next i
  19.     width = width - (17 * Screen.TwipsPerPixelX)
  20.    
  21.     For i = 1 To fpSpread1.MaxCols
  22.         fpSpread1.ColWidth(i) = width / fpSpread1.MaxCols
  23.     Next i
  24.    
  25. End Sub
复制代码
回复 使用道具 举报
lifesky2006
注册会员   /  发表于:2014-11-14 17:33:00
10#
非常感谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部