我只有洗耳恭听了!各位,请进! (50分)

  • 主题发起人 主题发起人 本公子
  • 开始时间 开始时间

本公子

Unregistered / Unconfirmed
GUEST, unregistred user!
看了看COM+的一些东东,才发现竟然还可以这样写的:
with DM,ADOQuery1 do //此处是“,”而非“.”
begin
end;
而我平时那个只是这样写
with DM.ADOQuery1 do //此处是“.”
begin
end;
当我第一次看到时我真的很惊讶很惊讶。
尝试编译一下,无误通过。
唉,这个这个这个真是太奇妙了,而我以前竟然不知道,惭愧!

有请各位给讲讲这个“,”的来历以及它和“.”的区别和联系,为什么这样用?独特嘛。
洗耳恭听!
-------
此外,在COM+的程序中的
with DM,ADOQuery1 do
begin
end;
模块中用到了 MtsRdm 单元中的 SetComplete 和 SetAbort,
假如此时我将“with DM,ADOQuery1 do” 改为“with DM.ADOQuery1 do”,则编译不通过。

这有何关系?? 盼各位讲解。
 
看Op的语法不就知道了?[:D]
 
逗号表示并列
with DM,ADOQuery1 do
实际上等于
with DM do begin
with ADOQuery1 do begin
......
Delphi真的是太强了,不过据说with DM,ADOQuery1 do 会浪费一点时间
 
实际上在运行机理方面有没有什么区别呢?
 
有,使用逗号时,delphi要花费更多的时间去匹配结构,比如
with DM,ADOQuery1 do
它就要去匹配如下4项
DM, ADOQuery, DM.ADOQuery, ADOQuery.DM
然后找到最接近的去赋值
 
那么这就是说这个
with DM,ADOQuery1 do
和 with DM.ADOQuery1 do 表示的意义不一样了??

我知道某个对象实例可以通过“.”操作访问其属性和方法,如Label.Left、ADOQuery.SaveToFile();
那么DM.ADOQuery表示什么? 从属关系。
那DM,ADOQuery1表示什么呢? 一开始我还以为是COM+中特有的呢 ! [:(]

另外,问一下这个“,”操作是不是只有用在With do 结构中才是合法的?
可笑我现在找不到OP的语法,只有Pascal的。
 
此外,在COM+的程序中的
with DM,ADOQuery1 do
begin
end;
模块中用到了 MtsRdm 单元中的 SetComplete 和 SetAbort,
假如此时我将“with DM,ADOQuery1 do” 改为“with DM.ADOQuery1 do”,则编译不通过。

这有何关系?? 盼各位讲解。
 
with DM,ADOQuery1 do
begin
end;
並列,可匹配各種情況
with DM do begin
with ADOQuery1 do begin

with DM.ADOQuery1 do
begin
   
end;
就是一種啊。begind...end之間如果用到了DM.ADOquery2就不靈了。
 
为什么beigin end 模块中用到了 MtsRdm 单元中的 SetComplete 和 SetAbort 后,
用with DM.ADOquery do 编译通不过??
 
with不要用得太多 否则就仅仅是节省代码 而且可读性也不好。同时性能没有提高
用With可以提高性能是因为With告诉Delphi把With的东西尽量作为寄存器变量 也就是放到寄存器中这样就不需要每次引用都去重新查找获得变量的地址 但是要记住 寄存器数量是有限的
如果仅仅是为了增强代码的可读性 我建议还是采用如下的(当然 应该是在对象的路径很长时采用)采用并列的方法姑且不论效率 比如两个对象都有同名的方法 那对一个Delphi的语法不是很熟悉的人 肯定会引起混淆的
with dm do
with AdoQuery do
 
学习,赫赫。
 
不建议使用两层以上的WITH语句
 
只要注意如果两个对象有相同方法时,调用时默认为靠后的对象(除非指定对象)
 
我用过,但很少,可读性不好。
如果出错,不利于调试!
 
with DM.adoquery do
with DM,Adoquery (wiht DM do begin
with Adoquery do)
 
我用过,但很少,可读性不好。
如果出错,不利于调试!
 
在COM+的程序中的
with DM,ADOQuery1 do
begin
end;
模块中用到了 MtsRdm 单元中的 SetComplete 和 SetAbort,
假如此时我将“with DM,ADOQuery1 do” 改为“with DM.ADOQuery1 do”,则编译不通过。为啥?

没有得到我想要的答案。
时间太久,结贴了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
625
import
I
I
回复
0
查看
907
import
I
后退
顶部