Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Llamar a funcion sin definir todos los parametros (https://www.clubdelphi.com/foros/showthread.php?t=72961)

oscarac 22-03-2011 18:12:09

Llamar a funcion sin definir todos los parametros
 
Buenos dias

es posible en Delphi llamar a una funcion con parametros sin necesidad de indicarle la totalidad de los parametros?

por ejemplo

Código Delphi [-]
 
EstablecerRangos ()
 
EstablecerRangos(1)
 
EstablecerRangos(1,1)

Al González 22-03-2011 18:48:23

Sí, es posible cuando la función tiene parámetros declarados con valor predeterminado:

Código Delphi [-]
Procedure EstablecerRangos (Par1 :Integer = 10; Par2 :Integer = 100);
Begin
End;

...

  EstablecerRangos;
  EstablecerRangos (5);
  EstablecerRangos (5, 50);

oscarac 23-03-2011 18:17:51

debo entender que si no los tiene predeterminado no se puede? :confused:

Al González 23-03-2011 18:48:17

Cita:

Empezado por oscarac (Mensaje 394374)
debo entender que si no los tiene predeterminado no se puede? :confused:

Así es. De otra manera, ¿cómo sabría la función qué valores usar? :)

oscarac 23-03-2011 19:52:30

mmmm
yo provengo de otro lenguaje (Visual Fox - aunque algunos no lo consideran un lenguaje)

como sea... en Fox nuo podia llamar a una funcion inclusive sin parametros

EstablecerRangos()

Cita:

Function EstablecerRangos
Parameters RInicial, RFinal
RInicial = Iif (Type('rInicial') $ 'U', valor asignado, RInicial)
RFinal = Iif (Type('rFinal') $ 'U', valor asignado, RFinal)
Explicacion

se llama a la funcion sin parametros.. dentro de la funcion se pregunta si el tipo de Variable (del parametro) es Undefined o no definido, entonces toma un valor. caso contratio es un valor definido y conserva su valor....

no he visto hasta el momento en Delphi algo parecido

Al González 23-03-2011 20:21:40

Me dio algo de nostalgia el ejemplo que expones. No porque le tuviera mucho cariño a FoxPro (también lo usé pero desde los tiempos en que todavía no existía la versión "visual"), sino por lo emocionante que era sacarle provecho hasta la última de sus limitadas capacidades como lenguaje (aquello de 5 niveles de llamadas como máximo era una majadería).

En Delphi sí que has visto ya algo parecido y que además requiere mucho menos código: los parámetros con valor predeterminado.

:)

oscarac 23-03-2011 20:27:18

yo tambien use el Foxpro en sus primeras versiones... recuerdo la FoxproLn 2.0 version para redes

y aun es ese limitado lenguaje desarrolle rutinas de busqueda incremental en un "popup" simulado, asi como reportes "armados" que columnas variables e incluso recursividad

Al González 23-03-2011 20:45:32

Encontré esto entre mis recuerdos, que de recuerdos tienen poco pues leo mi propio código de entonces y no entiendo nada. :D :o

Código:

* Introducir Teclaso Corrector.  Para usarse antes de un Read (o continuaci¢n
* de Read) que leer  botones, cajas de verificaci¢n o botones radio.
Procedure IntrTecCor
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * Si el £ltimo teclaso antes de un Read es un click de rat¢n y el *
  * primer objeto de lectura es un bot¢n, una caja de verificaci¢n  *
  * o un bot¢n radio, FoxPro comete el grav¡simo error de no        *
  * resaltar tal objeto, por lo que yo utilizo las siguientes dos  *
  * l¡neas para asegurar que la £ltima pulsaci¢n antes del Read sea *
  * de teclado.  Keyboard mete el teclaso en el buffer de teclado e *
  * InKey lo extrae de ah¡ (para que no sea le¡do en el Read).      *
  * As¡, FoxPro "piensa" que la £ltima pulsaci¢n del usuario fue de *
  * teclado y s¡ resalta el objeto correctamente.                  *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  Keyboard "{F2}" Plain Clear
  = InKey ()
Return


Al González 23-03-2011 21:01:36

Por cierto, en aquellos años tuve el descaro de diseñar un sistema de ventanas, menús y escritorio bastante más flexible que el nativo, incluyendo la capacidad de cerrar la aplicación en cualquier momento y abrirla nuevamente con todo lo que había en pantalla tal y como estaba (ventanas, variables, e incluso el cursor de teclado en el mismo objeto).

Aquello era como hacer "hibernar" a la aplicación, o como una especie de "snap shot" con el que se podía restaurar la sesión aún habiendo apagado o cambiado de computadora.

Estaba encantado con aquellos pequeños artilugios. Ahhhh, que tiempos... :)

oscarac 23-03-2011 21:04:39

yo encontre esta...
que me seria muy util en Delphi para cuando tengo un campo que debe ser validado

Cita:

Function _up
Clear Type
Return inli(Lastkey(), 5, 19, 26, 28)
lo que hace esta funcion es verificar si la tecla pulsada es arriba o izquierda, o home.. etc entonces... cuando hacia un get

Cita:

