Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-09-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Exclamation 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
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 28-09-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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...
Responder Con Cita
  #3  
Antiguo 28-09-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Gracias Cloayza, tendré que estudiarlo, en cuanto pueda
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 28-09-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
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.
Responder Con Cita
  #5  
Antiguo 28-09-2010
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Mira la función FormatDateTime, quizas lo tengas más claro referente a lo que quieres que te devuelva.

Un saludo.
Responder Con Cita
  #6  
Antiguo 28-09-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
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
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #7  
Antiguo 28-09-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
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?.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #8  
Antiguo 29-09-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Cita:
Empezado por José Luis Garcí Ver Mensaje
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!

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.
Responder Con Cita
  #9  
Antiguo 29-09-2010
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Muchas Gracias Ai (González) perdon por haberte abrebiado el nick
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #10  
Antiguo 29-09-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
Cita:
Empezado por José Luis Garcí Ver Mensaje
Muchas Gracias Ai (González) perdon por haberte abrebiado el nick
Vale. ( )

Saludos.

AL.
Responder Con Cita
  #11  
Antiguo 05-10-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #12  
Antiguo 05-10-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No recuerdo haber usado nunca 'out' , ¿qué ventajas e inconvenientes tiene, Ñuño?
Responder Con Cita
  #13  
Antiguo 05-10-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No recuerdo haber usado nunca 'out' , ¿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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 05-10-2010 a las 12:33:43.
Responder Con Cita
  #14  
Antiguo 05-10-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Está curioso, es realmente para devolver parámetros. Y para evitar el problema que mencionas, ¿no se le puede pasar un valor por defecto?
Responder Con Cita
  #15  
Antiguo 05-10-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cool

Cita:
Empezado por Casimiro Notevi Ver Mensaje
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á!

Claro que lo ideal siempre es no olvidarse nunca de los ELSE y los TRY .. FINALLY, pero en ocasiones merece la pena.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #16  
Antiguo 23-10-2010
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Grid no trae el result correcto Paulao Varios 14 19-03-2009 14:16:52
Alamcenar Result de storedProc desde otra unidad R0M3R0 Conexión con bases de datos 3 22-08-2008 01:32:52
PROCEDURE xxx.yyy can't return a result set in the given context. erian96 MySQL 2 15-07-2006 21:13:49
Result de un Query a dataset walito Conexión con bases de datos 2 19-04-2006 20:38:12
Parametro Result del StoredProc MarcelRuz Conexión con bases de datos 2 11-06-2004 21:24:15


La franja horaria es GMT +2. Ahora son las 14:25:45.


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
Copyright 1996-2007 Club Delphi