Info Delphi

La magia de la programación a tu alcance

Registro de Windows

Hola a todos,

ADVERTENCIA: NO me hago responsable de los daños que sufras como consecuencia de una manipulación incorrecta de la información contenida en este artículo.

Como hablábamos ayer, se pueden usar los ficheros ini para almacenar determinados valores que necesite nuestra aplicación, aunque microsoft recomienda el uso del registro de windows, pero, ¿qué es el registro de windows y como se usa?

A grandes rasgos, podemos decir que es un macro fichero ini para todo el sistema operativo a partir de sus versiones de 32 bits; cualquier cosa que altere el sistema, en cualquiera de sus aspectos, ya sea software o hardware modificará el registro.

Yo, personalmente, prefiero usar los ficheros ini en mi aplicación, ya que los creo o destruyo según mi propio criterio sin modificar para nada el sistema del usuario final, pero puede que tu quieras, o necesites, modificar el registro de windows por alguna circunstancia.

Aunque su apariencia puede desatar en nosotros un escalofrío, sobre todo si lo miramos a través del programa, proporcionado por microsoft, regedit, en realidad solo nos interesa una rama del mismo.

HKEY_CURRENT_USER\software

Esta ruta es donde, generalmente, guardaremos la información. Sin embargo, si te fijas bien, verás que otros programas también tiene claves y valores en otros lados, como en “HKEY_LOCAL_MACHINE\Software”. Puedes almacenar datos en donde quieras, pero se recomienda que sea en esta clave.

Antes de continuar, una observación, el constructor del objeto TRegistry se inicializa en HKEY_CURRENT_USER, en caso de que quieras utilizar una rama distinta del registro deberás modificar la propiedad RootKey.


ATENCIÓN: Recuerda que el registro de windows es su corazón, cualquier cambio fuera de los límites de la rama que hemos mencionado, puede dejar tu sistema inutilizado

Si sufres algún problema que te impide acceder al sistema, prueba lo siguiente:

  1. Ve a Inicio -> Apagar el equipo
  2. Reiniciar el equipo con un disco que contenga MSDOS y el programa scanreg por ejemplo un disco de Windows95 o windows98.
  3. Una vez en MS-DOS debes escribir scanreg /restore, presiona enter y reinicia el equipo.

Si sigues este procedimiento, restaurarás el Registro al estado en que estaba la última vez que el sistema se inició correctamente.

Vamos entonces a aprender a usar este fichero en nuestra aplicación.

Delphi nos proporciona una unidad que encapsula las llamadas a la API de windows, de forma que nos resulta bastante fácil manipular el fichero del registro, Registry, que crea la clase TRegsitry (que originales, ¿verdad?). Su uso es bastante fácil:

procedure TForm1.FormCreate(Sender: TObject);
var
Registro: TRegistry;
Abierto: boolean;
begin
Registro := TRegistry.Create;

Una vez que tenemos creada nuestra instancia de registro, ya podemos usarla para acceder a el, para ello debemos abrirla

Abierto := Registro.OpenKey(Clave, False);

OpenKey devuelve un valor booleano para indicar si se abrió correctamente la clave, pero si la clave no existe puedes cambiar el segundo parámetro de forma que con true, forzarás al sistema a crearla.

Ahora ya podemos leer, o escribir, en esa clave usando las funciones tipo Registro.Readtipodedato y Registro.Writetipodedato

if Abierto then
color := Registro.Readstring('ColorFondo');

tal y como hacíamos con los fichero ini.

Recuerda, al terminar de usar el registro, eliminar la referencia al objeto Registro con el procedimiento Free

Registro.Free;
end;

Saludos

Jueves, 29 enero 2009 Posted by | Delphi | Deja un comentario

Ficheros ini

Hola a todos,

hoy vamos a hablar de unos ficheros que pueden resultar muy útiles para guardar cosas entre un uso y otro de nuestra aplicación, me refiero a los ficheros ini.

Estos ficheros, que no son más que texto plano, están estructurados en forma de secciones y, dentro de cada sección, se encuentran las entradas y sus correspondientes valores con el siguiente formato:

