Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Bibliotecas de código fuente > [GH Freebrary]
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
Ejemplos comparativos de GH Freebrary

El propósito de este hilo es tomar muestras de código Delphi de la Red e indicar cómo escribir "la misma idea", pero empleando GH Freebrary. Como en cualquiera de los otros hilos del foro, todo el mundo es libre de participar poniendo ejemplos y adaptaciones que contribuyan a explicar las ventajas de esta biblioteca de programación.

Considero que estos ejemplos, emanados de programas y prácticas de la vida real, ayudarán a comprender cuándo y por qué es útil el uso de esta biblioteca (sin olvidarnos del naciente manual de referencia). En lo personal me resulta más apropiado plantear estas bien intencionadas comparaciones aquí, en el foro GHF, que hacerlo directamente donde se encuentre el código de muestra, pues sería un poco entrometido de mi parte y desvirtuaría el tema tratado en esos lugares.

En el presente hilo toda mención a código ajeno ha de hacerse con el debido respeto a su autor, y el debate no ha de adquirir posiciones dogmáticas sobre qué soluciones son mejores que otras, sino más bien orientarse a descubrir cómo podemos solucionar las misas cosas con clases, funciones y otros elementos de GH Freebrary y el valor agregado que eso tiene.

Comencemos pues...

Última edición por Al González fecha: 17-10-2013 a las 02:40:39. Razón: Poner acento y actualizar enlace
Responder Con Cita
  #2  
Antiguo 05-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
ghDirPath y ghInform

