2010-07-08 77 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