回 帖 发 新 帖 刷新版面

主题:看来很简单,结果搞不懂的小程序。

Private Sub Form_Load()
Timer1.Interval = 100
Text1.FontSize = 9
End Sub

Private Sub Timer1_Timer()
If Text1.FontSize = 50 Then Timer1.Enabled = False
Text1.FontSize = Text1.FontSize + 1
End Sub
  请问 Text1.FontSize = 50 能成立吗? 为什么?别告诉我改成Text1.FontSize >= 50 这个我知道,我就想知道为啥fontsize不能得50

回复列表 (共20个回复)

沙发

谁说不能=50?最大可以=72!

这段代码是把文本框中的字逐渐放大,编程者只打算放大到50时就停止,并不是因为不能放大到50以上。

板凳

我没说清楚我的意思,我想让timer控件在字体为文本框字号为50的时候停下来,但是实际上不行,72行的难道是因为字体里面有72磅就能达到72吗?

3 楼

Timer1_Timer过程中增加一句:

Debug.Print Text1.FontSize

你在立即窗口可以看到变化结果,就知道该怎么做了。

我原先一直认为最大字号是72,刚才一试验,才知道windows具有自动放大的能力,我输入了Text1.FontSize =1700,屏幕都已经显示不下了,也没有出错,令我大开眼界!说起来还要谢谢你,让我做了这么次试验,又长了知识了!


4 楼

多动手才能增长见识。

5 楼

聪明一袋烟,呵呵呵,是很聪明啊,呵呵呵,既然你知道“改成Text1.FontSize >= 50 ”,怎么就不知道为啥呢?难道当初老师让这样写的时候,没有说为啥?呵呵呵

6 楼

为什么不能仅仅用等于50来判断:

因为这个定时器调用的程序执行的时间可能超过了定时器的执行间隔。

打个比方,A事件消耗5秒,而定时器每4秒中触发一次A事件,会出现什么?代码重入!


在单片机中,代码重入直接可以导致程序编译不通过,而VB中虽然不会导致不通过,但是程序的实时性值得担忧。


回归正题:

你这里对字号每次加一,我就有几个疑问:

1、字号自身是不是可能有规定,可能不是线性的。比如你赋值3,它自动修改成3.75.

2、字号的赋值,到字号的值改变的过程耗时会不会长于定时器的间隔


如果两次执行字号加一的时候,字号都还没有加一,则判断条件失效。


举个好理解的例子:

你如果吃好了,或者吃多了就停下来。

如果我说,如果你恰好吃饱了,才能停下来,麻烦就大了!

7 楼

小孙,不是这样的。

字号没有50这个等级。我们来试验一下。

将楼主的代码改为:


Private Sub Form_Load()
    Timer1.Interval = 100
    Text1.FontSize = 40
End Sub

 Private Sub Timer1_Timer()
    If Text1.FontSize > 60 Then Timer1.Enabled = False
    Text1.FontSize = Text1.FontSize + 1
    Debug.Print Text1.FontSize
 End Sub

我们可以得到以下结果:

 41.4
 42.6
 43.8
 45
 46.2
 47.4
 48.6
 49.8
 51
 52.2
 53.4
 54.6
 55.8
 57
 58.2
 59.4
 60.6
 61.8

可以看到fontsize是直接从49.8跳到51的,而没有50这个规格。

我们平时自己设置的字号,都会自动被更改到一个就近的规格上,并不报错。导致很多人认为,字号想要什么便是什么。实际上字号的最小单位是0.6,只有0.6的整数倍的字号才是真的。

8 楼

最小单位是0.6,只有0.6的整数倍的字号才是真的。
我又长了知识,谢谢老大

9 楼

再问老大:关于0.6的问题是适用整个windows,还是仅适用VB?

10 楼

不知道,我在vb里面实验出来的。

步长使用0.1、0.2都不会增长;使用0.3增长一次就不再增长;0.4、0.5、0.7、0.8都按照0.6增长;0.6每次都正常增长;0.9部分按照0.6增长部分照1.2增长。

我来回复

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