FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
ghISODateTime
Ocasionalmente necesitamos un valor de fecha y hora expresado en formato ISO, y a veces tomamos ese valor de lo que devuelve la función nativa Now (la fecha y la hora actuales) para darle tal formato con FormatDateTime.
Es decir, es normal y válido usar algo como esto: Pero podemos recurrir a algo más sencillo: No perdamos de vista que con frecuencia escribimos grupos de sentencias que contienen varias expresiones, a veces unas dentro de otras, en bloques de código fuente que pueden volverse algo complejos aunque se compongan de unas cuantas líneas. Cuando reducimos el tamaño de las expresiones (sin quitarles del todo su expresividad), conseguimos un código fuente más manejable. Última edición por Al González fecha: 08-08-2013 a las 17:10:37. |
#2
|
||||
|
||||
Lo bueno, si breve, dos veces bueno |
#3
|
||||
|
||||
ghRightOf
En esta página se propone una solución que conlleva cierta cantidad de código, dentro del cual se presenta esta función:
Como puede verse, si la cadena dada contiene el símbolo "=", la función devolverá la subcadena que forman todos los caracteres que estén a la derecha de ese símbolo. Y de no incluir el símbolo de igualdad, entonces devolverá cadena vacía. Observen cómo el código de dicha función puede reducirse a una sola sentencia si ponemos GHFRTL en el Uses: La nueva GetTagValue hará exactamente el mismo trabajo, pero con menos esfuerzo por parte de quien escribe la función y sobre todo de quienes luego la lean. Obtener lo que una cadena lleva a la derecha de un carácter específico es algo tan común, que justificó la existencia de la función ghRightOf. Este hilo, como los demás, está abierto a cualquier duda o inquietud que deseen expresar. Saludos. |
#4
|
||||
|
||||
ghEnable
Con la función ghEnable, de la unidad GHFUtils, podemos habilitar o inhabilitar un grupo de controles (componentes visuales), sin tener que escribir una instrucción "Control.Enabled := ..." por cada uno.
Tomo como ejemplo este caso, donde el código que se propone es esencialmente: Usando GHF, podría reducirse a: Como puede apreciarse, pasamos de siete a sólo dos instrucciones y nos ahorramos la variable de tipo Boolean. Así pues, escribimos menos código sin restarle demasiada comprensibilidad. Además, cuando se tenga la necesidad de agregar otro botón al grupo, tan sólo habremos de añadir una coma, un espacio y el nombre del botón, por ejemplo ", BTN7", en lugar de una sentencia completa "BNT7.Enabled := ...". El uso de estas simplificaciones de código permite generar programas más concisos, y también más manejables a través del tiempo: No es lo mismo comenzar a modificar una unidad de 700 líneas de código que no habíamos abierto en cinco años, que hacer lo mismo con una unidad de 250 líneas. El código repetitivo puede ser un obstáculo importante a la hora de dar mantenimiento a los sistemas. Saludos cordiales. |
#5
|
||||
|
||||
Una función muy útil, muchas veces uno necesita algo así y no se detiene a pensar que podría ayudarle, gracias Al .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
#6
|
||||
|
||||
Una duda, curiosidad: ¿por qué el espacio en blanco tras la coma?
|
#7
|
||||
|
||||
Cita:
Hola Casi, es sólo una cuestión de estilo, para mayor legibilidad. |
#8
|
||||
|
||||
ghLastErrorMsg y ghRaiseLastError
Quienes han usado directamente la API de Windows tendrán muy presente que esta no suele elevar excepciones al ocurrir una situación de error. En lugar de eso, la API de Windows establece un código de error numérico que podemos recuperar con la función GetLastError. A veces es necesario convertir este código de error a algo que sea relativamente comprensible para el usuario de la aplicación (aunque más útil para el programador que recibirá el reporte del usuario), y para ello Delphi cuenta con la función SysErrorMessage, la cual envuelve a la función FormatMessage del sistema operativo.
También es común que, una vez obtenido el texto del error, queramos elevar una excepción Delphi con él. Así ocurre por ejemplo en este caso: Con GHF, para obtener el texto del error, podemos usar la función ghLastErrorMsg: Pero podemos simplificar un poco más toda la sentencia usando la función ghRaiseLastError: Internamente, esta función llama a ghLastErrorMsg y eleva una excepción con el texto del error. Además, ghRaiseLastError admite un parámetro opcional de tipo String para indicar el formato a dar al mensaje de error. Si no se especifica el formato, se utiliza el predeterminado '%s (GetLastError %d).', viéndose el mensaje de excepción como en este ejemplo: El formato se aplica con la función estándar Format que todos conocemos. "%s" indica en qué parte del mensaje de excepción debe ghRaiseLastError poner el texto del error devuelto por ghLastErrorMsg. "%d" significa que en esa posición debe aparecer el código de error numérico que arrojó GetLastError. Cualquiera de los dos comodines puede ser omitido, por lo que el formato de la excepción es totalmente flexible. Sólo considerar que en la llamada interna a Format, el texto del error es el primer parámetro y el código numérico el segundo. Otro ejemplo: Resultado: Posteriormente agregaré la documentación detallada de estas dos funciones al manual de referencia. Un saludo. Al González. Última edición por Al González fecha: 22-10-2013 a las 00:40:04. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Sondeo sobre la biblioteca GH Freebrary | Al González | [GH Freebrary] | 23 | 08-02-2015 21:12:03 |
GH Freebrary para Delphi XE4 | Al González | [GH Freebrary] | 18 | 22-09-2014 18:24:04 |
GH Freebrary para Delphi XE2 | Al González | [GH Freebrary] | 7 | 12-01-2014 08:49:35 |
Avanzando con GH Freebrary | Al González | [GH Freebrary] | 13 | 23-03-2013 07:08:03 |
Introducción a GH Freebrary | Al González | [GH Freebrary] | 0 | 18-03-2013 10:11:54 |
|