2009-12-18 28 views

Respuesta

1

Consulte la ayuda de Delphi para "parámetros sin tipo"

Puede pasar en cualquier tipo, pero hay que echarlo en la implementación. La ayuda dice que no se puede pasar un número o una constante numérica sin tipo. Entonces, básicamente, debe saber qué tipo de información esperar y el compilador no puede ayudarlo, por lo que necesita una buena razón para hacerlo de esta manera. Supongo que podría ser útil si necesita el método para manejar tipos incompatibles, pero de nuevo podría escribir varias versiones sobrecargadas para cada tipo esperado, lo sugeriría como una mejor solución.

+2

El parámetro 'Buffer' no es un puntero. Trátelo como un puntero, y las cosas colapsarán. Es el * buffer real * que desea cambiar, no un puntero a un buffer. La dirección del parámetro es la dirección del búfer. –

+0

Me soporte corregido –

0

var en una lista de parámetros es la sintaxis Delphi para call by reference. Puede ser tipeado como p. el parámetro AllowChange en el controlador OnChanging de un Listview:

procedure TSomeForm.LVOnChanging(Sender: TObject; ...; var AllowChange: Boolean); 
begin 
    if SomeProblemOccurred then 
    AllowChange := False; 
end; 

o sin tipo como en su ejemplo.

18

escribí un artículo sobre este mismo tema hace unos años:

What is an untyped parameter?

parámetros sin tipo se utilizan en algunas situaciones; el método TStream.Read sobre el que más se acerca coincide con el procedimiento Move del que escribí. He aquí un extracto:

procedure Move(const Source; var Dest; Count: Integer); 

El copias de datos Move procedimiento desde una variable arbitraria en cualquier otra variable. Necesita aceptar las fuentes y los destinos de de todos los tipos, lo que significa que no puede requerir un solo tipo. El procedimiento no modifica el valor de la variable aprobada para Source, por lo que la declaración del parámetro utiliza const en lugar de , que es el modificador más común para los parámetros sin tipo.

En el caso de TStream.Read, la fuente es el contenido de la corriente, por lo que no pasa que como parámetro, pero el destino es el parámetro Buffer se muestra en la cuestión. Puede pasar cualquier tipo de variable que desee para ese parámetro, pero eso significa que debe tener cuidado. Es su trabajo, no el del compilador, para garantizar que el contenido de la transmisión sea realmente un valor válido para el tipo de parámetro que proporcione.

Lea el resto de mi artículo para ver más situaciones en las que Delphi usa parámetros sin tipo.

+5

+1 @Rob, muy buen artículo. – RRUZ

0

Quizás sorprendentemente, es legal pasar un puntero desreferenciado como un parámetro sin tipo. Y el puntero en sí ni siquiera tiene que tener un tipo.

procedure SomeMethod(var aParameter); 
    ∶ 

procedure CallSomeMethod(aIsInteger : Boolean); 
type 
    buffer : Pointer; 
    intValue : Integer; 
    realValue : Single; 
begin 
    if aIsInteger then 
    begin 
    buffer := @intValue; 
    end 
    else 
    begin 
    buffer := @realValue; 
    end; 
    SomeMethod(buffer^); 

Por supuesto que probablemente habría sido más fácil si el parámetro a SomeMethod() había sido un puntero, pero esto podría no estar bajo su control.

Cuestiones relacionadas