Info Delphi

La magia de la programación a tu alcance

Música, maestro

Hola a todos,

hoy voy a mostrar un pequeño truco para hacer más entretenidas vuestras aplicaciones, pero hay que tener cuidado con el, porque se puede pasar de algo discreto y elegante a algo hortera con una sola línea de código.

Vamos a agregar a nuestra aplicación una pieza musical, que se reproduzca mientras se encuentre activa.

Lo primero que hay que tener presente es que, ya que reproduciremos música, esta debe ser, o de libre distribución, o que no esté sujeta a copyright, dado que, al menos en España, este hecho está regulado legalmente.

Una vez encontrada nuestra pieza musical, deberemos copiarla en el directorio de nuestra aplicación.

Ahora agregamos al formulario un componente TMediaPlayer

La idea consiste en establecer alguna de sus propiedades en tiempo de diseño, de forma que cuando se inicie nuestra aplicación, o al efectuar alguna operación nuestro usuario, se ponga en marcha el reproductor.

La principal es la propiedad FileName que deberemos rellenar con el nombre del fichero a reproducir, incluida la ruta completa.

Debemos habilitar la propiedad AutoOpen a true y si queremos que se reproduzca de forma continua, poner a true la propiedad AutoRewind.

Cambiamos ahora la propiedad visible a false y ya solo nos queda, programar el evento con el cual se pone en marcha el reproductor, por ejemplo en el formCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
MediaPlayer1.Play;
end;

Recuerda poner a disposición del usuario alguna opción que le permita detener el reproductor (una opción del menú, o un botón pequeño), programando su evento así:

procedure TForm1.Button1Click(Sender: TObject);
begin
MediaPlayer1.Stop;
end;

Saludos

jueves, 19 febrero 2009 Posted by | Delphi | Deja un comentario

Crear formularios

Hola a todos,

cuando, en nuestra aplicación, necesitamos crear un nuevo formulario y utilizamos alguna de las opciones a nuestra disposición, Delphi (aunque esto se puede cambiar), coloca este en la lista de creación automática (puedes ver esa lista en las opciones del proyecto).

Este comportamiento puede resultar incluso cómodo en pequeñas aplicaciones, pero cuando hablamos de varias decenas de formularios, aparte de la lentitud a la hora de abrir la aplicación, podemos tener serios problemas de gestión de recursos.

Para evitar esto, vamos a ver la posibilidad de manejar nosotros mismos este proceso.

Lo primero de todo es, a la hora de crear un nuevo formulario, deshabilitar la creación automática, para eso nos vamos al menú Project y pulsamos sobre Options…, la pestaña Forms nos muestra dos listas

creacion-ventanas

Solamente necesitas pasar el formulario desde la ventana de la izquierda a la de la derecha para que Delphi deje en tus manos toda su gestión, la creación, el manejo y la liberación de los recursos que utiliza.

Para crear y poder usar esa ventana de forma Modal hay varias opciones, la más habitual es definir una variable del mismo tipo que el formulario y crearlo, de esta forma:

procedure TForm1.CrearNuevo(Sender: TObject);
var
fNuevo: TForm2;
begin
fNuevo := TForm2.Create(Application);
fNuevo.ShowModal;
fNuevo.Free;
end;

Como verás, no es difícil gestionar el formulario de esta forma, pero hay formas más eficientes de hacerlo. Por ejemplo, ¿que pasaría si hay un problema a la hora de crear el formulario? pues que la memoria usada para la variable no se liberaría; la solución, encerrar el código en una instrucción try, de esta forma:

procedure TForm1.CrearNuevo(Sender: TObject);
var
fNuevo: TForm2;
begin
fNuevo := TForm2.Create(Application);
try
fNuevo.ShowModal;
finally
fNuevo.Free;
end;
end;

De esa forma protegemos los recursos de nuestra máquina, pero aún se puede mejorar…

Hemos usado una variable que, lógicamente, ocupa un lugar en memoria, ¿podríamos prescindir de ella?

procedure TForm1.CrearNuevo(Sender: TObject);
begin
with TForm2.Create(Application) do
try
ShowModal;
finally
Free;
end;
end;

El resultado, un código más limpio, menos recursos ocupados y un procedimiento más seguro.

Saludos

martes, 17 febrero 2009 Posted by | Delphi | 1 comentario

Listas de cadenas

Hola a todos,

hoy vamos a hablar de un algo que puede resultarnos muy útil, las listas de cadenas.

Las listas de cadenas, o lo que es lo mismo, el StringList, es un objeto de Delphi que nos permite manejar cadenas de caracteres en la memoria, aunque, para nuestro disfrute, se le agregaron métodos que nos permiten cargar o guardar cadenas en un fichero de texto.

Para empezar a usar un StringList, lo primero que debemos hacer es crearlo, y pare ello vamos a usar un código similar a este:

var Lista: TStringList;
begin
Lista := TStringList.Create;
...

A partir de este momento, y usando la variable creada, podemos agregar o eliminar cadenas de caracteres, bien desde nuestro código:

Lista.Add('Esta es mi primera cadena');

o bien desde un fichero de texto cualquiera:

Lista.LoadFromFile('Fichero.txt');

La verdadera potencia del objeto StringList, se obtiene a la hora de manejar las cadenas en memoria; podemos, por ejemplo, ordenar la lista de cadenas con solo usar el procedimiento Sort, de esta manera:

Lista.Sort;

Pero esto nos obliga a que cada vez que añadamos o eliminemos una entrada tengamos que llamarlo, así que podemos definir la propiedad Sorted como true, de forma que al agregar una cadena nueva, se coloque en el sitio correcto.

Podemos mostrar todas las cadenas:

Lista.Text;

o una entrada concreta:

Lista[4]

Se pueden agregar valores a la lista con Append, aunque Add nos devuelve la posición en la que agrega el valor a la lista, y con Insert, pasándole como primer parámetro, la posición donde colocar el valor.

Eliminar cadenas :

Lista.Delete(2);

Podemos cambiar la posición de los elementos dentro de la lista:

Lista.Move(1, 5);

lo que desplaza la cadena que hay en la posición 1 a la posición 5.

Otra función interesante es la búsqueda dentro de la lista, se puede usar la función IndexOf que, pasándole como parámetro una cadena, nos devuelve su posición o -1 en caso de no encontrarla; también podemos usar la función Find, en este caso, debemos pasar dos parámetros, el primero será la cadena a buscar y el segundo un entero en el que se almacena la posición, esta función devuelve true si ha encontrado la cadena o false en caso contrario.

domingo, 15 febrero 2009 Posted by | Delphi | Deja un comentario

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