2010-12-10 33 views
5

Je suis en train d'écrire une procédure en delphi. Cette procédure obtient le nom TControl élément descendant, puis essaie de modifier certaines propriétés. Mais quand j'essaie de le faire, Delphi donne une erreur comme:« Types de paramètres var et formels doivent être identiques » erreur dans la procédure

E2033 Types de var réelle et formelle paramètres doivent être identiques

Procédure:

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

Exemple d'utilisation : Change_prop(Label1, 50,200); Quelle peut être la solution de cette erreur .. Merci.

Répondre

9

Il vous suffit de supprimer le var dans le paramètre de contrôle et en 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 ces derniers, modifier des champs de membre, etc. même si vous les passez à une procédure en tant que valeur ou paramètre const.

+0

Merci pour votre réponse rapide. Problème résolu .. – Alper

+0

Que dire de quand par exemple je veux appeler l'événement OnKeyDown, où le paramètre "Key" a écrit "var" ...? Est-il possible de l'appeler directement comme OnKeyDown (Self, VK_RETURN, ssNone) (qui renvoie l'erreur dans le titre) ou devons-nous créer une sous-procédure à appeler depuis l'événement OnKeyDown, et peut donc être utilisé ailleurs. ...? –

+1

@Just Vous ne devez pas appeler les gestionnaires d'événements. Laissez le cadre faire cela. Si vous devez partager du code, placez-le dans une méthode que vous appelez du gestionnaire d'événements. –

4

Il suffit de retirer var - vous n'avez pas besoin de modifier les propriétés de contrôle:

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

Nous vous remercions de votre réponse rapide. Problème résolu .. – Alper

2

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, parce que les objets sont des types de référence.

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

procedure TForm1.VarControl(var control: TControl); 
begin 
    control := TButton.Create; 
end; 

procedure TForm1.Mistake; 
begin 
    VarControl(self.Memo1); //defined as TMemo 
    Memo1.Lines.Text := 'Undefined behavior here...'; 
end; 
+2

Il n'y a pas de comportement non défini dans Object Pascal, il est uniquement disponible pour les utilisateurs de C. 'TTrouble (Pointeur (Aléatoire (MaxInt))). AskFor (EXPLICIT)' –

+0

@ user205376 que faites-vous sujet? !! –

+0

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