回 帖 发 新 帖 刷新版面

主题:追求窗体显示速度问题

众所周知,
Form窗体(表单)显示的时候,
从小到大,从 .Load - .Init 的过程中执行

会先按照默认或预定义的属性来显示各个窗体控件,
再执行 .init 事件

我现在在窗体的 .init 里有很多 setall( ) 语句,
不可避免的,就会重复执行控件的动作,
重复执行,等于减慢速度,降低效率,
对于新机器当然没什么问题,但旧机器.......等三秒,
足以让一些没耐性的人发急.

问题:
我非得把setall( )分拆开去逐个设置控件的属性?

回复列表 (共14个回复)

沙发

1  在放入控件时,相同控件,先将属性调试好,其他控件用它复制。

2  用变量纪录,哪部分属性已改。

3  将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。

板凳

楼主:
    我提的方法真的不能解决重复设置属性的问题!
    你是一个年轻的编程高手。我回答你的问题,最重要的是为了向你学习。而且对回答问题人的尴尬,你比谁都明白。但是,你为什么不回帖讲明原因,冷漠地加上 10 分就完了。我真百思不得其解。这是为什么???

不会又是:
[quote]
cbl在13楼的方法跟我在QB里用的方法是一样的,
[/quote]

3 楼

呵呵,不好意思,如果我说“我这两天比较忙”的理由不能让你相信的话,我就再没话说了。

不过,恕我直言,也许是您年纪大了,经验倒是十足,灵活慧根欠不足。

另:我无论在网络上抑或生活上,对任何事情都已经不太在乎了,
己所不欲,勿施于人。
反过来说,我不甚过份的要求别人,也希望别人别寄太多的希望在我身上。
否则,我是会否认失望的责任的。

再: 我并不是一个年轻的高手。 一非高手,二非年轻。

又: 有问题要直说。不说我当没问题,呵呵。我喜欢直言,以免误会。

[quote]1  在放入控件时,相同控件,先将属性调试好,其他控件用它复制。[/quote]
这方法对于其他人应该适用,呵呵。
我当然知道这个办法了,懒人总是没有后悔药吃的,
如果要你把你曾经做好的一个大项目从头把代码逐行出来,相信你能做得到,但并不是每个人都有那么好的耐性的。否则我也用不着去 .setall 了
[quote]2  用变量纪录,哪部分属性已改。[/quote]
这个我不懂,没了解过有这样的功能,向你请教。(应该不会是在说调试器吧)
[quote]3  将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。[/quote]
这个我也听得不太明白。就猜一下吧,
我想如果需要这样的一个方法,放在Form.init难道不是最好的办法?
重设置现象倒是不经常出现,现在年纪还轻,
估计乌鸦会经常出现。(呵呵,不忘踩别人一脚)

明显的,你就没听明白我的意思,没了解我的问题。
我说的重复执行,是指控件按照默认或预置的属性刻画后,还得来一次代码的属性设置,从而导致的刷新延时,拖慢程序或窗体显示速度。

长篇大论的解释了一大堆废话,说明我还是在乎的,唉,继续修为。

4 楼

人吗?
活一辈子,学一辈子,不足是永远存在的。知识的欠缺,能力的有限。在我身上体现的更多。

[经验倒是十足,灵活慧根欠不足。]

这句话,倒是我的真实一面。谢谢你了。

    我逐一研究过你的帖子:所以这样评价你,并不是没根据的捧你。你的思路使我学到了很多东西,虽然你年龄比我小一截,但我还是称你是老师。这样取长补短不是很好嘛?你说呢。

    你的年龄不到 40 不年轻吗?但是你别忘了,三个臭皮匠顶个诸葛亮,你可以看不起我这个臭皮匠,但是你千万不能忽略知识的储存与积累,作为一个程序员不能补久原来的缺陷,那还能站稳市场吗?对于回答高手的问题,我能不谨慎吗?
    你藐视了人,但你也失去点东西。
    既然这样我也不多讲了。
    但希望你记住:虚心使人进步,骄傲使人落后,狂妄更不可要。
    不过,今后你还是我的老师,还请你多帮助才好!!!

5 楼

呵呵,你居然能接受批评,恭喜恭喜。至于我,一向狂妄自大,早已自知,谢谢提点。你的经验老到,大家是有目共睹的,不可置疑,我并没有看不起的意思。

6 楼

这样做或许会好一点:

再表单里添加一个命令按钮例如Name为cmdSetall,在其中放所有SetAll等代码,减轻Init负担

在表单的GotFocus代码中:
ThisForm.cmdSetAll.Click()

另外,cmdSetall.Visible=.f.,省得看见它

7 楼

我还是老实一点。
把setall( )分拆开去逐个设置控件的属性好了。

8 楼

[quote]  我还是老实一点。
把setall( )分拆开去逐个设置控件的属性好了。
[/quote]怎么了,有气无力的样子。你能这样做吗?又累又容易出错。
[quote]  
如果要你把你曾经做好的一个大项目从头把代码逐行出来,相信你能做得到,但并不是每个人都有那么好的耐性的。否则我也用不着去 .setall 了
[/quote]喂! 好好看你说过得话。


[quote]3  将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。[/quote]

1 将需修改的属性代码放到一个《XXXXXXXXX》方法中。加上判断修改语句,控制参数。

2 用编辑菜单中的替换功能将所有对象中: 原来的.setall 方法,替换成 《XXXXXXXXX》方法。这叫问题集中处理法。

下面……

9 楼

10 多年前的程序还在使用,系统的更新、命令的变化,常需改动,顺序编程又长又乱,没办法只好用此下策啰,不过效果还可以。

10 楼

我在想,你们都没有明白我的意思.

窗体在绘制的时候,

首先,会按照预定义的属性来绘制控件.
(预定义,是指在编辑窗体过程中设置的属性值,如果没有设置过的,将会执行默认值)
(其实,这个过程也就是在执行类代码)

执行完后,系统知道控件都绘制完了,
再去检查 .init 的代码.

按照VFP伪代码的速度,重复执行设置实在不是一件明智的事情.
就算是.setall( )方法,也只是集合的遍历方法,
只能加快译码速度,并不能加快太多的操作刷新速度,

既然如此,做人要厚道,
.init 只是为了方便对象编程使用存在的,
初始化的设置,还是从控件属性设置中进行较好,
能将这一过程(占不少时间,特别是慢机器)省略.

我来回复

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