******对象的引用*********(100分)

L

liews01

Unregistered / Unconfirmed
GUEST, unregistred user!
[red][/red]1 delphi 的对象都是引用吗?
如果是引用 作为函数的参数 如果 前面加 var 和不加 有何区别

2 我在编译时,遇到这个函数
CollectionsEqual(Columns, TCustomDBGridExt(Filer.Ancestor).Columns ))
出错
如何使用它?
 
1.是引用,没区别。详见《Delphi5从入门到精通》
 
CollectionsEqual(Columns, TCustomDBGridExt(Filer.Ancestor).Columns ))
出错
如何使用它?
最起码的是你右边多了一个括号。
 
有一点区别吧!
example:
DoSomeThing(var O:TObject)
begin
...
O:=AnotherObject;
..
end;

DoSomeThing2(O:TObject)
begin
...
O:=AnotherObject;
...
end;
效果是不同的。
 
borland delphi reference 也没有关于这方面介绍
咳!!!!!
 
有区别,引用是传地址,要想改变变量的值,就得用引用,可以去看看C或C++语言的书,
都有这方面的内容。
 
在《Delphi5从入门到精通》P75页,作者如是说——
如果将对象作为参数传递给函数也是一样:没有建立新对象,而是在代码的
两个不同位置引用了同一对象。
接下来作者用一段简短的代码作了说明——
procedure ChangeCaption(Button:TButton;Text:string);//试试,加不加var效果一样!!!
begin
Button.Caption:=Text;
end;
//call...
ChangeCaption(Button1,'Hello');

值得注意的是,
Object pascal和C++不一样,Object pascal定义一个对象变量需要显示调用类
的构造函数来实例化这个对象,而C++定义一个变量的同时即调用构造函数来实
例化对象。Object pascal不存在C++中的拷贝构造函数。
P.S:
不要相信经验主义:(
 
function inc_1(v1:integer):integer;
begin
v1:=v1+1;
end;

function inc_2(var v1:integer):integer;
begin
v1:=v1+1;
end;


call ...
inc_1(myvar)和inc_2(myvar)结果一样,但执行inc_2后myvar的值应该变化了。myvar被加1了。
 
请看清题意:
人家问的是对象作为函数的参数!!!
^^^^
 
你的这个函数我好像见过,是一个grid控件拿到D6下使用,结果不兼容所致,因为它是d5版。
原因好像是这个函数的参数个数变了,你因该在这个代码后加1个或2个nil, (个数我记不清了)
看看他的函数声明吧,反正不够的尽管加nil,可以让它编译通过就是了。没什么大碍
 
为什么没人回答了
 
对象作为函数的参数,如果不用var 的话,在加入对象参数时,该对象的实例一定要
存在,如果加了var的话,可以在函数完成后返回一个对象实例地址给对象参数,该
对象参数不必在函数调用前,创建实例。而在函数中创建。

 
to delphi_zm
你的这个解释是那里得到的
哪里有关于这方面的资料
borland 好像没有关于这方面的解释
 
我做了简单的DEMO,证明delphi_zm的说法是不正确的。
————————————————————————————————————————
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ChangeCaption(var Button:TButton;Text:string)

end;

var
Form1: TForm1;
Button3: TButton;

implementation

{$R *.DFM}

procedure TForm1.ChangeCaption(var Button: TButton
Text: string);
begin
Button.Caption:=Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ChangeCaption(Button3,'Hello,World!');
//下一句会出现内存访问错误,可见button3并未预期的那样产生了实例!!!
showmessage(inttostr(button3.InstanceSize));
end;

end.
————————————————————————————————————————
 
delphi_zm 的解释是对的,对象参数前加var,调用前不需要有该对象的实例存在,如果有实例
存在,在函数中可以修改对象的引用,使它引用一个新的类型兼容的对象(也可调用
类型兼容的对象的构造函数创建),函数返回后,该参数将引用一个新对象,如果参数前没有
var,在函数体中让它引用一个新的对象,但函数返回后,它仍引用原来的对象
(但可以修改对象实例的字段值)
 
>来自:delphi_zm, 时间:2002-5-20 19:59:00, ID:1112805
>对象作为函数的参数,如果不用var 的话,在加入对象参数时,该对象的实例一定要
>存在,如果加了var的话,可以在函数完成后返回一个对象实例地址给对象参数,该
>对象参数不必在函数调用前,创建实例。而在函数中创建。

delphi_zm说的乱七八糟,对对错错,在delphi中申明一个对象,只是分配了一个地址,
该对象的实例是不会自动创建的,而在delphi中对象都是地址传递,根本不用var,用不
用都一样,该对象的实例存在不存在也都一样,传过去的是一个4byte的指针,因为是地
址,在哪里都可以创建,但是在引用这个对象前,一定要创建,doxpix错在button3没有
创建,当然出错,而且不是错在“showmessage(inttostr(button3.InstanceSize));”这
句,而是在ChangeCaption中的“Button.Caption:=Text;”,这是delphi编译器处理异常
的方式,出现异常后,程序停在出错的语句或过程之后。

另外delphi并不会自动创建对象,除非是设计时放在界面上的对象。
 
to wddelphi:
你有没有试过我的代码???
要是注释掉
showmessage(inttostr(button3.InstanceSize));
程序便不会出现内存访问错误,根本不关
Button.Caption:=Text;
这一句的事情!!!
我当然知道button3并没有创建一个实例出来,我只是用这个例子来说明
delphi_zm的说法是不正确的!!!
 
Up to doxipx
You are so cool!
我已试了,all right!
 
to doxpix,你是对的,sorry for 没有试你的代码就发言,不过这到让我产生了疑惑:
就我所知,申明一个对象,delphi只是分配一个地址,并不分配实例空间,为什么却可
以访问、修改没有创建的对象的属性(虽然改变的值不会被保存),但不能访问它的方法?
 
用var和不要var当然有区别:
用var:传地址
不用:传值
 
顶部