Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2016
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 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
Cita:
Empezado por jhonny Ver Mensaje
¿ghStopWhen es algún método de algún ayudante de TEnumProcResult?
La idea es que en efecto lo sea. Es la primera vez que oigo hablar del tipo TEnumProcResult, pero en cuanto tenga que usarlo no dudaré en crearle su extensión, es decir, su ayudante, escribiendo un método como ghStopWhen o algún nombre similar (se aceptan sugerencias de otros posibles identificadores).

En cuanto a la forma de escribir ese método, una manera simple podría ser como en el siguiente código. Uso para este ejemplo el tipo enumerado TEnumControlsResult, el cuál sí está presente en mi versión de Delphi (esto sí lo he probado):
Código Delphi [-]
Type
  TEnumControlsResultHelper = Record Helper For TEnumControlsResult
    Function ghStopWhen (Const ACond :Boolean) :Boolean;
  End;

//...

  Function TEnumControlsResultHelper.ghStopWhen (Const ACond :Boolean) :Boolean;
  Begin
    If ACond Then
      Self := TEnumControlsResult.Stop
    Else
      Self := TEnumControlsResult.Continue;

    Result := ACond;
  End;

Y ya en estas, considerando que los valores ordinales de System.False, System.True, TEnumControlsResult.Continue, TEnumControlsResult.Discard y TEnumControlsResult.Stop son 0, 1, 0, 1 y 2, respectivamente, una implementación más programadoril, que consume menos ciclos de CPU sería:
Código Delphi [-]
  Function TEnumControlsResultHelper.ghStopWhen (Const ACond :Boolean) :Boolean;
  Begin
    Self := TEnumControlsResult (Ord (ACond) * 2);
    Result := ACond;
  End;

Además el método podría ser declarado Inline, aunque en ese caso modificaría un poco su implementación a fin de resolver cierta impericia del compilador (ese tema me gustaría discutirlo en otro hilo):
Código Delphi [-]
  Function TEnumControlsResultHelper.ghStopWhen (Const ACond :Boolean) :Boolean;
  Begin
    Self := TEnumControlsResult (Ord (ACond) * 2);
    Result := Self = TEnumControlsResult.Stop;
  End;

Cita:
Empezado por jhonny Ver Mensaje
[...]le he hecho click al enlace que tienes en la firma, con el animo de ver su magia pero me sale una página en blanco.
Esto es porque suspendí ese enlace hasta que libere la nueva versión de mi biblioteca, la cual fue redefinida por completo. Ahora es 100% orientada a objetos y los únicos elementos globales que declaro son clases e interfaces (incluso a varios ayudantes los declaro en la sección pública de clases de uso general, como TghSys). Ha sido toda una revolución y un crecimiento personal el aplicar mucho de lo nuevo que trae Delphi y erradicando viejos vicios de mi técnica. La GHF de hace tres años me da vergüenza.

Espero ya pronto subir la nueva GH Freebrary a algún repositorio, y tener la satisfacción de ofrecérselas y recibir productiva retroalimentación. Quizá esta vez sí la uses, Jhonny. Intentaré que sea digna de ello.

Última edición por Al González fecha: 27-03-2016 a las 05:21:53.
Responder Con Cita
  #2  
Antiguo 27-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
Ha sido toda una revolución y un crecimiento personal el aplicar mucho de lo nuevo que trae Delphi y erradicando viejos vicios de mi técnica. La GHF de hace tres años me da vergüenza.
Que coincidencia, hoy justo leyendo este articulo

Punto #9

Cita:
Tus programas nunca serán perfectos ni lo suficientemente buenos. Con el paso de los años te avergonzarás de tu propio código. Esto es bueno, has mejorado.
Responder Con Cita
  #3  
Antiguo 27-03-2016
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 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
Y es verdad, Agustín. Al escribir esa parte de mi mensaje anterior, me vino a la mente aquella reflexión de Galli.

Cada cierto tiempo ocurre que ves al que fuiste y lo que hiciste, notando que ambas cosas han mejorado. Algo anda mal en un individuo cuando pasan muchos años sin presentársele este fenómeno de introspección.

Y hablando de progreso, veo que vas llegando a una de las vallas.
Responder Con Cita
  #4  
Antiguo 27-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Eso demuestra que 'más sabe el diablo por viejo que por diablo'.
Los jóvenes no se dan cuenta que no saben. Con el tiempo van descubren que no sabían, que ahora sí que saben.
Más tarde se vuelven a dar cuenta que tampoco sabían, sino que es ahora cuando saben.
Hasta que llegan a 'viejo' y descubren que toda su vida no han sabido nada, que por fin ya saben...

