Seasky~(300分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
本来该是那里的50+您要的200,可是...
 
是不是画了一个CJ图标, 另外奖励100 呀 :)).
发了!! :))
 
太多吗?好,问题来了:
1、在VB中,VISIBLE的初始一直为TRUE,我不但在CREATE里加了VISIBLE:
=FALSE,在LOADED里也加了,都没用;
2、我用这个构件做基本部分,然后自己加入实现部分,构架都是用TYPE LIB EDITOR自动完成的:
private
fDescription:String;
....
...set_description
begin
description := fdescription;
end;

...get_description
begin
result := fdescription
end;
但是,在VB中设置属性正常,一运行程序,属性全部恢复默认,关闭程序,在编辑器中的属性也全部恢复默认。我晕
 
收到信了
sorry
set....
begin
fdescription := value;
end;
原来程序就是如此。
不过我用TYPE LIB EDITOR也不该这样呀?
 
问题基本解决
我自己的构件继承了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;
...
 
你肯定上了Default指示字的当了。
> property Test:boolean read Get_Test write Set_Test default true;
Default 指示并不在Object Inspector窗口中为属性设置缺省值, 他只是
决定当属性存入DFM文件时, 属性值是否要存储。

例如 property OneInt integer ....... Default 3
当把这个Int属性值 n 存到一个DFM文件中, 对比 3 和 n 如果n= 3则
不存储该值, 如果 n <> 3 ,则存储。

如果没有一个明确的指示字, 则delphi 总是存储该值的。
明白了吗? 你不用ActiveX , 直接在Delphi 中拿Component 试一下 就
知道了。
要想用正真的缺省值, 在Create过程中赋值吧!!!
我也是刚发现的, 原来和你理解的是一样的, 我在用Component 做实验的
时候才发现Default没用, 它对编程没有用, 只是节省资源用的。
具体其他问题 , 你试过了再说。 我晚上给你的eMail , 你也因该收到了。
 
后退
顶部