为什么写方法不执行(可能与 Assign及:=有关) ( 积分: 50 )

  • 主题发起人 主题发起人 方竹
  • 开始时间 开始时间

方竹

Unregistered / Unconfirmed
GUEST, unregistred user!
本人写一个SQL分析器,其中有一属性:
type
TSqlAnalyzer = class(TComponent)
private
FStringsSQL:TStrings;
Procedure SetStringsSQL(Value:TStrings);
published
property SQLs:TStrings read FStringsSQL write SetStringsSQL;
.......
Procedure TSqlAnalyzer.SetStringsSQL(Value: TStrings);
begin
FStringsSQL.Assign(Value);
FSQL:=Trim(StringsToString(Chr($20),Value));
AnalyzeSQL;
end;

当我安装组件,并在Form1中用如下代码测试:
procedure TForm1.Button1Click(Sender: TObject);
begin
SqlAnalyzer1.SQLs.Assign(ADOQuery1.SQL);//????????
end;
发现并没有执行TSqlAnalyzer.SetStringsSQL中的代码;
当我改成:
SqlAnalyzer1.SQLs:=ADOQuery1.SQL;//!!!!!!!!!
就会执行TSqlAnalyzer.SetStringsSQL中的代码;
请问各位大虾,这是为什么,怎样才能让它无论如都执行SetStringsSQL这一写方法(因为用户有可能用Assign,也可能用:=)?
 
本人写一个SQL分析器,其中有一属性:
type
TSqlAnalyzer = class(TComponent)
private
FStringsSQL:TStrings;
Procedure SetStringsSQL(Value:TStrings);
published
property SQLs:TStrings read FStringsSQL write SetStringsSQL;
.......
Procedure TSqlAnalyzer.SetStringsSQL(Value: TStrings);
begin
FStringsSQL.Assign(Value);
FSQL:=Trim(StringsToString(Chr($20),Value));
AnalyzeSQL;
end;

当我安装组件,并在Form1中用如下代码测试:
procedure TForm1.Button1Click(Sender: TObject);
begin
SqlAnalyzer1.SQLs.Assign(ADOQuery1.SQL);//????????
end;
发现并没有执行TSqlAnalyzer.SetStringsSQL中的代码;
当我改成:
SqlAnalyzer1.SQLs:=ADOQuery1.SQL;//!!!!!!!!!
就会执行TSqlAnalyzer.SetStringsSQL中的代码;
请问各位大虾,这是为什么,怎样才能让它无论如都执行SetStringsSQL这一写方法(因为用户有可能用Assign,也可能用:=)?
 
--SqlAnalyzer1.SQLs.Assign(ADOQuery1.SQL);//????????

此处调用TStrings的assign方法

====================================================
--SqlAnalyzer1.SQLs:=ADOQuery1.SQL

此处调用你自己定义的SetStringsSQL方法

-----------------------------------------------------
--无论如都执行SetStringsSQL

你自己从TStrings那里继承一个类,自己重载它的Assign方法
 
先谢谢dawnsong的解答,但还是有疑问:
----------------
--SqlAnalyzer1.SQLs.Assign(ADOQuery1.SQL);//????????
此处调用TStrings的assign方法
------------------------
但按我的理解,最终属性SQLs会被赋值,[blue]那么其对应的的写方法就应被调用[/blue],但实际不是这样的.因此,能不能解释一下[brown]属性的读写过程及原理[/brown](见笑了,刚开始学写组件)?
谢谢!
 
但按我的理解,最终属性SQLs会被赋值,那么其对应的的写方法就应被调用,但实际不是这样的.因此,能不能解释一下属性的读写过程及原理(见笑了,刚开始学写组件)?
谢谢!
----------------------------------------------
你的理解是错误的
SqlAnalyzer1.SQLs.Assign(ADOQuery1.SQL);//
先返回了一个临时指针(指向了SqlAnalyzer1的FStringsSQL字段),然后根据属性
类型调用相应的Assign方法,只有:= 才被编译器理解为对写访问器的调用。
 
谢谢xeen;
补充两句,说说我的理解:
先返回了一个临时指针(指向了SqlAnalyzer1的FStringsSQL字段),然后根据属性
类型调用相应的Assign方法-->相当于直接修改了私有字段FStringsSQL(间接修改了属性SQLs-->读取属性SQLs的时候,由于read FStringsSQL,所以可以取到新的SQLs属性 )
 
后退
顶部