@10,10 Get _variable1 Pict "@!K' valid !_up() and fvalida_Variable1()
@12,10 Get _variable2 Pict "@!k' valid _up() or fvalida_Variable2()

lo que hace esto es... en el primer GET o edit. no me permitira "subir", entonces lo que coloque en el campo o variable... sera validado pero....
en el segundo get si me permite subir antes de validar la variable...

como dije...
esto me seria muy util en Delphi

roman 23-03-2011 21:06:14

Yo tuve un paso fugaz por FoxPro y lo que hice fue un sistema de menús que calcaba el de Turbo Pascal.

// Saludos

oscarac 23-03-2011 21:21:33

se me acaba de ocurrir una idea...
muchos de nosotros (los que provenimos de otros lenguajes) ya teniamos ciertas rutinas las cuales nos facilitaban la vida

es por eso que propongo la creacion de un mural donde "expongamos" las soluciones que le hemos dado en el lenguaje delphi

por ejemplo

en Foxpro tenia la funcion IIF (asi como el iif de Access)
la solucion en delphi la hice asi

Código Delphi [-]
 
function IIF(Condition: Boolean; TrueString : String; FalseString: String = ''): String; overload;
begin
  if Condition then
    result := TrueString
  else
    result := FalseString;
end;

y su aplicacion....
Código Delphi [-]
qrlSubTitulo.Caption := iif (frmBalanceIntegralGasto.rgRango.ItemIndex = 0, 'Saldos Mensuales','Saldos Acumulados');

gatosoft 23-03-2011 21:23:30

Cita:

Empezado por Al González (Mensaje 394418)
En Delphi sí que has visto ya algo parecido y que además requiere mucho menos código: los parámetros con valor predeterminado.
:)

Como dice Al, en Delphi puedes lograr el mismo efecto con los parámetros con valores por defecto...

A manera informativa, te cuento que existe otra manera de lograr el efecto de utilizar un mismo método con diferentes parámetros, inclusive con diferentes tipos de parámetros... y que por supuesto te va a parecer mas largo, pero es bastante util en diferentes circunstancias... estos son los métodos sobrecargados (overload)...

Código:


En la seccion (interface)
  procedure MyMetodo(Parametro1: Integer; Parametro2: String); overload;
  procedure MyMetodo(Parametro1: Integer); overload;
  procedure MyMetodo; overload;

y en la implementacion

  procedure MyMetodo(Parametro1: Integer; Parametro2: String);
  begin
  end;

  procedure MyMetodo(Parametro1: Integer);
  begin
  end;

  procedure MyMetodo;
  begin
  end;

Como dije, solo a manera informativa

gatosoft 23-03-2011 21:31:47

Ja, ja, creo que respondimos al tiempo y veo que ya tienes implementado tu overload...

curiosamente yo tengo implementada la misma funcion iif en mis programas hace tiempo aunque la implemente con un Variant y así me evité el Overload:
Código:

Function IIF(blnCondicion_p:Boolean; varValorSiVerdadero_p:Variant;varValorSiFalso_p:Variant):Variant;
Begin
  if blnCondicion_p then
    Result:=varValorSiVerdadero_p
  else
    Result:=varValorSiFalso_p;
end;

un saludo,

maeyanes 23-03-2011 22:35:30

Hola...

En Delphi ya existen funciones que realizan eso: IfThen en las unidades Math y StrUtils


Saludos...

oscarac 23-03-2011 22:40:05

obvio que existen !!!!

pero me refiero a la practicidad....

con la funcion determino 1 dato en 1 sola linea

maeyanes 23-03-2011 22:42:29

Hola...

No se que entendiste, pero la función mencionada hace eso precisamente, en una sola línea puedes determinar un solo dato:

Código Delphi [-]
Str := IfThen(Condición, Str1, Str2);


Saludos...

oscarac 23-03-2011 22:44:51

ohhhhhhhh ya caigo

Al González 23-03-2011 22:54:00

El problema con esas funciones es el costo que tiene para la aplicación, porque el compilador no las transforma en código máquina equivalente a un If...Then normal.

Por ejemplo, si el tercer parámetro dado a IfThen es una expresión que llama a otra rutina, ésta se ejecutará aunque el primer parámetro sea True, es decir, se realizará un procesamiento inútil. Y aun cuando las expresiones dadas como valores a devolver sean simples valores literales o variables, la carga para la CPU seguirá siendo mayor que la de un If...Then normal (incluso si IfThen fuese compilada como una función in line).

Supongo que todavía no se agrega un operador ternario en las últimas versiones del compilador de Delphi. Espero que eso ocurra, pero ruego al cielo que no vaya a ser tan horrible como el de C. :p

Gato: Sólo son métodos las rutinas que pertenecen a una clase. Al no estar dentro de una clase, hablamos entonces de funciones / procedimientos independientes (sueltos).

Saludos.

Al González. :)

AÑADO: Claro, pueden hacerse sobrecargas tanto de métodos como de rutinas sueltas.

oscarac 23-03-2011 23:04:22

Al González siempre tan oportuno e iluistrativo con sus comentarios


La franja horaria es GMT +2. Ahora son las 19:47:14.

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