6
votes

"Types de paramètres var varient et formels doivent être identiques" Erreur dans la procédure

J'essaie d'écrire une procédure à Delphes. Cette procédure reçoit le nom de TControl code> élément décroissant, puis essayez de changer certaines propriétés. Mais quand j'essaie de le faire, Delphi donne une erreur comme:

E2033 Types de Var réel et formel Les paramètres doivent être identiques p> blockQuote>

Procédure: P>

procedure Change_prop(var Control: TControl;height:integer;width:integer);
begin
//......
end;


0 commentaires

3 Réponses :


5
votes

Il suffit de supprimer var fort> - vous n'en avez pas besoin pour modifier les propriétés du contrôle:

procedure Change_prop(Control: TControl;height:integer;width:integer);
begin
......
end;


0 commentaires

11
votes

Il vous suffit de supprimer le var dans le paramètre de contrôle et de le faire un paramètre de valeur. Étant donné que les objets DELPHI sont réellement implémentés en tant que types de référence, vous pouvez appeler des méthodes sur eux, modifier les champs des membres, etc. Même si vous les transmettez à une procédure en tant que paramètre de valeur ou de const.


5 commentaires

Qu'en est-il quand, par exemple, je veux appeler l'événement OnKeydown, où le paramètre "Key" a "Var" écrit ...? Y a-t-il un moyen de l'appeler directement comme OnKeyDown (Self, Vk_Return, Ssnone) (qui jette l'erreur dans le titre) ou devez-nous créer une sous-processus à appeler à partir de l'événement ONKEDOWDOWD et peut en tant que telle être utilisée ailleurs. ...?


@Just, vous ne devriez pas appeler des gestionnaires d'événements. Laissez le cadre faire ça. Si vous devez partager le code, mettez-le dans une méthode que vous appelez du gestionnaire d'événements.


J'ai effectivement utilisé la méthode Effectuer, en utilisant WM_KEYDOWDOW comme expéditeur et il semble fonctionner très bien. Merci!


@Just n'est pas la meilleure façon de le faire


Il en va de même pour les paramètres de sortie, out ou var donnera ce problème.



2
votes

Comme David dit, le problème est dans le var . Cela ne signifie pas que vous pouvez modifier les membres du TControl, cela signifie que vous pouvez remplacer le TControl avec un autre TControl complètement différent, car les objets sont des types de référence.

Si vous passez Un objet à un paramètre var , la variable que vous passe doit être déclarée exactement au même type que le paramètre afin de préserver la sécurité du type. Sinon, vous pourriez faire ceci: xxx


5 commentaires

Il n'y a pas de comportement non défini dans l'objet Pascal, il n'est disponible que pour les utilisateurs C. ttrouble (pointeur (aléatoire (Maxint))). Askfor (Explicit)


@ user205376 Qu'allez-vous sur? !!


@David: Je pense que c'était une blague.


Clairement, j'ai besoin de sortir plus et d'arrêter de telle que rep-chasser !!


@User, bien que Delphi n'a pas de concept formel de comportement indéfini de la manière dont C et C ++ le font, c'est toujours un terme utile. La langue Delphi ne dit pas ce qui se passera dans la situation Mason démontrée. Si vous avez de la chance, votre programme s'écrasera immédiatement, mais vous pourriez avoir une corruption de données, une corruption de pile, voire aucune erreur. Il est inutile d'essayer de raisonner plus loin sur le comportement attendu du programme; Toutes sortes de choses pourraient arriver, et elles peuvent dépendre des facteurs extérieurs, y compris des versions du système d'exploitation, du compilateur et des bibliothèques.