¿Qué tipo son parámetros sin tipo como en el TStringStream clase:parámetros sin tipo/sin tipo en Delphi
function Read(var Buffer; Count: Longint): Longint; override;
¿Cuál es el tipo de parámetro Buffer (se trata de un tipo de puntero?).
¿Qué tipo son parámetros sin tipo como en el TStringStream clase:parámetros sin tipo/sin tipo en Delphi
function Read(var Buffer; Count: Longint): Longint; override;
¿Cuál es el tipo de parámetro Buffer (se trata de un tipo de puntero?).
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.
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.
escribí un artículo sobre este mismo tema hace unos años:
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 paraSource
, por lo que la declaración del parámetro utilizaconst
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.
+1 @Rob, muy buen artículo. – RRUZ
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.
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. –
Me soporte corregido –