主题:追求窗体显示速度问题
moz
[专家分:37620] 发布于 2007-06-09 08:09:00
众所周知,
Form窗体(表单)显示的时候,
从小到大,从 .Load - .Init 的过程中执行
会先按照默认或预定义的属性来显示各个窗体控件,
再执行 .init 事件
我现在在窗体的 .init 里有很多 setall( ) 语句,
不可避免的,就会重复执行控件的动作,
重复执行,等于减慢速度,降低效率,
对于新机器当然没什么问题,但旧机器.......等三秒,
足以让一些没耐性的人发急.
问题:
我非得把setall( )分拆开去逐个设置控件的属性?
回复列表 (共14个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-06-09 19:38:00
1 在放入控件时,相同控件,先将属性调试好,其他控件用它复制。
2 用变量纪录,哪部分属性已改。
3 将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。
板凳
cbl518 [专家分:57140] 发布于 2007-06-10 05:16:00
楼主:
我提的方法真的不能解决重复设置属性的问题!
你是一个年轻的编程高手。我回答你的问题,最重要的是为了向你学习。而且对回答问题人的尴尬,你比谁都明白。但是,你为什么不回帖讲明原因,冷漠地加上 10 分就完了。我真百思不得其解。这是为什么???
不会又是:
[quote]
cbl在13楼的方法跟我在QB里用的方法是一样的,
[/quote]
3 楼
moz [专家分:37620] 发布于 2007-06-10 21:39:00
呵呵,不好意思,如果我说“我这两天比较忙”的理由不能让你相信的话,我就再没话说了。
不过,恕我直言,也许是您年纪大了,经验倒是十足,灵活慧根欠不足。
另:我无论在网络上抑或生活上,对任何事情都已经不太在乎了,
己所不欲,勿施于人。
反过来说,我不甚过份的要求别人,也希望别人别寄太多的希望在我身上。
否则,我是会否认失望的责任的。
再: 我并不是一个年轻的高手。 一非高手,二非年轻。
又: 有问题要直说。不说我当没问题,呵呵。我喜欢直言,以免误会。
[quote]1 在放入控件时,相同控件,先将属性调试好,其他控件用它复制。[/quote]
这方法对于其他人应该适用,呵呵。
我当然知道这个办法了,懒人总是没有后悔药吃的,
如果要你把你曾经做好的一个大项目从头把代码逐行出来,相信你能做得到,但并不是每个人都有那么好的耐性的。否则我也用不着去 .setall 了
[quote]2 用变量纪录,哪部分属性已改。[/quote]
这个我不懂,没了解过有这样的功能,向你请教。(应该不会是在说调试器吧)
[quote]3 将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。[/quote]
这个我也听得不太明白。就猜一下吧,
我想如果需要这样的一个方法,放在Form.init难道不是最好的办法?
重设置现象倒是不经常出现,现在年纪还轻,
估计乌鸦会经常出现。(呵呵,不忘踩别人一脚)
明显的,你就没听明白我的意思,没了解我的问题。
我说的重复执行,是指控件按照默认或预置的属性刻画后,还得来一次代码的属性设置,从而导致的刷新延时,拖慢程序或窗体显示速度。
长篇大论的解释了一大堆废话,说明我还是在乎的,唉,继续修为。
4 楼
cbl518 [专家分:57140] 发布于 2007-06-11 01:35:00
人吗?
活一辈子,学一辈子,不足是永远存在的。知识的欠缺,能力的有限。在我身上体现的更多。
[经验倒是十足,灵活慧根欠不足。]
这句话,倒是我的真实一面。谢谢你了。
我逐一研究过你的帖子:所以这样评价你,并不是没根据的捧你。你的思路使我学到了很多东西,虽然你年龄比我小一截,但我还是称你是老师。这样取长补短不是很好嘛?你说呢。
你的年龄不到 40 不年轻吗?但是你别忘了,三个臭皮匠顶个诸葛亮,你可以看不起我这个臭皮匠,但是你千万不能忽略知识的储存与积累,作为一个程序员不能补久原来的缺陷,那还能站稳市场吗?对于回答高手的问题,我能不谨慎吗?
你藐视了人,但你也失去点东西。
既然这样我也不多讲了。
但希望你记住:虚心使人进步,骄傲使人落后,狂妄更不可要。
不过,今后你还是我的老师,还请你多帮助才好!!!
5 楼
moz [专家分:37620] 发布于 2007-06-11 09:39:00
呵呵,你居然能接受批评,恭喜恭喜。至于我,一向狂妄自大,早已自知,谢谢提点。你的经验老到,大家是有目共睹的,不可置疑,我并没有看不起的意思。
6 楼
djGong2002 [专家分:5750] 发布于 2007-06-11 17:01:00
这样做或许会好一点:
再表单里添加一个命令按钮例如Name为cmdSetall,在其中放所有SetAll等代码,减轻Init负担
在表单的GotFocus代码中:
ThisForm.cmdSetAll.Click()
另外,cmdSetall.Visible=.f.,省得看见它
7 楼
moz [专家分:37620] 发布于 2007-06-11 20:52:00
我还是老实一点。
把setall( )分拆开去逐个设置控件的属性好了。
8 楼
cbl518 [专家分:57140] 发布于 2007-06-12 05:03:00
[quote] 我还是老实一点。
把setall( )分拆开去逐个设置控件的属性好了。
[/quote]怎么了,有气无力的样子。你能这样做吗?又累又容易出错。
[quote]
如果要你把你曾经做好的一个大项目从头把代码逐行出来,相信你能做得到,但并不是每个人都有那么好的耐性的。否则我也用不着去 .setall 了
[/quote]喂! 好好看你说过得话。
[quote]3 将需修改的代码放到一个方法中,所有 INIT 设参数控制执行该代码。设计时即可发现重设置的现象。[/quote]
1 将需修改的属性代码放到一个《XXXXXXXXX》方法中。加上判断修改语句,控制参数。
2 用编辑菜单中的替换功能将所有对象中: 原来的.setall 方法,替换成 《XXXXXXXXX》方法。这叫问题集中处理法。
下面……
9 楼
cbl518 [专家分:57140] 发布于 2007-06-12 05:17:00
10 多年前的程序还在使用,系统的更新、命令的变化,常需改动,顺序编程又长又乱,没办法只好用此下策啰,不过效果还可以。
10 楼
moz [专家分:37620] 发布于 2007-06-12 08:58:00
我在想,你们都没有明白我的意思.
窗体在绘制的时候,
首先,会按照预定义的属性来绘制控件.
(预定义,是指在编辑窗体过程中设置的属性值,如果没有设置过的,将会执行默认值)
(其实,这个过程也就是在执行类代码)
执行完后,系统知道控件都绘制完了,
再去检查 .init 的代码.
按照VFP伪代码的速度,重复执行设置实在不是一件明智的事情.
就算是.setall( )方法,也只是集合的遍历方法,
只能加快译码速度,并不能加快太多的操作刷新速度,
既然如此,做人要厚道,
.init 只是为了方便对象编程使用存在的,
初始化的设置,还是从控件属性设置中进行较好,
能将这一过程(占不少时间,特别是慢机器)省略.
我来回复