2010-07-08 54 views
2

我试图复制,或“交换”由一个TListBox中引用的两种形式。德尔福:如何复制形式

这里就是我想要做的,但我得到一个错误(如下图所示):

 cf1 := TCustomform(lstPackages.Items.Objects[origNdx]); 
     cf2 := TCustomform(lstPackages.Items.Objects[origNdx - 1]); 

     cfTmp.Assign(cf1); //error here: cannot assign TfPackage to a TfPackage 
     cf1.Assign(cf2); 
     cf2.Assign(cfTmp); 

     lstPackages.Items.Exchange(origNdx, origNdx - 1); 
     lstPackages.ItemIndex := origNdx - 1; 

所以,我想交换列表项,我需要做类似的事情表单,但我得到的错误是我无法分配我正在使用的表单类型。 TfPackage是TCustomForm的后代。

我怎么能完成同样的事情?

回答

1

你没有做到这一点。 TStrings.Exchange交换对象以及字符串,所以它已经被照顾好了。相同的表单对象将保持与相同的字符串关联。

编辑:在回应评论,如果您需要交换的另一个列表的形式位置,那么这并不困难。当你说:

cfTmp.Assign(cf1); 
cf1.Assign(cf2); 
cf2.Assign(cfTmp); 

但你并没有试图复制这些对象,而是试图将引用交换给它们。对象不是记录。在Delphi中,所有对象变量(包括表单容器中的变量)都是对象的引用(隐藏,隐式指针)。所以你需要做的是:

cfTmp := list[cf1Position]; 
list[cf1Position] := list[cf2Position]; 
list[cf2Position] := cfTmp; 
+0

我明白这一点。但是这些形式也在TFormContainer内(来自Billenium Effects),我也需要在其内部列表中交换它们的位置。 – croceldon 2010-07-08 16:35:41

+0

@croceldon:好的。看我的编辑。 – 2010-07-08 16:55:40

+0

唯一的内部列表TFormContainer似乎有“LRU”列表。手动编辑该列表的顺序没有意义;它是根据每个表单上次使用的时间自动确定的。重新排列列表框不会也不应该改变表单的使用历史记录。这听起来像是你正在使用TFormContainer的列表来设计它不适合的东西。 – 2010-07-08 17:05:50