Si a eso le añadimos el ser de caracter perfeccionista, provoca que nunca estemos contento con nuestro código, siempre necesita reformas, minimizarlo, incluso rehacerlo... y nunca se acaba, cada vez más perfecto, más eficiente... y así toda la vida
Responder Con Cita
  #5  
Antiguo 27-03-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Hombre Al, siempre es tan edificante leer tus post, twits, comentarios... Muchas gracias por tus aportes, siempre se aprende mucho, en cuanto a la GH Freebrary, no es que sea digna o no de usarla, más bien quizá está vez sí esté en la capacidad de aprender más de ella.

En cuanto al comentario de que ahora se sabe más que antes, me viene a la mente ese dicho que dice: "Si el joven supiera y el viejo pudiera..." jejeje, pero la clave de este asunto es saber aplicarla a nosotros mismos, superarnos a nosotros mismos cada vez y no perder mucho el tiempo comparándonos con otros o caeremos en la tentación de olvidar nuestra esencia, nuestra pasión.

Y hasta aquí escribo, que se me va saliendo el "yo" romántico y creo que este no es el lugar
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #6  
Antiguo 31-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Al, por cierto

Cita:
... del tipo TEnumProcResult, pero en cuanto tenga que usarlo no dudaré en crearle su extensión, es decir, su ayudante, escribiendo un método como ghStopWhen o algún nombre similar (se aceptan sugerencias de otros posibles identificadores).
En el framework Spring4D, la interfaz genérica IEnumerable< T > que es implementada por todas las colecciones, tal y como se puede ver en la Wiki o en el código, expone dos metodos llamados TakeWhile, declarados asi:

Código Delphi [-]
    ///  < summary >
    ///    Returns elements from a sequence as long as a specified condition is
    ///    true.
    ///  < /summary >
    function TakeWhile(const predicate: TPredicate< T >): IEnumerable< T >; overload;

    ///  < summary >
    ///    Returns elements from a sequence as long as a specified condition is
    ///    true. The element's index is used in the logic of the predicate
    ///    function.
    ///  < /summary >
    function TakeWhile(const predicate: TFunc< T, Integer, Boolean >): IEnumerable< T >; overload;

Quiza sea mas idiomático ya que TakeWhile, el While le podria recordar a cualquier desarrollador a la estructura de control y de ese modo dar una pista bastante certera de cual es su funcionalidad, sin necesidad de leer documentacion o implementacion

Luego hay otro curioso metodo que puede resultar util (ya que estamos), y es el SkipWhile, que basicamente es lo contrario del anterior

Código Delphi [-]
    ///  < summary >
    ///    Bypasses elements in a sequence as long as a specified condition is
    ///    true and then returns the remaining elements.
    ///  < /summary >
    function SkipWhile(const predicate: TPredicate< T >): IEnumerable< T >; overload;

    ///  < summary >
    ///    Bypasses elements in a sequence as long as a specified condition is
    ///    true and then returns the remaining elements. The element's index is
    ///    used in the logic of the predicate function.
    ///  < /summary >
    function SkipWhile(const predicate: TFunc< T, Integer, Boolean >): IEnumerable< T >; overload;

Un saludo

EDITO:

Por cierto Casimiro, no será posible hacer algo con la sintaxis para los genéricos? Cuando se usan las etiquetas de código:

Cita:
TList<Integer>
Se convierte en:

Código Delphi [-]
  TList

Última edición por AgustinOrtu fecha: 31-03-2016 a las 20:34:48.
Responder Con Cita
  #7  
Antiguo 31-03-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Agustín, de pura curiosidad, ¿La función llamada ElementAt implementada en dicha interfaz es con el fin de filtrar la colección o sería más bien con el propio TakeWhile?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 31-03-2016 a las 21:24:42.
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
Crear un TPanel dentro de un TPanel dentro de un TScrollBox TiammatMX OOP 6 10-02-2014 15:12:08
Recorrer una tabla dentro de un Procedure en MSSQL Softweb SQL 5 21-07-2010 21:08:44
Duda sobre destrucción de objetos compuestos por otros objetos noob OOP 11 16-02-2009 00:28:33
Crear objetos dentro de otro objeto. Nieto OOP 5 28-11-2007 23:09:12
Recorrer todos los objetos creados de una clase propia mierda OOP 1 25-10-2007 19:52:10


La franja horaria es GMT +2. Ahora son las 23:59:43.


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