关于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来分配列宽,如果设置了滚动条是自动出现,数据不够的时候隐藏的话,这样分配就更不行了
行高分配也是同理
希望能给出一个好的例子,谢谢 回复 1楼lifesky2006的帖子
问题1,
如果是绑定数据源可以通过 DAutoSizeCols属性来设置列宽自动适应数据源字段:
fpSpread1.DAutoSizeCols = DAutoSizeColsMax
问题2、
请问您是希望时所有列宽度和刚好占满Spread 显示宽度吗? 问题1:
Dautosizecols不能占满SPREAD宽度
问题2:
是的,需要刚好所有列宽占满SPREAD显示宽度,而且当数据少的时候没有滚动条,数据多了有了滚动条也自动调整到占满宽度。 回复 3楼lifesky2006的帖子
spread 取 size 方法 :GetClientArea。
Column 和 Spread 宽度设置单位不同需要转换,方法为:ColWidthToTwips
滚动条宽度方法:ScrollBarWidth
请你先尝试实现,我也会继续跟进调查。 好的谢谢,有空试试 刚才测试了下,如果我想等分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)
还请测试一下,谢谢! 回复 6楼lifesky2006的帖子
好的,我会进一步跟进这个问题,有结果反馈给你。 等待中。。。。。。 回复 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
非常感谢
页:
[1]
2