2010-07-08 3 views
2

J'essaie de copier ou d''échanger' deux formulaires référencés par une TListBox.Delphi: Comment copier des formulaires

Voici ce que je suis en train de faire, mais je reçois une erreur (ci-dessous):

 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; 

Donc, je suis en train d'échanger des éléments de la liste, et je dois faire quelque chose de similaire avec les formulaires, mais j'obtiens l'erreur que je ne peux pas attribuer le type de formulaire que j'utilise. TfPackage est un descendant de TCustomForm.

Comment puis-je accomplir la même chose?

Répondre

1

Vous n'êtes pas obligé de le faire. TStrings.Exchange échange les objets aussi bien que les chaînes, donc c'est déjà pris en charge pour vous. Les mêmes objets de formulaire resteront associés aux mêmes chaînes.

EDIT: En réponse au commentaire, si vous avez besoin d'échanger la position des formulaires dans une autre liste, alors ce n'est pas difficile. Vous avez l'idée de base droite quand vous avez dit:

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

Mais vous n'êtes pas essayer de copier les objets, vous essayez d'échanger des références à eux. Les objets ne sont pas des enregistrements. En Delphi, toutes les variables d'objet, y compris celles du conteneur de formulaire, sont des références (cachées, pointeurs implicites) à l'objet. Donc, ce que vous devez faire est:

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

Je comprends cela. Mais ces formes sont également à l'intérieur d'un TFormContainer (de Billenium Effects), et j'ai aussi besoin d'échanger leur position dans sa liste interne. – croceldon

+0

@croceldon: OK. Voir ma modification. –

+0

La seule liste interne que TFormContainer semble avoir est la liste "LRU". Cela n'a aucun sens d'éditer manuellement l'ordre de cette liste; Il est déterminé automatiquement en fonction du moment où chaque formulaire a été utilisé pour la dernière fois. Réorganiser votre zone de liste ne doit pas et ne doit pas modifier l'historique d'utilisation des formulaires. Il semble que vous utilisiez la liste de TFormContainer pour quelque chose pour lequel il n'est pas conçu. –

Questions connexes