[Colores]
Fondo=000000
Cabecera=ffff00

Vamos a ver como podemos usarlos en nuestras aplicaciones.

Lo primero de todo es agregar en la cláusula uses de nuestra aplicación una referencia a la unidad INIFiles.

Ahora, ya podemos crear, en el procedimiento que vaya a hacer uso de el, una instancia al fichero en cuestión:

var
ficheroINI : TINIFile;
begin
ficheroINI := TINIFile.Create( ExtractFilePath( Application.EXEName )+'mifichero.ini' );
{}
ficheroINI.Free;
end;

Si el fichero no existe Delphi lo creará sobre la marcha.

Como puedes ver, he asociado la creación del fichero ini al mismo directorio donde se encuentra la aplicación que lo crea, aunque puedes crearlo en cualquier sitio.

Date cuenta de que al acabar de usarlo se debe llamar al procedimiento Free, que libera la memoria.

Vamos ahora a ver las funciones para leer y escribir en el fichero ini.

Para escribir una cadena de valores se usa el procedimiento:

ficheroINI.WriteString('Seccion', 'Identificador', 'Valor');

Como observaciones, los valores Sección e Identificador pueden, o no, existir en el fichero ini, pero si no existen serán creados de forma automática.

De forma análoga, para leer un valor desde un fichero ini se usará la sentencia:

Edit1.Text := ficheroINI.ReadString('Seccion', 'Identificador', 'Valor por defecto');

La gran diferencia con respecto a la anterior sentencia, es que si no encuentra el Identificador devolverá el Valor por defecto.

