J'ai ce code:

TTimer(TimerList.Items[Row]) := TTimer.Create(Self);

Lorsque je lance le programme, il y a l'erreur suivante :

unit1.pas(70,19) Erreur : L'argument ne peut pas être attribué à

Pourquoi cette erreur est-elle renvoyée et comment puis-je la corriger ?

0
DelPhi1 3 févr. 2020 à 19:05

1 réponse

Meilleure réponse

Vous incluez un transtypage explicite sur le côté gauche - ce peut être autorisé pour les variables, mais ici Items est une propriété accessible via un getter et donc ce n'est pas une variable mais un résultat de fonction. Le seul endroit où vous pouvez transtyper ici, si nécessaire, est sur le côté droit du devoir.

Nous ne connaissons pas le type de TimerList, mais en supposant qu'il s'agisse d'un type compatible comme TList<TTimer>, vous pouvez simplement l'affecter directement.

 TimerList.Items[Row] := TTimer.Create(Self);

Si la liste ou le tableau contient des éléments d'un type différent, compatible, mais pas implicitement transtypable, vous devez alors transtyper le côté droit de l'affectation pour qu'il corresponde au type attendu du côté gauche.


Dans le cas d'un simple TObjectList (à partir des commentaires), les éléments de la liste sont simples TObject, donc tout objet, y compris un TTimer peut être affecté à l'élément de la liste comme ci-dessus. Là où vous auriez besoin de transtyper va dans l'autre sens - en affectant le TObject à une variable TTimer :

var 
  LMyTimer : TTimer
begin
  LMyTimer := TTimer(TimerList.Items[someIndex]);

Faites également attention qu'en créant l'objet avec TTimer.Create(self) vous donnez à self (probablement la forme ?) la propriété de l'objet timer. En le plaçant dans un TObjectList, vous donnez alors également la propriété de l'objet à la liste. Les deux essaieront de libérer l'objet lorsqu'ils seront eux-mêmes libérés - celui qui le fera en dernier provoquera un plantage, il s'agit donc d'un bogue.

Décidez quel objet aura la responsabilité de propriété et mettez-le en œuvre - un objet ne devrait pas avoir deux propriétaires ! Soit le TObjectList possède le minuteur, et donc le crée avec TTimer.Create(nil), ou laisse la propriété avec le (form?) en utilisant TTimer.Create(self) et utilise un simple TList au lieu d'un TObjectList.

Si vous avez une version moderne de Delphi, je préférerais fortement une liste générique typée, soit TList<TTimer> soit TObjectList<TTimer>. Cela contourne le besoin de transtypage entièrement.

4
J... 3 févr. 2020 à 20:16