Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Procedimiento con parámetros con valor por defecto (https://www.clubdelphi.com/foros/showthread.php?t=71249)

Ledian_Fdez 09-12-2010 17:45:09

Procedimiento con parámetros con valor por defecto
 
Hola, tengo varios procedimientos donde quisiera saber si hay alguna forma de ponerles valores por defecto a los parámetros. Ya que en la mayoria de los casos lo que es el mismo valor.

Este es uno de los tantos procedimientos, pero hay algunos que tienen mas de 10 parámetros.

Código Delphi [-]
procedure InicializaDocLegal(Id: Variant; Codigo: Variant; Nombre: Variant);
begin
 with DM.SPListaDocLegal.Parameters do
  begin
   ParamByName('@idDocLeg').Value := Id;
   ParamByName('@Codigo').Value := Codigo;
   ParamByName('@Nombre').Value := Nombre;
  end;
end;

Ejemplo de la llamada:
Código Delphi [-]
InicializaDocLegal(Null,Null,Null);
InicializaDocLegal(32,Null,Null);
InicializaDocLegal(Null,'0069',Null);
InicializaDocLegal(Null,'0069','Certifico');

Pero de todas las más usadas es la primera. Y pensé en que si hubiera alguna forma que los parámetros cogieran por defecto el valor Null fuera fabuloso.

Muchas grasias de antemano,

Saludos.

Casimiro Notevi 09-12-2010 17:59:33

Si le pasas null en la llamada, por ejemplo, entonces puedes cambiar los valores por defecto en el propio procedimiento, algo así:

Código SQL [-]
procedure xxxxxxx (campos..... etc.)
begin
// cargar valores por defecto los que tengan null
if codigo is null then
  codigo = 10;   <---- este sería el valor por defecto
if campotal is null then
  campotal = 100;
etc.

// hacer lo que sea.

end;

Al González 09-12-2010 19:33:48

Hola.

Los parámetros de tipo Variant no pueden tener valor predeterminado (al menos hasta Delphi 7), por lo que es una solución habitual en estos casos emplear sobrecarga, es decir, escribir dos o más rutinas que lleven el mismo nombre pero que se distingan por sus parámetros.

Código Delphi [-]
Procedure InicializaDocLegal (Const ID :Variant; Const Codigo :Variant;
  Const Nombre :Variant); Overload;
Begin
  With DM.SPListaDocLegal.Parameters Do
  Begin
    ParamByName ('@idDocLeg').Value := ID;
    ParamByName ('@Codigo').Value := Codigo;
    ParamByName ('@Nombre').Value := Nombre;
  End;
End;

Procedure InicializaDocLegal (Const ID :Variant; Const Codigo :Variant);
  Overload;
Begin
  InicializaDocLegal (ID, Codigo, Null);
End;

Procedure InicializaDocLegal (Const ID :Variant); Overload;
Begin
  InicializaDocLegal (ID, Null, Null);
End;

Procedure InicializaDocLegal; Overload;
Begin
  InicializaDocLegal (Null, Null, Null);
End;

El programa llamará al procedimiento que corresponda, según la cantidad de parámetros que pongas en la instrucción que haga esa llamada.

Sin embargo, en el ejemplo que nos das puede que no haya necesidad de que los parámetros sean de tipo Variant. Pueden ser de tipo Integer o String, con lo cual sí puedes indicar un valor predeterminado para cada uno (ahorrándote y ahorrándole a la aplicación cierta cantidad de recursos):

Código Delphi [-]
Procedure InicializaDocLegal (Const ID :Integer = 0;
  Const Codigo :String = '';
  Const Nombre :String = '');
Begin
  With DM.SPListaDocLegal.Parameters Do
  Begin
    If ID = 0 Then
      ParamByName ('@idDocLeg').Value := Null
    Else
      ParamByName ('@idDocLeg').Value := ID;

    If Codigo = '' Then
      ParamByName ('@Codigo').Value := Null
    Else
      ParamByName ('@Codigo').Value := Codigo;

    If Nombre = '' Then
      ParamByName ('@Nombre').Value := Null
    End
      ParamByName ('@Nombre').Value := Nombre;
  End;
End;

PERO antes de optar por alguna de estas dos soluciones, ten presente que una rutina con una cantidad importante de parámetros es señal de una posible falla de diseño. Lo sé, incluso en algunas bibliotecas de Microsoft hay métodos y funciones con una cantidad exorbitante de parámetros, pero si empleas en mayor medida Programación Orientada a Objetos puede que desaparezca esa necesidad de declarar procedimientos de 10 parámetros. ;)

Espero esta contribución haya sido de alguna utilidad.

Casi: En Delphi el operador Is trabaja con objetos, pero no con valores de tipo Variant. Intuyo que ya lo sabes pero seguro andas haciendo algo en SQL. :)

Casimiro Notevi 09-12-2010 19:54:05

Cita:

Empezado por Al González (Mensaje 384486)
[..] Casi: En Delphi el operador Is trabaja con objetos, pero no con valores de tipo Variant. Intuyo que ya lo sabes pero seguro andas haciendo algo en SQL. :)

Me pareció leer Store Procedure... por eso :)

Al González 09-12-2010 21:22:06

Cita:

Empezado por Casimiro Notevi (Mensaje 384490)
Me pareció leer Store Procedure... por eso :)

¡Ah! Disculpa.

Por un momento imaginé eso, pero de pronto lo vi un tanto pascalizado. :p

Casimiro Notevi 09-12-2010 22:15:12

Es que tengo la cabeza ya un poco... obsoleta :)


La franja horaria es GMT +2. Ahora son las 10:36:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi