Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Es posiblefuncion con varios Result (https://www.clubdelphi.com/foros/showthread.php?t=70074)

José Luis Garcí 28-09-2010 19:29:19

Es posiblefuncion con varios Result
 
Hola compañeros, resulta que tengo varias funciones (sobre fechas) que me devuelven el resultado de maneras diversas, me gustaría saber si es posible que una función devuelva mas de un resultado y si es posible de diversos tipos, su esquema seria más o menos así
Código Delphi [-]
Function DosResultados(Fecha:TDatatime):String;Integer;
HE buscado en foros, webs, libros y google y no encuentro lo que buscoi

cloayza 28-09-2010 19:48:39

Lo que podrias hacer para solucionar el tema a la rapida, es pasar parametros a la funcion y asignar valores de retorno. Un ejemplo

Código Delphi [-]
Function DosResultados(Fecha:TDatatime;Var Return_Integer:Integer; Var Return_String:Strirng):String;
begin
       ...
      Return_Integer:=1;
      return_string:='Valor de retorno';
      ...
      result:='Valor retorno Funcion';
end;

Procedure DosResultados(Fecha:TDatatime;Var Return_Integer:Integer; Var Return_String:Strirng);
begin
       ...
      Return_Integer:=1;
      return_string:='Valor de retorno';
      ...
end;

Para que un parametro como Return_Integer sea posible que sallga de la funcion con su valor modificado debes usar la palabra reservada VAR.

Esto es valido para procedures tambien.
Saludos...

José Luis Garcí 28-09-2010 20:43:41

Gracias Cloayza, tendré que estudiarlo, en cuanto pueda

Al González 28-09-2010 21:12:00

Además de los parámetros por variable o por referencia, también puedes hacer que el resultado de la función sea de tipo registro:

Código Delphi [-]
Type
  TResultado = Record
    Cadena :String;
    Entero :Integer;
  End;

Function Func1 (Const Fecha :TDateTime) :TResultado;
Begin
  Result.Cadena := DateToStr (Fecha);
  Result.Entero := Trunc (Fecha);
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
  R :TResultado;
begin
  R := Func1 (Now);
  ShowMessage (R.Cadena);

  If Func1 (Now).Entero = Date Then
    ShowMessage ('Saludos');
end;

Un saludo.

Al González. :)

olbeup 28-09-2010 21:43:04

Mira la función FormatDateTime, quizas lo tengas más claro referente a lo que quieres que te devuelva.

Un saludo.

José Luis Garcí 28-09-2010 22:05:47

Ai creo que tu respuesta es perfecta, pronto lo comprobare, muchas gracias,.
Olbeup, gracias, pero no es sólo con la idea de usarlo en las funciones que te dije, es para ampliar el uso a otras

José Luis Garcí 28-09-2010 22:08:25

Ai, puedo crear el registro en el mismo archivo pas que tengo mis funciones y luego utilizarlo en los otros archivos pas solo añadiendo el archivo al uses, como hago ahora?.

Al González 29-09-2010 02:08:53

Cita:

Empezado por José Luis Garcí (Mensaje 377807)
Ai, puedo crear el registro en el mismo archivo pas que tengo mis funciones y luego utilizarlo en los otros archivos pas solo añadiendo el archivo al uses, como hago ahora?.

¡Ay, algo me va a dar! :eek: :D

Sí José Luis, puedes usar tu nueva función sin problemas, como lo harías con cualquier otra, desde otra unidad .pas añadiendo en el Uses el nombre de la unidad que la contiene. :)

Saludos al estilo de Al Gore y de Al Capone. ;)

José Luis Garcí 29-09-2010 09:06:57

Muchas Gracias Ai (González) perdon por haberte abrebiado el nick:p

Al González 29-09-2010 15:58:46

Cita:

Empezado por José Luis Garcí (Mensaje 377856)
Muchas Gracias Ai (González) perdon por haberte abrebiado el nick:p

Vale. ;) ( :confused: )

Saludos.

AL. :)

Ñuño Martínez 05-10-2010 12:10:25

Otro ejemplillo: usar el modificador OUT en los parámetros. La ventaja que tiene es que ese parámetro es sólo de salida, por lo que no es apilado al llamar a la función y se ganan unos pocos ciclos de procesador en la llamada.

Código Delphi [-]
PROCEDURE MiProcedimiento (Variable: INTEGER; OUT Respuesta1, Respuesta2: INTEGER);

Evidentemente, si intentas obtener el valor de Respuesta1 o Respuesta2 antes de asignarles un valor, recibirás (como mínimo) un aviso del compilador.

En mi opinión se utilizan poco los modificadores CONST y OUT (sobre todo este último) y deberían usarse más, porque ayudan mucho al compilador a optimizar el código.

Casimiro Notevi 05-10-2010 12:16:41

No recuerdo haber usado nunca 'out' :o, ¿qué ventajas e inconvenientes tiene, Ñuño?

Ñuño Martínez 05-10-2010 12:26:38

Cita:

Empezado por Casimiro Notevi (Mensaje 378434)
No recuerdo haber usado nunca 'out' :o, ¿qué ventajas e inconvenientes tiene, Ñuño?

Con OUT le estás diciendo al compilador que dentro del procedimiento no vas a usar el valor contenido en la variable, pero sí vas a modificar su valor, que luego vas a utilizar desde el procedimiento llamante. Por decirlo de alguna manera, es un caso especial de VAR. Por lo tanto el compilador tiene información de primera mano en cuanto a qué vas a hacer con ese parámetro. En consecuencia:
  1. En ese parámetro sólo pueden usarse variables: ni constantes ni expresiones ni funciones... En esto es igual al modificador VAR.
  2. Como vas a ignorar el valor del parámetro, el compilador puede ahorrarse el apilarlo en la llamada, optimizando la operación.
  3. Como es un parámetro de "sólo salida", el compilador puede optimizar la vuelta (RET) del procedimiento o función.
  4. Si haces algo mal, el compilador te avisa y así puedes encontrar posibles errores en tu algoritmo (por ejemplo, si intentas acceder al contenido del parámetro antes de asignarle nada).

Un posible problema puede darse si finalmente no asignamos ningún valor a los parámetros OUT, ya que entonces la variable podría quedarse con un valor indeterminado (dependiendo del compilador, opciones de optimización, etc.), y esos errores son difíciles de detectar. Por ejemplo:
Código Delphi [-]
FUNCTION Funcion (CONST Entrada: STRING; OUT Salida: STRING): BOOLEAN;
BEGIN
  IF Entrada <> '' THEN Salida := 'Hay entrada';
  RESULT := Length (Entrada) > 5;
END;

 ...
{ ¡Aquí el Label1 puede ser "indefinido" si el Edit1 está vacío! }
  EsLargo := Funcion (Edit1.Text, Label1.Caption);

Muchas veces, cuando usamos el modificador VAR en realidad deberíamos usar OUT (aunque no siempre, ojo). De la misma forma, cuando no usamos ningún modificador muchas veces deberíamos utilizar CONST.

Casimiro Notevi 05-10-2010 12:41:02

Está curioso, es realmente para devolver parámetros. Y para evitar el problema que mencionas, ¿no se le puede pasar un valor por defecto?

Ñuño Martínez 05-10-2010 13:43:08

Cita:

Empezado por Casimiro Notevi (Mensaje 378439)
Está curioso, es realmente para devolver parámetros. Y para evitar el problema que mencionas, ¿no se le puede pasar un valor por defecto?

Pero entonces ya no sería "OUT" sino "VAR". ;)

De todas formas yo tengo como costumbre asignar un valor de retorno en la primera línea de las funciones. De esa forma si olvido un ELSE o similar, el daño es menor. Siguiendo con el ejemplo:
Código Delphi [-]
FUNCTION Funcion (CONST Entrada: STRING; OUT Salida: STRING): BOOLEAN;
BEGIN
  Salida := '';
  RESULT := FALSE;
  IF Entrada <> '' THEN Salida := 'Hay entrada';
  RESULT := Length (Entrada) > 5;
END;

Et voilá! :cool:

Claro que lo ideal siempre es no olvidarse nunca de los ELSE y los TRY .. FINALLY, pero en ocasiones merece la pena.

rastafarey 23-10-2010 05:04:19

Resp
 
Crea una clase y usar un a variable variant y dos propidades asstring y asinteger. en las cuales formateas el resultado dependiendo de como lo quieras.


La franja horaria es GMT +2. Ahora son las 17:08:39.

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