Ir al contenido


Foto

[RESUELTO] Es posible crear funciones con nulos


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 25 noviembre 2010 - 04:12

Pues eso si es posible crear funciones, donde podamos dejar parámetros en blanco (nulo)mas o menos que podamos hacer lo siguiente

delphi
  1. Function mensaje(Text:String):String;

Podamos poner

delphi
  1. mensaje();

Y nos devuelva 'Mensaje Vació' en un Showmessage y en cambio si ponemos

delphi
  1. mensaje('Hola a la Comunidad');

nos devuelva'Hola a la Comunidad' en un Showmessage.  Como siempre gracias por vuestra ayuda.
  • 0

#2 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 25 noviembre 2010 - 04:21

Si el parámetro fuera un puntero, le pasaría nil, incluso si fuera un PChar, pero siendo un tipo string, ¿no te vale una cadena vacía?



delphi
  1. Mensaje('')



Si lo que quieres es no tener que pasar nada entre los paréntesis, puedes definir la función con un parámetro por defecto:



delphi
  1. function Mensaje(Text: string = '');



y llamarlo como tú quieres.

  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2010 - 04:32

Si, es posible definir una función con un parámetro por defecto:



delphi
  1. function mensaje(Text: String = ''):String;



Saludos.

  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 noviembre 2010 - 06:35

Hay que aclarar que dependiendo de lo que debe hacer la función o el procedimiento dentro es posible que deba aplicarse algún control sobre el valor del parámetro dado, por ejemplo:



delphi
  1. procedure HacerAlgo(Algo: integer = VALOR_DEFECTO);
  2. begin
  3. if Algo = VALOR_DEFECTO
  4.   then ...
  5.   else ...
  6. end;



Hay que tener en cuenta que el valor por defecto no quiere decir que no se pase dicho parámetro... sino que el compilador asumirá que para ese parámetro se le está pasando un valor por defecto o estándar. De modo que si al ejemplo anterior se ha definido:



delphi
  1. const
  2. VALOR_DEFECTO = 100;



Cuando uno hace:



delphi
  1. HacerAlgo;



Le está indicando que el valor del parámetro Algo asuma el valor definido por la constante. En este caso 100. No es que algo tendrá un valor "vacío".

Esto sería equivalente:



delphi
  1. HacerAlgo(100);
  2. // ó también:
  3. HacerAlgo(VALOR_DEFECTO);



Saludos,
  • 0

#5 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 25 noviembre 2010 - 06:54

Gracias a los tres (Andres1569, Escafandra y Delphius), he probado y no funciona, no se si es que hago algo mal, si en lo que puso delphi, debería definir antes la función, el valor por defecto de los parámetros, pero creo que lo mejor os pongo el código, y así os hacéis una idea de lo que pretendo. De todas maneras, seguramente, este fin de semana publique un par de funciones hechas por mi esta semana, si soluciono esta, la añadiré, con las otras.



delphi
  1. //------------------------------------------------------------------------------
  2. //**********************************************************[ MIAUTOCOD ]*******
  3. // JLGT 25/11/2010  Se encarga de ajustar el código a un largo determinado,
  4. // teniendo como control inicial la decena del año, más un número de control
  5. // Con la inestimable ayuda de Andres1569, Escafandra y Delphius del DelphiAcces
  6. // ---------Ejemplo------------
  7. // En el OnExit de un Edit o DbEdit
  8. // TDbedit(Sender).text:=MiAutoCod(,TDbEdit(Sender).text,,);
  9. //------------------------------------------------------------------------------
  10.  
  11. Function  MiAutoCod(Tipo:    String='L';        //Tipo de código, para L para lote, F, para Factura, A para albaranes, O para otros por defecto ''
  12.                     Cod:      String='0';        //Valor del Código por defecto 0
  13.                     Fecha:    String=' ' ;      //Para capturar el año para el inicio del lote
  14.                     Long:    integer=0):string; //Lago que debe adquirir la cadena
  15. var CadDoc,TxtFormat : string; Year, Month, Day: Word; Vano, Vlargo: Integer;
  16. begin
  17.   if fecha='' then fecha:=datetostr(Now);
  18.   DecodeDate(Strtodate(Fecha), Year, Month, Day);
  19.   Vano := StrToInt(AnsiRightStr(Inttostr(Year), 2));
  20.   tipo:=UpperCase(Tipo);
  21.   if ((Tipo='L') or (tipo='F')) then Vlargo:=6  //Si es tipo Factura o Lote largo de 6
  22.   else
  23.   begin
  24.     if tipo='A' then Vlargo:=7                  //Si es tipo Albarán largo de 7
  25.     else
  26.     begin
  27.       if Tipo='O' then Vlargo:=Long            //Si es tipo Otro el largo lo determina long
  28.                   else Vlargo:=0;              // Si no es ninguno de ellos largo 0
  29.     end;
  30.   end;
  31.   if (Length(Cod) <> Vlargo) then
  32.     begin
  33.       TxtFormat:='%.2d%.'+IntToStr(Vlargo-2)+'d';
  34.       CadDoc := Format(TxtFormat, [Vano, StrToInt(cod)]);
  35.     end;
  36. end;



Como sigo con los problemas al plantear el código, os agrego un txt, para que lo podáis leer adecuadamente.

--------------------------------
Edito para reparar el código.

