3ENGINE

Programación y otros cachivaches

Etiqueta: programacion

Página 5/21

Tecnologia

Delphi: cómo almacenar contenido como recurso en el propio ejecutable y extraerlo


A veces puede interesar almacenar recursos en el propio ejecutable de Delphi. Ya sean imágenes que la aplicación utiliza o disponer de una hoja de cálculo que el usuario puede abrir desde la propia aplicación o una página HTML para abrirla desde el propio navegador que ofrece Delphi, etc. Además también consigues que al distribuir la aplicación con entregar el ejecutable (exe) ya es suficiente. Aquí te explico cómo hacer todo esto.

almacenar contenido como recurso en el propio ejecutable de delphi

Pasos para almacenar recursos en el propio ejecutable de Delphi:

1. Crear un fichero de texto con extensión .rc , por ejemplo ‘aboutresource.rc’

2. Editar el fichero, especificando para cada recurso y en una linea de texto el nombre del recurso, el formato y la ruta. Ejemplo:

ABOUT HTML "D:\Delphi\miproyecto\about.htm"
FINISH PNG "D:\Delphi\miproyecto\finish.png"
ACERCA_DE GIF "c:\libreria\about.gif"

3. Crear el fichero de recursos desde la línea de comandos con:

  BRCC32 aboutresource.RC

4. Añadir en la Unit que nos interese, la directiva:

  {$R aboutresource.RES}

La siguiente rutina extrae y graba en un fichero el recurso especificado donde le indiquemos:

{$R aboutresource.RES} 
procedure ExtractResource(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
  Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
  Res.SavetoFile(ResNewName);
  Res.Free;
end;

Ejemplo de uso:

 ExtractResource('GIF','ACERCA_DE','c:\miabout.gif');

Recursos:
Web Site inside a Delphi EXE
Run a EXE RESOURCE file … (Read Inside)




Tecnologia

Chuleta javax.servlet para preparar el OCEJWCD/SCWCD


Hace unas semanas conseguí el Oracle Certified Expert, Java EE 5 Web Component Developer.

Para prepararme el examen, fui recopilando en un documento las clases del espacio de nombres javax.servlet y sus métodos que aparecen en un momento u otro en la documentación y test de prueba que realicé.

Podéis descargar el documento en formato PDF desde este enlace por si os sirve de ayuda.




Tecnologia

Convertir un datetime a cadena formateada en SQL Server


Si necesitas mostrar en un select una cadena de tipo datetime y quieres cambiar su formato, puedes hacer servir la función CONVERT para SQL Server.

CONVERT(data_type(length),data_to_be_converted,style)

Parámetros style aceptados:

ID EstiloFormato Estilo
100 o 0mon dd yyyy hh:miAM (o PM)
101mm/dd/yy
102yy.mm.dd
103dd/mm/yy
104dd.mm.yy
105dd-mm-yy
106dd mon yy
107Mon dd, yy
108hh:mm:ss
109 o 9mon dd yyyy hh:mi:ss:mmmAM (o PM)
110mm-dd-yy
111yy/mm/dd
112yymmdd
113 o 13dd mon yyyy hh:mm:ss:mmm(24h)
114hh:mi:ss:mmm(24h)
120 o 20yyyy-mm-dd hh:mi:ss(24h)
121 o 21yyyy-mm-dd hh:mi:ss.mmm(24h)
126yyyy-mm-ddThh:mm:ss.mmm(sin espacios)
130dd mon yyyy hh:mi:ss:mmmAM
131dd/mm/yy hh:mi:ss:mmmAM

Ejemplo:

SELECT CONVERT(VARCHAR(24),GETDATE(),113) 

Referencias:
What are the valid styles for converting datetime to string?
SQL Server CONVERT() Function
How to convert from string to datetime?




Tecnologia

Ejecutar una macro externa en un .csv de Excel y grabar el resultado en formato .xls de Excel


Si necesitais darle un poco de vida y colorido a un fichero en formato .csv de Excel. Quizas os sirva este ejemplo. Se trata de ejecutar una macro previamente grabada para darle un nuevo formato a la hoja Excel (colorear columnas, cambiar de tamaño las letras, crear gráficos, etc…) para despues grabar el resultado en formato .xls. Comparto este código escrito en c# por si puede ser útil.

Requisito 1: antes de ejecutar el código es importante habilitar la opción «Confiar en el acceso a proyectos de Visual Basic» en la pestaña «Editores de confianza» que se encuentra en Herramientas>Macro> Seguridad.

Requisito 2: debeis tener instaladas las PIAS para Excel.

Código:


    using Microsoft.Office.Interop.Excel;
    using Microsoft.Vbe.Interop;
    .
    .
    public static class MacroExcel
    {
        /*
         * ejecuta macro sobre un csv y devuelve path del xls resultante
         */        public static string abrirCsvEjecutarMacroyGrabarXls(string pathFicheroCsv, string pathMacro, string nombreFuncionMacro)
        {            
            object missing = System.Reflection.Missing.Value;
            string pathXls = Path.ChangeExtension(pathFicheroCsv, "xls");
            //
            // abrir csv
            //
            ApplicationClass excel = new ApplicationClass();
            Workbooks books = excel.Workbooks;
            _Workbook book = books.Open(pathFicheroCsv, missing, missing, missing, missing, missing, missing, missing, missing,
                            missing, missing, missing, missing, missing, missing);
            try
            {
                //                      
                // abrir macro
                //
                VBComponentClass vbComp = (VBComponentClass)excel.VBE.ActiveVBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
                vbComp.CodeModule.AddFromFile(pathMacro);
                //
                // ejecutar macro
                // 
                excel.Run(nombreFuncionMacro, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing, missing, missing, missing, missing, missing, missing, missing,
                    missing, missing, missing);
                //
                // eliminar la macro del xls
                //
                vbComp.CodeModule.DeleteLines(1, vbComp.CodeModule.CountOfLines);
                //
                // grabar xls
                //
                File.Delete(pathXls);
                book.SaveAs(pathXls, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, missing,
                    missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
            }
            finally
            {
                books.Close();
            }
            return pathXls;
        }
    }

Referencias:
Enlace 2
Enlace 1