修改VCL源代码(100分)

  • 主题发起人 主题发起人 Wysywyg
  • 开始时间 开始时间
W

Wysywyg

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我做了一个矢量图的控件,别的功能都行就是在LOAD和CLEAR图形
时较慢.因为我让每个图形对象对应一个TGRAPHICCONTROL继承下来的
对象,当图形对象太多时,创建(Create,SetBounds)、放大(SetBounds)和
清除(Destroy)这些对象就特慢.就其原因,是这三个过程都会调用
Parent.AlignControl. 这样,每增加、删除、改动一个对象就会自动
把所有一生成的对象Align一遍,算法复杂度是O(n^2).
我的这个控件恰好不需要这种Align功能.因此我就改了Controls.Pas,
把RequestAlign等方法注释掉了.并且在使用这个控件的程序中把Project|Options|Search Path置为$(DELPHI)/Source/VCL,
这样每次执行前用Build,把十几万行原码重编.问题就解决了,速度提高20倍.
可问题又来了,我的程序主窗体的很多控件是要Align的,否则就会乱.
有没有两全其美的办法呢?比如,矢量图控件用改后的Controls.Pas,
正常程序用以前的lib/controls.dcu?
万分焦急的盼望各位高人的指点!
 
在不需要用Align时调用图形对象的Parent的DisableAlign禁止Align,
然后调用EnableAlign允许Align。
试一下,如果你的图形对象的Parent是继承自TWinControl的话(例如TForm、
TPanel等等)。
 
呵呵,我前几天刚改了一次Dialogs.pas,改过的它还不让我用,
因为其他的很多控件都要用到Dialogs.pas,然后就说版本不对。
我的解决办法是:把Dialogs.pas另存成MyDialogs.pas,改写
里面的TCommonDialog为TMyCommonDialog,TOpenDialog为
TMyOpenDialog,其他无关的全部删除。把MyDialog.pas放到
我要用的程序中,单独调用。这样,跟原来的也不会冲突。你的
不知能不能这样做。缺点就是不能可视化。不过,那是因为我懒,
呵呵。你如果有时间可以专门为你的图形对象改写一个TYourGraphicControl。

 
多谢二位,其实我也试过写自己的VCL子集,可是从TControl开始改,
简直烦透了,错综复杂.最后放弃了.
我再试试ZRY的方法,但愿能行.
 
DreamTiger: 你的方法恐怕不行,因为control.pas太底层了,什么东西都要用他.
 
//nod,刚看了看200多K,没法改写了。
看了源码,很多地方都是先DisableAlign,然后再ENableAlign的,
所以ZRY的方法应该是可行的。
 
试过了,DisableAlign是可以的.
但这只是解决了一个控件的问题,如果以后
遇到类似情况,却没有相DisableAlign之类的函数,
还是得改代码,而改过的代码最好是只让某一部分程序调用到(比如某个控件),
其他部分仍使用标准VCL代码.我试着作了一下,好像不行,
在安装一个控件或控件包之前,将每个Unit中加入{$IMPLICITBUILD OFF},
再强制Build它,本该可以,但即使把Options|Search Path设为
.../Source/VCL Delphi(5)也不会去编译VCL源码, 而只是直接把
VCL50.DCP连到包里.如果把VCL50.DCP从"Requires"中去掉,
Delphi仍然暗中把它连进来,丝毫不Build Source.
难道只有重写VCL这一条路吗?


 
to Wysywyg:
 >> 试过了,DisableAlign是可以的.但这只是解决了一个控件的问题,
 >> 如果以后遇到类似情况,却没有相DisableAlign之类的函数
 可不可以讲得清楚一些?
 
为什么不重载你控件RequestAlign,让他什么事都不干
 
>为什么不重载你控件RequestAlign,让他什么事都不干
To Energy:
这当然是个好办法,但destroy过程好像不用它,因此清除的时候还会慢.
>可不可以讲得清楚一些?
To: ZRY
例如最简单的,给TControl加个属性.
 
还是不太明白你的意思。
要给TControl加个属性,你自己肯定能做到,但那些继承自TControl的控件肯定
也要重新编译,这是无法避免的,除非你把TControl的代码复制到另一单元中,
改个名字,然后再修改它。不过我想你可以从TWinControl做起。
 
多人接受答案了。
 
后退
顶部