问题基本解决
我自己的构件继承了TCustomControl,然后用其生成一个 ActiveX 构件,希望能
在 Microsoft Visual Basic 6.0 中使用之,但发生异状。后做测试构件,具体
构件代码如下:
unit Test;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TTest = class(TCustomControl)
private
{ Private declarations }
fTestBool: Boolean;
function Get_Test:Boolean;
procedure Set_Test(Value:Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property Test:boolean read Get_Test write Set_Test default true;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TTest]);
end;
function TTest.Get_Test:Boolean;
begin
Get_Test := fTestBool;
//faint! change to this:Result := true;
end;
procedure TTest.Set_Test(Value:Boolean);
begin
fTestBool := Value;
//the following is for debug use
if Value then
Showmessage('Set to true')
else
Showmessage('Set to false');
end;
end.
此构件在 Delphi 下使用无异,但生成 ActiveX 后在 VB 中发生了奇怪的事情:
无论我如何设置 Test 属性,每当程序运行时,其自动设置为 false,如果是
String 类型,则自动设置为''。所以在 Set 方法中做了手脚,发现,我手工设
置 test 时,均显示了调试信息,但是,程序启动后,检查 test z值,已经为
false 但无任何调试信息提示(无只是简单的用了个按钮+label)!做进一步调
查,步骤如下:
1、打开 VB 工程,在打开窗体时有调试信息;有调试信息“set to false‘
//这里没错,如果保存工程为true那么就是有调试信息“set to true"
2、设置属性 test = true 有调试信息;有调试信息“set to truee‘
3、首次运行,有调试信息“set to false‘
4、用代码改变属性,有调试信息;有调试信息“set to true‘
5、首次运行结束,有调试信息“set to false‘
6、以后改变属性,有调试信息;有调试信息“set to true/false‘
7、以后运行,无任何调试信息,但属性依然改变!
不确定因素???晕!
8、试了 Type Libary Editor 中 flag 页所有可能,无用!
9、我又晕,干脆改变了Get_Test过程(见注释),无法修改属性为false,虽有
Set to false出现,显然每次VB都是通过此方法获得该属性的。
10、依葫芦画瓢,把GET改回来,改了SET,结果正常一样无法改变属性,
11、把 default 改为 false ,好了???而且,该显示调试信息的地方都显示。
12、删除 DEFAULT,好的
13、改回来,又坏
问:到底是 VB 乱改属性呢,还是 Delphi 没有好好保持状态呢,还是 Delphi 的
所谓双重接口出了问题呢,还是我笨呢?我希望是我笨
另外:为什么不能直接在xxximp.pas直接实现属性编辑?即天家属性?它们不会被
保留,永远是初始值,我在TYPE LIB EDITOR中加了R/W属性TESTO,编写代码如下:
private
{ Private declarations }
FDelphiControl: TTest;
FEvents: ITestXEvents;
fTestO:Boolean;
...
protected
...
function Get_TestO: WordBool;
safecall;
procedure Set_TestO(Value: WordBool);
safecall;
end;
...
function TTestX.Get_TestO: WordBool;
begin
Result := fTestO;
end;
procedure TTestX.Set_TestO(Value: WordBool);
begin
fTestO := Value;
end;
...