Delphi一个烦人的问题:修改 VCL 源代码 编译 错误 was compiled with a different version of(0分)

K

Kingron

Unregistered / Unconfirmed
GUEST, unregistred user!
假设我们修改了TMenuItem的定义,添加了一个FTest:integer,这个时候你编译就会出现什么
Unit controls was compiled with a different version of menus.....
必须编译整个VCL才能解决问题,好烦人,不知道Borland公司为什么要这么做?
 
说明一下,如果不添加什么变量或者方法,只是修改某个过程,那么不会出现错误哦。
 
原来没分,来错了地方
 
类的长度改变了!
你最好用派生的方法改变如果有必要的话。
 
呵呵,放心~~~~~~~`,该给分的问题我都会给的,即使这个题目没有分数,我看讨论的情况
也会给分的,不相信?可以看看我的信息~~~~~~~~~~~~
 
To NoSwing:
类的长度改变,难道其他的类包含了这个类的信息吗?
不是说封装吗?即使我修改了我这个类,难道还要修改别的地方吗?本来封装就是为了
代码无关性的。
 
我想这是因为TMenuItem类型 的信息和Dephi 的IDE有关,不知道对不对,让我试一试。
 
这段代码在 Controls单元里 这说明 在Controls单元里用到了Menus 单元的编译时信息。
在类里增加一个变量会改变整个类的结构包括调用方法的入口偏移地址,我想问题应该出在这里了。
procedure TControl.SetPopupMenu(Value: TPopupMenu);
begin
FPopupMenu := Value;
if Value <> nil then
begin
Value.ParentBiDiModeChanged(Self);
Value.FreeNotification(Self);
end;
如果有什么新的发现请告诉我,谢谢。
end;
 
仅供参考,:我认为:改变了代码后,其他的包或者什么别的东西调用了相关的vcl,
又可能它的调用同样是用地址的方式调用的,如果你没有重新编译vcl当然会出错了
 
类成员虚函数调用要查函数表,修改了以后可能找不到或者找错了。
成员变量是从类实例地址向后顺序排列的,汇编语言里的寻址偏移量早就写好了,修改以后
也会出问题。
 
问题的原因正如陈晨所说。
Borland是不希望用户修改其源码的。
如果一个单元的接口部分有任何变更,引用该单元的所有单元都必须重新编译,基本上
等于要编译整个VCL,而VCL并没有提供全部源代码,所以,在多数情况下是无法修改VCL
接口的。
 
可能是楼上各位所说的原因,我也这么想,但是Borland这个地方不太好啊。:(。
不知道有没有什么别的方法,可以更改而不要Build All VCL?这个地方好烦人,我想修改
VCL底层代码,当时碰到这个问题真的是气愤~~~~~~~~~~~~,只能修改函数的代码,不能修改接口和
添加变量等~~~~~~~~~
 
>>Borland是不希望用户修改其源码的。
希望又怎么样?自己看一看编译相关的资料,技术上实现得了吗?

to Kingron,
如果你需要新的特性,直接派生子类就行了呀。为什么必须修改 vcl?
 
MikeDeakIns:
好久不见!我知道派生和继承,但是有的时候总是没有直接修改VCL来的痛快和有效。修改VCL所有的都
会影响,不需要其他的什么东西了。而且我想,多了解VCL,多修改VCL总是有好处吧?[:(]
 
Kingron 老兄,确实好久不见了。
我使用 delphi 1.0 的时候曾经试图修改 vcl 的 menus.pas,为了给 TMenuItem 增加
左边的图像,结果就像老兄一样失败了 [:(] vcl 设计的时候就没打算让别人来修改。
 
其实我是想修改Menus.pas,生成OICQ那样的3D效果。不过已经可以做到了。:)
选择的菜单项是3D的。当然我只是举一个例子,我要修改的VCL单元很多!:)
 
修改源程序的需求是确实存在的。
例如,在应用程序中调用了某个方法,这个方法实现的应用需要的功能,但是有一点点不尽
如意,而我们调用的这个方法又调用了别的方法,别的又调了别的...,最后发现这一点不
如意是在一个静态方法中实现的...真TNND!
写构件或底层模块的朋友应该常常遇到这种问题,就会与在下有同感吧:
{ *** 我对Borland的一大堆私有变量和静态方法深恶痛绝 !!!}
 
不是这些原因,问题在于你修改了一个单元的interface部分,在DELPHI中,
如果你修改了一个单元的interface部分,那么,所有引用到了该单元的单元
都必须重新编译。如果你只是修改了implementation部分,那么只需要重新
编译该单元就好了。你可以试试自己写的单元,也是一样的,并不是VCL会这
样。
implementation部分里是实现的细节,而interface部分是外部接口,必须这
样的原因或者为什么要这样,自己仔细想一想就明白了。
 
TO 京工之鸟:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=641588
请笑纳~~~~~~~~~~~~~[:)]
 
顶部