Otras funciones usadas para leer valores en los fichero ini son:

  • ReadBool
  • ReadDate
  • ReadFloat
  • ReadTime
  • ReadSection
  • y sus correspondientes contrapartidas para escribir el los fichero ini:

  • WriteBool
  • WriteDate
  • WriteFloat
  • WriteTime
  • WriteSection
  • Hay algunas más que puedes encontrar buscando en la ayuda de Delphi.

    Saludos

    Miércoles, 28 enero 2009 Posted by | Delphi | 1 comentario

    Números romanos

    Hola a todos,

    hace algún tiempo tuve la necesidad de escribir una rutina para convertir números enteros en números romanos, no fue muy difícil y lo más probable es que nadie la  necesite, pero uno nunca sabe lo que puede hacernos falta.

    function CambiarARomano(iNumero: integer): string;
    const
    Numeros: array[1..13] of integer= (1,4,5,9,10,40,50,90,100,400,500,900,1000);
    Romanos: array[1..13] of string= ('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');
    var
    bCont: Byte;
    begin
    for bCont := 13 downto 1 do
    while
    (iNumero >= Numeros[bCont]) do begin
    iNumero := iNumero - Numeros[bCont];
    Result := Result + Romanos[bCont];
    end;
    end;

    Lunes, 26 enero 2009 Posted by | Delphi | 4 comentarios

    Navegando por la web

    Hola a todos,

    ¿Te parecen pesados los actuales navegadores web? ¿No te gusta navegar por la World Wide Web, con los navegadores habituales del mercado? ¿Has pensado en hacerte tu propio navegador?

    Con nuestro querido Delphi, y en solo unos pocos clicks de ratón, podrás estar navegando antes de darte cuenta.

    Vamos al lío, crea un nuevo proyecto con la opción New Application del menú File, inserta ahora un TWebBrowser que encontrarás en la paleta Internet, redimensionalo dejando espacio en la parte superior, donde deberás colocar un TEdit que nos servirá para escribir la dirección web.

    La parte de diseño ya esta terminada, ¿fácil, verdad?

    Vamos ahora a implementar el código propiamente dicho.

    Edita la propiedad KeyPreview del formulario y cámbiala a true, de esta forma, cuando escribamos una dirección web en el TEdit y pulsemos Enter directamente se ejecutará nuestro procedimiento.

    Haz una doble pulsación sobre el evento OnKeyPress y escribe el código que aparece a continuación.

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    {Detectamos la pulsación de la tecla Enter}
    if key = #13 then begin
    {Cargamos la dirección en el navegador}
    WebBrowser1.Navigate(WideString(Edit1.Text));
    {Limpiamos el buffer del teclado}
    key:= #0;
    end;
    end;

    Como verás es muy fácil implementar un pequeño navegador web, lógicamente, no tendrás navegación por pestañas, ni soporte javascript, pero claro, para eso ya existen otros navegadores.

    Te dejo a ti la implementación de otras utilidades, como un botón para retroceder en el historial, almacenar las páginas visitadas, o crear marcadores.

    Saludos

    Viernes, 23 enero 2009 Posted by | Delphi | Deja un comentario

    Atajos de teclado

    Hola a todos,

    hoy vamos a hablar de los atajos de teclado que tiene Delphi, una ayuda inestimable que muchas veces pasamos por alto y que podría hacer que nuestra productividad se viera incrementada.

    Una de las cosas que generan más perdida de tiempo es el tener que levantar las manos del teclado para, usando el ratón, realizar alguna actividad complementaria, usando los atajos de teclado ganaremos algo de ese tiempo.

    La opción más fácil es usar la ayuda que el propio Delphi nos brinda, pero si eres un poco como yo, que estaba tan deseoso de empezar a usarlo que ni siquiera me molesté en leerla, seguro que se te habrá pasado por alto.

    Doy por supuesto que estás usando el mapa de teclado por defecto que trae configurado Delphi, si no es así busca en la ayuda cuales son los atajos de tu mapa.

    Veamos alguno de esos atajos que nos pueden resultar interesantes,

    • Ctrl+E  Nos muestra el cuadro de diálogo de búsqueda.
    • Ctrl+F  Nos permite realizar una búsqueda sencilla (observa la barra de estado del editor)
    • Ctrl+R  Abre el diálogo de búsqueda y reemplazo
    • Ctrl+J   Abre el diálogo de plantillas
    • Ctrl+S  Guarda la unidad activa
    • Ctrl+Y  Borra la linea sobre la que se encuentra el cursor
    • Ctrl+Z  Deshace la última acción realizada
    • Ctrl+Shift+I  Indenta un bloque de texto seleccionado
    • Ctrl+Shift+U  De-indenta un bloque de texto seleccionado
    • Ctrl+Shift+Y  Borra hasta el final de la línea
    • Ctrl+Enter  Abre un fichero
    • Ctrl+K+[0-9]  Establece hasta 10 puntos de salto
    • Ctrl+Q+[0-9]  Salta hasta el punto marcado con ese número
    • Ctrl+K+E  Cambia la palabra que hay bajo el cursor a minúsculas
    • Ctrl+K+F  Cambia la palabra que hay bajo el cursor a mayúsculas
    • Ctrl+O+U  Cambia la letra que delante del cursor a mayúsculas
    • Ctrl+D  Abre la ventana de generación de Diálogos
    • Alt+0  (cero)  Abre una lista con las ventanas abiertas
    • Ctrl+Alt+A  Inserta la fecha en la posición del cursor, con formato dd/mm/yy
    • Ctro+Alt+P  Inserta el esqueleto de comentarios para la entrada de un procedimiento
    • Ctrl+F1  Muestra la ayuda sobre la palabra que hay bajo el cursor

    Miércoles, 21 enero 2009 Posted by | Delphi | Deja un comentario

    Estoy contento

    Hola a todos,

    hoy estoy muy contento, después de muchos años usando Linux en mi portátil y Windows en el de sobremesa, he decidido instalar una máquina virtual en mi Ubuntu e instalarle un Windows XP, ¿resultado?

    Iniciando Windows XP

    Todo esto no tiene mucho que ver con Delphi, ¿o si?

    pantallazo-delphi

    Pues si señores, he instalado mi licencia de Delphi sobre una máquina virtual en Ubuntu (Linux) a través de VirtualBox, que he de reconocer, ha mejorado mucho desde que lo usé hace algunos años.

    Ahora va por su versión 2.1, muy estable y con soporte nativo para dispositivos USB, además ya están añadiendo soporte para aceleración gráfica, lo que lo hace muy adecuado para virtualizar juegos.

    De momento, yo me quedo con mi Delphi para poder trabajar cómodamente sentado en el sofá y no en el frío despacho de casa.

    Delphi 5 sobre Ubuntu

    Lunes, 19 enero 2009 Posted by | Delphi | Deja un comentario

    Internacionalización II

    Hola a todos,

    ¿supongo que ya habrás acabado de traducir todos los ficheros dfm de tu aplicación, en sus distintos idiomas?

    Vamos ahora a preparar las bibliotecas de enlace dinámico para que puedas distribuirlas junto con tu aplicación.

    Ve al menú File y selecciona la opción Open, busca la carpeta de tu proyecto y dentro de ella, veras que se ha creado una carpeta para cada uno de los idiomas que seleccionaste en los pasos anteriores, dentro de ellas tienes una copia del fichero dpr de tu aplicación.

    Si abres el fichero, verás el esqueleto de una librería DLL generado de forma automática por el “Resource DLL wizard”, solo debes compilarla, usando la opción Build Project1 del menú Project.

    A partir de aquí, solo te queda, a la hora de enviar tu aplicación, acompañarla de los ficheros DLL correspondientes. Date cuenta de que Delphi intentará abrir el fichero DLL que se corresponde con el idioma del usuario, y para ello lo buscara, primero en el directorio de la aplicación y, si no lo encuentra, en el del sistema.

    Saludos

    Sábado, 17 enero 2009 Posted by | Delphi | 1 comentario

    Internacionalización

    Hola a todos,

    como ya hablamos en la entrada Bibliotecas de enlace dinámico, uno de los usos que se les puede dar a las DLLs es crear versiones en distintos idiomas para distribuir junto con tu aplicación, de forma que un solo programa puede utilizarse en diversos países.

    Para empezar, debemos aprender a usar una técnica que nos permita traducir de forma fácil las cadenas de texto de nuestro programa.

    La aparición de una cadena en cualquier sentencia, del tipo:

    if condicion then
    sCadena:= 'La solución mañana';

    debería ser substituida por

    resourcestring
    sSolucion = 'La solución mañana';
    if condicion then
    sCadena:= sSolucion;

    La directiva resourcestring define las cadenas de texto en un fichero de recursos, donde se identificarán con un número único, nosotros en nuestra aplicación la usaremos como cualquier constante de cadena.

    Una vez realizado este paso con todas las cadenas de nuestra aplicación, debemos generar los ficherode recursos, para eso vamos a utilizar una utilidad proporcionada por el propio Delphi, abre el menú File, y selecciona la opción New…, pulsa sobre “Resource DLL wizard”

    Resource DLL wizard

    Al llegar a la pantalla de idiomas, selecciona aquellos para los que quieres generar el fichero de recursos

    ficheros

    Pulsa sobre AddFile y selecciona todos aquellos ficheros de formulario (dfm) que quieras traducir.

    Despues de algunas preguntas, se te mostrará la pantalla de gestión de traducciones

    Gestor de traducciones

    Ve traduciendo todas las cadenas y recursos, hasta completar la versión para cada idioma.

    Como es un proyecto que requiere su tiempo, te dejo que trabajes tranquilo, mañana te enseñaré a generar las DLL traducidas.

    Saludos.

    Viernes, 16 enero 2009 Posted by | Delphi | Deja un comentario

    Ventanas deslizantes

    Hola a todos,

    hoy vamos aver un pequeño truco que puede resultar muy aparente para tus aplicaciones, las ventanas deslizantes.

    Crea una nueva aplicación con dos formularios, o selecciona alguna que ya tengas preparada, selecciona el formulario que quieres deslizar y cambia su posición en alguna de las propiedades Top o Left, según quieras que la ventana se mueva de forma vertical  o se desplace de forma lateral, de manera que quede fuera de los margenes de la pantalla.

    Vamos a escribir el código que desplazará la pantalla, para ello debes agregar un botón o una opción de menu en el primer formulario y escribir en su evento Click.

    {Vamos a desplazar el formulario para que se desplace
    hacia el centro de la pantalla, apareciendo por la derecha}
    procedure TForm1.Dentro1Click(Sender: TObject);
    var
      Posicion: integer;
    begin
      {Colocamos el formulario a desplazar encima de todos los demás}
      Form2.FormStyle:= fsStayOnTop;
      {Y lo mostramos}
      Form2.show;
      {Recuperamos la posición actual del formulario
      y calculamos el centro de la pantalla}
      for posicion:= Form2.Left downto (Screen.width -Form2.Width) div 2 do begin
        {Desplazamos el formulario}
        Form2.Left:= posicion;
        {Colocamos un retardo para que no parpadee}
        sleep(10);
      end;
    end;

    (Nota: Si quieres que aparezca desde la parte izquierda de la pantalla, deberás cambiar downto por to)

    Ahora vamos a hacer desaparecer el formulario de la misma forma.

    {Procedimiento que en vez de cerrar el formulario
    hara que desaparezca por la derecha de la pantalla}
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      Posicion:  integer;
    begin
      {Recuperamos la posición actual del formulario y
      calculamos el punto máximo de la pantalla}
      for posicion:= Form2.Left to Screen.width + 10 do begin
        {Desplazamos el formulario}
        Form2.Left:= posicion;
        {Colocamos un retardo para que no parpadee}
        sleep(10);
      end;
    end;

    (Nota: Si quieres que desaparezca por la parte izquierda de la pantalla, deberás cambiar to por downto y usar la propiedad Form2.width cambiandola a signo negativo)

    Si deseas que el formulario se desplace de forma vertical, debes utilizar la propiedad Top en las rutinas.

    Saludos

    Jueves, 15 enero 2009 Posted by | Delphi | Deja un comentario

    Bibliotecas de enlace dinámico

    Hola a todos,

    Hoy vamos a ver las llamadas bibliotecas de enlace dinámico (DLL).

    Las DLL no son más que ejecutables compilados que contienen funciones a las que puedes llamar desde tus programas en tiempo de ejecución.

    Algunas de sus ventajas es que puedes tener un programa ya en explotación , al que, modificando sus DLL’s, puedes cambiar en alguno de sus aspectos; podrías también tener varias versiones del mismo programa en distintos idiomas; o incluso personalizar un programa genérico de forma que se adapte a un cliente particular; solo échale imaginación…

    Vamos ahora a ver como podemos implementar nuestras propias DLL’s, para eso crearemos una que solamente nos va a proporcionar un mensaje en pantalla, más adelante iremos implementando otras funcionalidades.

    Inicia Delphi y escoge la opción de crear una nueva DLL en el menú File opción New…

    Elegir una nueva DLL

    Se nos abrirá el editor con un esqueleto denominado Library project1, vamos a modificarlo de forma que nos quede con el siguiente código:

    Library Ejemplo;
    
    uses
      Sysutils,
      Classes,
      Dialogs;
    
    procedure MostrarMensaje(Texto: string); stdcall;
    begin
        ShowMessage(Texto);
    end;
    
    {Aquí definiremos las funciones que van a ser exportadas}
    exports
        MostrarMensaje;
    begin
    end.
    

    Ahora podemos guardar nuestro proyecto y despues compilarlo para crear nuestra nueva DLL usando la opción build Project1 que aparece en el menú Project

    Compilando la biblioteca

    Ya tenemos lista la biblioteca, para probarla crea una nueva aplicación, desde el menú File, opción New application, agrega un botón y modifica el código del proyecto para que aparezca como este:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    {Declaramos el procedimiento externo de la DLL}
    procedure MostrarMensaje(Texto: string); stdcall external 'Ejemplo.dll';
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      {Llamamos al procedimiento de nuestra DLL}
      MostrarMensaje('Probando nuestra nueva DLL');
    end;
    
    end.
    

    Y aquí tenemos el resultado

    Mostrando nuestro mensaje

    Miércoles, 14 enero 2009 Posted by | Delphi | 1 comentario