能否通过指针将一个对象挂到另一个对象上?(100分)

  • 主题发起人 主题发起人 wjunbing
  • 开始时间 开始时间
W

wjunbing

Unregistered / Unconfirmed
GUEST, unregistred user!
开发一个软件,通过点击Treeview子项来切换PageControl内的TabSheet页面,因为TabSheet页面上内容较多,我想通过Treeview的TreeNode节点的Data指针指向TabSheet页面,点选节点时直接调用其Data指针所指页面进行显示输出。但实现时出现EClassViolation错误,不知道在理论上这样做是否可行,在操作上是不是有什么要求?请知道的朋友帮忙!
 
我后继实验了一下,证实在理论上是可行的,但在具体操作上应该有一些要求,运行时出现错误提示。请有经验的朋友跟贴
 
在将TreeView节点TreeNode的Data指针所指的对象的内容复制给同类的对象时,出现错误。
程序:
  Bargain:= TBargain.Create(nil);//TBargain为一个从TabSheet继承而来的自定义类
Bargain.Assign(Node.Data)
//Node.Data为指向一个TBargain对象的指针
出现“Cannt assign a TBargain to a TBargain"错误信息,现在我就闹不明白了,同一个类的两个对象,为什么不能互相复制拷贝?请高手指点迷津!
   
 
当然可以相互复制了。
但是你得记住,Delphi是一个强类型的语言,Node.Data是一个Pointer类型,你应该将它进行强制转换。
Bargain.Assign(TBargain(Node.Data));
 
感谢takashiki的提醒,我将程序进行了修改,但在Bargain.Assign(TBargain(Node.Data));依然出错,错误信息依然是“Project Project1.exe raised. exception class EConvertError with Message "Cannot assign a TBargain to a TBargain'.
欢迎朋友们继续
 
这是因为你在TBargain类中没有用Override保留字去重载这个方法,而直接调用是TPersistent的Assign方法,你去查一查它的类继承关系图,然后再查每一个祖先类的Assign方法,都是没有重载的,所以会出现这种错误
 
首先Assign会复制一份对象,这里只需要保存对象的指针就好,所以没有必要使用Assign
而且自定义的类TBargain应该都没有重载Assign方法.
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to pagecontrol1.PageCount-1 do
begin
with treeview1.Items.AddChild(nil,pagecontrol1.Pages.Caption) do
Data:=pagecontrol1.Pages;
end;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
if treeview1.Selected.Data<>nil then
TTabSheet(treeview1.Selected.Data).Show;
end;
 
感谢三位朋友发,三位的指教给我多有帮助,我仔细查看了TPersistent类的Assign(source:TPersistent);virtual仅是一个摆设,实际复制得通过覆盖它来进行,但怎样复制对象内容现在却难住了我。感谢三位朋友!
 
后退
顶部