Ver Mensaje Individual
  #3  
Antiguo 09-12-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Responder Con Cita