Aquí podemos encontrar estas tres sentencias de código:
Código Delphi [-]
begin
  ...
  PDFReport1.Filename := GetCurrentDir()+'\prueba.rep';
  PDFReport1.PDFFilename := GetCurrentDir()+'\prueba.pdf';
  ...
  Application.MessageBox(PChar('Listado exportado correctamente:' +
    #13 + #13 + PDFReport1.PDFFilename), 'Exportando', MB_ICONINFORMATION);
Tal vez este no sea el caso, pero suponiendo que lo sea, he notado que suele utilizarse la función GetCurrentDir para formar una ruta de archivo relativa a la del programa ejecutable. Pero eso puede ser engañoso, porque las funciones nativas GetCurrentDir y GetCurrentDirectory no necesariamente devuelven el directorio del programa ejecutable, sino sencillamente el "directorio actual", el cual puede ser cambiado inadvertidamente por algún elemento del programa que trabaje con el sistema de archivos. Para derivar una ruta de la del programa ejecutable tenemos la función ghDirPath.

Por otra parte, casi nunca es cómodo escribir o leer una llamada a la función MessageBox de la API de Windows (o al método de TApplication que lleva el mismo nombre) por lo especial de sus parámetros: Las cadenas no son de tipo String sino PChar, así que con frecuencia se recurre a moldes de tipos "PChar(Cadena)"; además primero debe indicarse el texto interior de la ventana y luego su título, cuando la lógica común de cualquier diseño es indicar primero el título de la ventana y luego su contenido; y finalmente la constantes MB_ICONXXX no son precisamente estéticas, abultan el código y restan legibilidad. ¿Existe una función sencilla de manejar que muestre un simple cuadro de texto con el icono de información? Sí, su nombre es ghInform.

El anterior bloque de código quedaría así:
Código Delphi [-]
Uses
  GHFRTL, GHFVCL;

Begin
  ...
  PDFReport1.Filename := ghDirPath ('prueba.rep');
  PDFReport1.PDFFilename := ghDirPath ('prueba.pdf');
  ...
  ghInform ('Exportando', 'Listado exportado correctamente:'#13#13 +
    PDFReport1.PDFFilename);
Sólo es necesario añadir a la cláusula Uses la unidad GHFRTL (que contiene a ghDirPath) y la unidad GHFVCL (que contiene a ghInform).
Responder Con Cita
  #3  
Antiguo 05-08-2013
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 361
Poder: 19
Jose Roman Va por buen camino
Gracias por el aporte, no sabia nada al respecto (me considero un novato avanzado) ojala aporten mas ejemplos que ayudan mucho.
Responder Con Cita
  #4  
Antiguo 06-08-2013
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 22
AzidRain Va camino a la fama
Yo siempre he usado:
Código Delphi [-]
ExtractFilePath(Application.ExeName);
ya que lo que dice Al es muy cierto GetCurrentDir solo nos devuelve el directorio de trabajo actual y puede haber sido cambiado por la aplicación, la propiedad ExeName por otro lado, contiene todo el path completo del ejecutable se haya ejecutado de donde haya sido (inclusive una memoria USB).
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #5  
Antiguo 06-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
Código Delphi [-]
  DirPrograma := ExtractFileDir (Application.ExeName);
  ...
  RutaReporte := ExtractFilePath (Application.ExeName) + 'Reporte.pdf';
Alternativa:
Código Delphi [-]
  DirPrograma := ghExeDir;
  ...
  RutaReporte := ghDirPath ('Reporte.pdf');
Además de ser más cortas, las segundas opciones no requieren la existencia del objeto Application (algunos programas prescinden de la unidad Forms).
Responder Con Cita
  #6  
Antiguo 06-08-2013
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 22
AzidRain Va camino a la fama
Me quedo con mi solución, es cierto que requieres la unidad Forms, pero esa ya viene por defecto y el objeto Application se crea y regula automáticamente. Si ya viene con muchas otras opciones ¿Por qué no usarlo? Claro a menos que en ninguna parte de nuestro poyecto usemos la unidad citada, pero en todo caso todo se resumen e usar o no una unidad adicional (una de ellas nativa), ya sea "forms" o las de GHFreebrary. Al final en los dos casos se obtiene exactamente lo mismo.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #7  
Antiguo 06-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
Será que me gusta mucho la brevedad del código.
Responder Con Cita
  #8  
Antiguo 06-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Al González Ver Mensaje
Será que me gusta mucho la brevedad del código.
A mí también.
Cada vez que tengo que usar extractfilepath o alguna función similar me da sensación de obsoleta.
Responder Con Cita
  #9  
Antiguo 08-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
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:
Código Delphi [-]
F := FormatDateTime ('yyyy-mm-dd"T"hh:nn:ss', Now);
Pero podemos recurrir a algo más sencillo:
Código Delphi [-]
F := ghISODateTime;
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 18:10:37.
Responder Con Cita
  #10  
Antiguo 08-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código Delphi [-]
F := ghISODateTime;
Lo bueno, si breve, dos veces bueno
Responder Con Cita
  #11  
Antiguo 10-08-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
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:
Código Delphi [-]
  function GetTagValue(const ATag: String): String;
  var
    p: Integer;
  begin
    p := pos('=', ATag);

    if p = 0 then
      Result := ''
    else
      Result := copy(ATag, p + 1, MaxInt);
  end;
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:
Código Delphi [-]
  Function GetTagValue (Const ATag :String) :String;
  Begin
    Result := ghRightOf (ATag, '=');
  End;
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.
Responder Con Cita
  #12  
Antiguo 16-10-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
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:
Código Delphi [-]
Procedure ...
Var
  B :Boolean;
Begin
  B := qry_edo_habestatus.value = 'DES';
  BTN1.Enabled := B;
  BTN2.Enabled := Not B;
  BTN3.Enabled := Not B;
  BTN4.Enabled := Not B;
  BTN5.Enabled := Not B;
  BTN6.Enabled := Not B;
End;
Usando GHF, podría reducirse a:
Código Delphi [-]
Procedure ...
Begin
  BTN1.Enabled := qry_edo_habestatus.value = 'DES';
  ghEnable ([BTN2, BTN3, BTN4, BTN5, BTN6], Not BTN1.Enabled);
End;
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.
Responder Con Cita
  #13  
Antiguo 16-10-2013
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
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/
Responder Con Cita
  #14  
Antiguo 16-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Una duda, curiosidad: ¿por qué el espacio en blanco tras la coma?
Responder Con Cita
  #15  
Antiguo 16-10-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
Una función muy útil, muchas veces uno necesita algo así y no se detiene a pensar que podría ayudarle, gracias Al .
Un placer Jhonny, gracias.

Cita:
Empezado por Casimiro Notevi Ver Mensaje
Una duda, curiosidad: ¿por qué el espacio en blanco tras la coma?
Hola Casi, es sólo una cuestión de estilo, para mayor legibilidad.
Responder Con Cita
  #16  
Antiguo 21-10-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
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:
Código Delphi [-]
else
  raise Exception.Create(SysErrorMessage(GetLastError));
Con GHF, para obtener el texto del error, podemos usar la función ghLastErrorMsg:
Código Delphi [-]
else
  raise Exception.Create (ghLastErrorMsg);
Pero podemos simplificar un poco más toda la sentencia usando la función ghRaiseLastError:
Código Delphi [-]
else
  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:
Código Delphi [-]
ghRaiseLastError ('No fue posible realizar la operación.'#13#10 +
  'Error interno %1:d (%0:s).');
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 01:40:04.
Responder Con Cita
  #17  
Antiguo 22-08-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
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
Me alegra saber que en el club hay compañeros que sí aprecian y valoran de buena fe los ejemplos que he venido escribiendo sobre el uso de GH Freebrary.

Pongamos uno más, simplificando ligeramente este código del compañero wilcg:
Código Delphi [-]
Uses
  GHFRTL;
...
  with Query do
  begin
    SQL.Clear;
    SQL.Add ('Select * from pagos');
    SQL.Add ('where codventa = ' + QuotedStr (edtCodigo.Text));
    SQL.Add ('and f_venta = ' + ghQuotedSQLDate (edtFVdenta.Date)) ;
    SQL.Add ('and f_pago between ');
    SQL.Add (ghQuotedSQLDate (edtDesde.Date));
    SQL.Add ('and '+ ghQuotedSQLDate (Date));
    SQL.Add ('Order By f_pago desc');
    Open;
  end;
La función ghQuotedSQLDate convierte un valor de tipo fecha en su representación literal SQL, es decir, bajo el formato universal aaaa-mm-dd y con una comilla a cada lado. La fecha de hoy, por ejemplo, queda como '2014-08-22' lo cual permite añadirla a cualquier sentencia SQL como el Select del ejemplo. Sin el potencial problema de la configuración regional del sistema operativo o del motor de la base de datos.
Responder Con Cita
  #18  
Antiguo 22-08-2014
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 19
TiammatMX Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
... Sin el potencial problema de la configuración regional del sistema operativo o del motor de la base de datos...
Hace un año, ésta función me habría salvado de dos desveladas seguidas peléandome con MSSQLServer y su "bendita" manera de pedir la fecha... ¬¬

¡¡Gracias, compadre!!
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #19  
Antiguo 22-08-2014
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 15
pacopenin Va por buen camino
. Tengo que dedicarle algo de tiempo, pero a veces somos tan cabezotas....
__________________
http://www.gestionportable.com
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
Sondeo sobre la biblioteca GH Freebrary Al González [GH Freebrary] 23 08-02-2015 22:12:03
GH Freebrary para Delphi XE4 Al González [GH Freebrary] 18 22-09-2014 19:24:04
GH Freebrary para Delphi XE2 Al González [GH Freebrary] 7 12-01-2014 09:49:35
Avanzando con GH Freebrary Al González [GH Freebrary] 13 23-03-2013 08:08:03
Introducción a GH Freebrary Al González [GH Freebrary] 0 18-03-2013 11:11:54


La franja horaria es GMT +2. Ahora son las 19:57:36.


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