12
votes

Comment modifier la valeur TLIST ?

DELPHI 2010 Comment modifier la valeur de la valeur xxx


1 commentaires

erreur ridicule. Et personne ne s'en soucie de l'enseigner. C'est une honte à quoi ils font les documents.


4 Réponses :


11
votes
A := List[10];
A.a := 1;
list[10] := A;
You don't have to do this with objects because they're reference types, (accessed through a pointer which the compiler manages internally to keep it out of your hair,) but records are value types so it doesn't work that way.

1 commentaires

C'est une façon simple et forte. Mais lorsque la taille de l'enregistrement est très énorme, la pile débordne en raison de la variable locale A et si cela fonctionne dans une boucle ou une boucle, c'est très lent.



9
votes

Vous avez frappé sur un accroc avec l'utilisation des enregistrements.

Considérez ce code: P>

List[10] := A;  <- writing a whole record is OK
List[10].a:=1;  <- List[10] returns a temporary record, pointless assignment
P:=@List[10];   <- List[10] returns a temporary record, its address is pointless


3 commentaires

Cependant, les articles de propriété sont en lecture-écriture et je pense que Delphi pourrait comprendre que les articles [1] .a: = 123 MEENS MEENS [1]: = TTYPE (123, OLDVAL2, OLDVAL3)


Mais ce n'est pas ... la partie importante n'est pas ce que le compilateur pourrait faire, mais ce que fait en fait .


@Astronavigator: Oui, la propriété est R / W, mais vous n'accédez pas directement au terrain directement. Cela vient de retourner une copie du champ. Vérifiez la réponse de Mason pour contourner cela.



2
votes

Si vous souhaitez stocker des enregistrements, des matrices dynamiques sont plus adaptées à la manipulation: xxx

Si vous devez ajouter des méthodes pour manipuler ces données, vous pouvez stocker ce tableau comme champ de une classe et ajoutez vos méthodes à cette classe.


0 commentaires

0
votes

Si vous avez besoin de manipuler des objets sous cette forme, il est préférable d'utiliser TOBEJECTLIST au lieu de TLIST et de définir la structure en classe plutôt qu'un enregistrement:

type TTest = class a,b,c:Integer end;
var List:TObjectList<TTest>;
    A:TTest; // A is an object so there's no need for a pointer
....
....
List.Add(TTest.Create);
List.Last.a := 1;
A:=List.Last;


0 commentaires