2010-12-10 9 views
5

Estoy intentando escribir un procedimiento en Delphi. Este procedimiento recibe el nombre del elemento descendiente TControl y luego intenta cambiar algunas propiedades. Pero cuando trato de hacerlo, Delphi da un error como:"Tipos de parámetros var reales y formales deben ser idénticos" en el Procedimiento

E2033 Tipos de var real y formal parámetros deben ser idénticos

Procedimiento:

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

uso Ejemplo : Change_prop(Label1, 50,200); ¿Cuál puede ser la solución de ese error? Gracias.

Respuesta

9

sólo tiene que quitar el var en el parámetro de control y convertirlo en un parámetro de valor. Debido a que los objetos Delphi se implementan realmente como tipos de referencia, puede invocar métodos en ellos, cambiar campos de miembros, etc. incluso si los pasa a un procedimiento como un parámetro de valor o const.

+0

Gracias por su rápida respuesta. Problema resuelto ... – Alper

+0

¿Qué sucede cuando, por ejemplo, quiero llamar al evento OnKeyDown, donde el parámetro "Clave" tiene "var" escrita ...? ¿Hay alguna manera de llamarlo directamente como OnKeyDown (Self, VK_RETURN, ssNone) (que arroja el error en el título), o necesitamos crear un subprocedimiento para ser llamado desde el evento OnKeyDown, y como tal se puede utilizar en otro lugar. ...? –

+1

@Just No debe llamar a los controladores de eventos. Deje que el marco haga eso. Si necesita compartir el código, colóquelo en un método al que llame desde el controlador de eventos. –

4

Basta con retirar var - que no lo necesita para cambiar las propiedades de control:

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

Gracias por su rápida respuesta. Problema resuelto .. – Alper

2

Como dijo David, el problema está en el var. Eso no significa que pueda modificar los miembros de TControl, significa que puede reemplazar TControl con otro TControl completamente diferente, porque los objetos son tipos de referencia.

Si está pasando un objeto a un parámetro var, la variable que pase debe declararse exactamente del mismo tipo que el parámetro para preservar la seguridad del tipo. De lo contrario, podría hacer esto:

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

No existe el comportamiento indefinido en Object Pascal, solo está disponible para los usuarios de C. 'TTrouble (Pointer (Random (MaxInt))). AskFor (EXPLICIT)' –

+0

@ user205376 ¡¿De qué se trata? !! –

+0

@David: Creo que fue una broma. –

Cuestiones relacionadas