Archivos adjuntos


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2010 - 08:14

Desart, si estas usando Chrome, últimamante de problemas como el que comentas.

He reparado la visualización de tu código. Si usas la resopuesta rápida no tendrás este efecto aunque luego lo edites de forma normal.

Saludos.
  • 0

#7 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 25 noviembre 2010 - 08:17

Doy este tema por resuelto, el único problema que persiste es si dejo valores por medio sin poner, pero por lo menos, funciona de manera bastante correcta, añadido el tema de las contantes y el result, modificado el orden de los parámetros a continuación pongo el código y añado un Txt, al final de este pongo algunos ejemplos

Archivos adjuntos


  • 0

#8 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 25 noviembre 2010 - 08:21

Escafandra, gracias por tu respuesta al problema de mi código, si uso Chrome, anulare el código puesto anteriormente, y lo pongo aquí.







delphi
  1. const                  //Para Función MiAutoCod
  2.   VMiAutoCodTipo='L';
  3.   VMiAutoCodCod='0';
  4.   VMiAutoCodFC=' ';
  5.   VMiAutoCodLong=0;
  6.  
  7.  
  8.  
  9. //------------------------------------------------------------------------------
  10. //**********************************************************[ MIAUTOCOD ]*******
  11. // JLGT 25/11/2010  Se encarga de ajustar el código a un largo determinado,
  12. // teniendo como control inicial la decena del año, más un número de control
  13. // Con la inestimable ayuda de Andres1569, Escafandra y Delphius del DelphiAcces
  14. // ---------Ejemplo------------
  15. // En el OnExit de un Edit o DbEdit
  16. // TDbedit(Sender).text:=MiAutoCod(,TDbEdit(Sender).text,,);
  17. //------------------------------------------------------------------------------
  18.  
  19. Function  MiAutoCod(Cod:      String=VMiAutoCodCod;          //Valor del Código por defecto 0
  20.                     Tipo:    String=VMiAutoCodTipo;          //Tipo de código, para L para lote, F, para Factura, A para albaranes, O para otros por defecto ''
  21.                     Long:    integer=VMiAutoCodLong;        //Lago que debe adquirir la cadena
  22.                     Fecha:    string=VMiAutoCodFC):string;    //Para capturar el año para el inicio del lote
  23. var CadDoc,TxtFormat : string; Year, Month, Day: Word; Vano, Vlargo: Integer;
  24. begin
  25.   CadDoc:='';
  26.   if Fecha=' ' then fecha:=DateToStr(now);
  27.   DecodeDate(Strtodate(Fecha), Year, Month, Day);
  28.   Vano := StrToInt(AnsiRightStr(Inttostr(Year), 2));
  29. //  ShowMessage('Fecha: ' +fecha+ #13#10+
  30. //              'Código:' +cod+ #13#10+
  31. //              'Tipo:  ' +Tipo+ #13#10+
  32. //              'Largo: ' +IntToStr(long)+ #13#10+
  33. //              'Año:  ' +IntToStr(Vano));
  34.   tipo:=UpperCase(Tipo);
  35.   if ((Tipo='L') or (tipo='F')) then Vlargo:=6  //Si es tipo Factura o Lote largo de 6
  36.   else
  37.   begin
  38.     if tipo='A' then Vlargo:=7                  //Si es tipo Albarán largo de 7
  39.     else
  40.     begin
  41.       if Tipo='O' then Vlargo:=Long            //Si es tipo Otro el largo lo determina long
  42.                   else Vlargo:=0;              // Si no es ninguno de ellos largo 0
  43.     end;
  44.   end;
  45.   if (Length(Cod) <> Vlargo) then
  46.   begin
  47.       TxtFormat:='%.2d%.'+IntToStr(Vlargo-2)+'d';
  48.       CadDoc := Format(TxtFormat, [Vano, StrToInt(cod)]);
  49.   end;
  50.   Result:=CadDoc;
  51. end;


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 noviembre 2010 - 08:23

Una vez que declaras un parámetro por defecto, el resto deben tener su opción por defecto, de forma que siempre deben ser los últimos y todos seguidos.

Para evitar el código sin saltos de línea:
Trata de responder con la respuesta rápida, luego le das a visualizar y sigues editando normalmente....


Saludos.
  • 0

#10 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 25 noviembre 2010 - 08:26

GRacias  de nuevo escafandra, así lo hare, aquí dejo los ejemplos



delphi
  1. procedure TForm1.MiEditExit(Sender: TObject);
  2. var Tex:string;
  3. begin                                                                  // Fecha de la prueba 25/11/2010
  4.     tex:=MiEdit.Text;                                            //Valor:=125
  5.     MiEdit.Text:=MiAutoCod(Tex);                            //Lote                            //Resultado 100125
  6.     Edit7.Text:=MiAutoCod(Tex,'F');                        //Factura                          //Resultado 100125 
  7.     Edit8.Text:=MiAutoCod(Tex,'A');                        //Albarán                        //Resultado 1000125
  8.     Edit9.Text:=MiAutoCod(Tex,'O',9);                      //Otros long 9                  //Resultado 100000125
  9.     Edit10.Text:=MiAutoCod(Tex,'O',9,'12/12/2009');  //Otros Long 9 y año 2009  //Resultado 090000125 
  10. end;


  • 0




IP.Board spam blocked by CleanTalk.