lifesky2006 发表于 2014-10-22 10:40:00

关于spread分配列宽和行高的问题

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来分配列宽,如果设置了滚动条是自动出现,数据不够的时候隐藏的话,这样分配就更不行了
行高分配也是同理

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

iceman 发表于 2014-10-22 19:43:00

回复 1楼lifesky2006的帖子

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

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

好的谢谢,有空试试

lifesky2006 发表于 2014-10-25 14:13:00

刚才测试了下,如果我想等分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

回复 6楼lifesky2006的帖子

好的,我会进一步跟进这个问题,有结果反馈给你。

lifesky2006 发表于 2014-10-30 14:36:00

等待中。。。。。。

iceman 发表于 2014-10-30 19:14:00

回复 8楼lifesky2006的帖子

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

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

    Dim width As Long, height As Long
   
    Dim i As Long
   
    fpSpread1.GetClientArea width, height
    If fpSpread1.BorderStyle = BorderStyleFixedSingle Then
      width = width - (2 * Screen.TwipsPerPixelX)' Borders
    End If
    For i = 0 To fpSpread1.RowHeaderCols - 1
      width = width - fpSpread1.ColWidth(i)
      width = width - (1 * Screen.TwipsPerPixelX) ' Gridlines
    Next i
    For i = 1 To fpSpread1.MaxCols
      width = width - (1 * Screen.TwipsPerPixelX) ' Gridlines
    Next i
    width = width - (17 * Screen.TwipsPerPixelX)
   
    For i = 1 To fpSpread1.MaxCols
      fpSpread1.ColWidth(i) = width / fpSpread1.MaxCols
    Next i
   
End Sub

lifesky2006 发表于 2014-11-14 17:33:00

非常感谢
页: [1] 2
查看完整版本: 关于spread分配列宽和行高的问题