这样的,有一个类 TTest 及这种类型的指针 PTTest,和两个函数如下:prcedure funcA;
var
t : TTest;
test : TTest;
pTest : PTTest;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;
end;prcedure funcA;
var
test : TTest;
pTest : PTTest;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;这两个函数的唯一区别就是FuncA中多执行了一个往队列里加对象的操作,
另我不解的是先调用 FuncA 再调用 FuncB居然会在FuncB的最后一句话出错。
请问这是什么原因?
var
t : TTest;
test : TTest;
pTest : PTTest;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;
end;prcedure funcA;
var
test : TTest;
pTest : PTTest;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;这两个函数的唯一区别就是FuncA中多执行了一个往队列里加对象的操作,
另我不解的是先调用 FuncA 再调用 FuncB居然会在FuncB的最后一句话出错。
请问这是什么原因?
解决方案 »
- delphi按钮图标
- 3层,客户端出现RPC服务器不可用的问题
- ClientDataSet怎样向mysql有自增字段的表添加数据?
- Unit ParamDsg was compiled with a different version of MemTable.TMemoryTable
- 求reportmachine2.6的delphi7的安装方法,详细点,在线等
- 谁作过餐饮管理系统中的厨房打印模块?
- 问个问题关于数学的
- delphi中的数据库问题
- 咨询:D6和D5是否可以装在同一操作系统(如98)下?
- 谁有自荐信啊???E给我.给分.谢谢了.
- 可用分全部散去。决定戒网3个月,安心坐我得程序。
- 高手指点,关于线程!!!!
var
t : TTest;
test : TTest;
pTest : PTTest;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;
end;prcedure funcA;
var
test : TTest;
pTest : PTTest;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;这两个函数的唯一区别就是FuncA中多执行了一个往队列里加对象的操作,
另我不解的是先调用 FuncA 再调用 FuncB居然会在FuncB的最后一句话出错。
请问这是什么原因?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
tTest = class
public
procedure SomeFunc;
end;
PTtest = ^TTest;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
list1: TList;
list2: TList; procedure funcA;
procedure funcB;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.funcA;
var
t : TTest;
test : TTest;
pTest : PTTest;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;end;procedure TForm1.funcB;
var
test : TTest;
pTest : PTTest;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;procedure TForm1.FormCreate(Sender: TObject);
begin
list1 := TList.Create;
List2 := TList.Create;
funcA;
funcB;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
List1.Free;
List2.Free;
end;{ tTest }procedure tTest.SomeFunc;
begin
ShowMessage('a');
end;end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
tTest = class
public
procedure SomeFunc;
end;
PTtest = ^TTest;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
list1: TList;
list2: TList; procedure funcA;
procedure funcB;
end;var
Form1: TForm1;implementation
var
t : TTest;
{$R *.dfm}procedure TForm1.funcA;
var
test : TTest;
pTest : PTTest;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;end;procedure TForm1.funcB;
var
test : TTest;
pTest : PTTest;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TTest(list1.items[0]);
pTest := PTTest(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;procedure TForm1.FormCreate(Sender: TObject);
begin
list1 := TList.Create;
List2 := TList.Create;
funcA;
funcB;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
List1.Free;
List2.Free;
t.Free;
end;{ tTest }procedure tTest.SomeFunc;
begin
ShowMessage('a');
end;end.
你贴出来的代码是没有错的,除非List2.items[0]的内容改变了,或者是对象被释放了 建议你检查一下其他的地方
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type pTBase = ^TBase;
PTTest = ^TTest; TBase = class
public
procedure SomeFunc; virtual;
end; TTest = class(TBase)
public
procedure SomeFunc; override;
end; TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
list1 : TList;
list2 : TList; procedure funcA;
procedure funcB;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
list1 := TList.Create;
List2 := TList.Create;
funcA;
funcB;
end;procedure tBase.SomeFunc;
begin
ShowMessage('base');
end;procedure tTest.SomeFunc;
begin
ShowMessage('test');
end;procedure TForm1.funcA;
var
t : TTest;
test : TBase;
pTest : PTBase;
begin
//往list及list1中分别加入一个对象和对象的指针
t := TTest.Create;
list1.Add(t);
list2.Add(@t); //分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TBase(list1.items[0]);
pTest := PTBase(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc;end;procedure TForm1.funcB;
var
test : TBase;
pTest : PTBase;
begin
//分别取出对象及对象的指针,并调用对象的方法SomeFunc
test := TBase(list1.items[0]);
pTest := PTBase(list2.items[0]);
test.SomeFunc;
pTest.SomeFunc; //出错
end;
end.
我是这样理解的:t 是一个局部变量,FUNCA执行完全将释放。也就是@t在函数退出时将变成无效地址,所以在FUNCB中取出的这个地址当然会出错。在FUNCB中取出对象不会错是因为TLIST类在ADD函数里会重新构造一个和要加入对象一样的东西,所以t的释放不会影响到它。好了,谢谢大伙的关心,散分!!!!!!!!