delphi parameters delphi-2009

delphi - pasar un número ilimitado de parámetros al procedimiento



parameters delphi-2009 (3)

En primer lugar, Inc y Write son malos ejemplos porque ambos obtienen un tratamiento especial del compilador. No puede escribir una función que se comporte exactamente como esas dos. Hay alternativas que debes investigar.

Eche un vistazo a las sobrecargas

Puede crear múltiples versiones de su método usando una cantidad variable de parámetros y tipos variables. Algo como esto:

procedure MyInc(var i:Integer); overload; procedyre MyInc(var i:Integer; const N:Integer); overload; procedure MyInc(var i:Integer; const N1, N2: Integer); overload; procedure MyInc(var i:Integer; const N1, N2, N3: Integer):overload;

Esto es factible si el número requerido de sobrecargas no es tan grande. El compilador probablemente manejaría muchas sobrecargas fácilmente, pero probablemente no querría escribirlas. Cuando el número de sobrecargas se convierte en un problema, puede cambiar a las matrices:

Usar matrices abiertas como parámetros

Una función puede tomar un parámetro del tipo array of YourType , y cuando llamas a esa función puedes pasar tantos parámetros como necesites:

procedure MyInc(var i:Integer; Vals: array of Integer);

Y luego úsalo así:

MyInc(i, []); // no parameters MyInc(i, [1]); MyInc(i, [1, 34, 43, 12]);

en Delphi, el procedimiento de escritura puede manejar:

write(TF,st1)

y

write(TF,st1,st2,st3,st4);

Quiero declarar un procedimiento que también puede hacer eso, ¿cuál es la sintaxis?

y la opción de:

write(TF,[st1,st2,st3])

es menos deseable, aunque sé cómo hacerlo.

el objetivo principal era pasar ShortString a la función, que haría una llamada de lectura desde el archivo, y leería a la longitud de la shortString como se define. sin embargo, después de pasarlo como variante o en matriz abierta, shortString pierde su "tamaño" y se convierte en 255, lo que hace que este pase no se shortString usar, para mí. pero la respuesta todavía se obtiene si quieres pasar la matriz abierta.


Solo con fines ilustrativos:

Delphi admite una forma de escribir funciones de argumentos variables "reales", pero es realmente engorroso y está destinado principalmente para declarar funciones C externas con argumentos variables como printf, ya que implica jugar algunos trucos sucios de bajo nivel para acceder a los argumentos en el apilar.

Implica el uso de modificadores cdecl y varargs :

procedure MyWrite_; cdecl; begin ... some magic here ... end; var MyWrite: procedure; cdecl varargs = MyWrite_; begin MyWrite(1); MyWrite(1, 2); MyWrite(1, 2, 3); end;

Se puede encontrar una explicación más detallada en la respuesta de Barry Kelly a ¿Cómo puede una función con ''varargs'' recuperar el contenido de la pila?


Solo para complementar la respuesta de Cosmin: si la lista de parámetros es de tipos diferentes, podría usar un parámetro de matriz abierta variante (también conocida como "matriz de const"). Más sobre la documentación de Delphi.

Ejemplo (de la documentación ):

function MakeStr(const Args: array of const): string; var I: Integer; begin Result := ''''; for I := 0 to High(Args) do with Args[I] do case VType of vtInteger: Result := Result + IntToStr(VInteger); vtBoolean: Result := Result + BoolToStr(VBoolean); vtChar: Result := Result + VChar; vtExtended: Result := Result + FloatToStr(VExtended^); vtString: Result := Result + VString^; vtPChar: Result := Result + VPChar; vtObject: Result := Result + VObject.ClassName; vtClass: Result := Result + VClass.ClassName; vtAnsiString: Result := Result + string(VAnsiString); vtCurrency: Result := Result + CurrToStr(VCurrency^); vtVariant: Result := Result + string(VVariant^); vtInt64: Result := Result + IntToStr(VInt64^); end; end;