sábado, 13 de diciembre de 2008

Asociación de una información video (.avi) a los registros de una tabla.

Existen ocasiones en las que todo está en contra: La base de datos no admite en un campo de un registro una información video tipo .avi (imágenes animadas), además no encontramos un control de base de datos que pueda representar a dicho campo y mantenerse sincronizado con el scroll en la tabla...

Por ejemplo,

Supongamos una interfaz (a cuyo formato llamaremos fpeliculas) pretenda presentar la información de una tabla de películas (a la que llamaremos tpeliculas), y entre otras informaciones (Director, actores, argumento, fechas diversas, etc) se necesita editar un video de un trailer de dicha película. La base de datos en MsAccess (con sus limitaciones propias). La clave de dicha tabla (a la que llamaremos codigo_pelicula) es un número entero autoincrementado.

En este caso existe una solución artesanal del problema.

1) Colocamos un control TAnimate (al que llamaremos Animate1) con la propiedad Active a False y otro TMediaPlayer (al que llamaremos (MP) con la propiedad AutoOpen a False. Se necesitan estos valores porque desconocemos a priori el nombre del fichero video (.avi) que deseamos presentar. Como es obvio en la propiedad Display del control TMediaPplayer asignaremos el control TAnimate.

2) Creamos una carpeta debajo del ejecutable de la aplicación denominada videos y allí colocaremos los distintos trailers, llamándolos 1.avi, 2.avi, 3.avi, etc... Y como es obvio cada uno de ellos de corresponderán con los trailers de las películas cuya clave es 1, 2, 3 respectivamente.

3) En el módulo de datos (al que hemos llamado md) definiremos a nivel global una variable a la que llamaremos primero de tipo booleano.

4) En el evento Create del módulo de datos escribiremos

Primera:=True;

5) En el evento AfterScroll de la tabla tpelículas escribiremos el siguiente código:

procedure Tmd.tpeliculasAfterScroll(DataSet: TDataSet);
var
fichero : string;
begin
fichero:=dir0+'videos\'+inttostr(md.tpeliculas.FieldByName('Codigo_pelicula').AsInteger)+'.avi';
if fileexists(fichero) then
begin
if Primera = False then
begin
Upeliculas.fpeliculas.MP.FileName:=fichero;
Upeliculas.fpeliculas.MP.Open;
Upeliculas.fpeliculas.MP.Play;
end
else Primera := False;
end;
end;

Donde:

Upeliculas es la unidad .pas donde se encuentra el formato fpeliculas del proyecto.

  • fichero es una variable de cadena que cada vez que ocurre un scroll en la tabla (avance o retroceso de los registros) apunta a un hipotético fichero avi que contiene, si existe, el trailer de la película cuyos datos se están mostrando en la interfaz.
  • dir0, es una variable local que apunta al ejecutable de la aplicación, y que está definida en la forma dir0:=extractfilepath(Application.exename); dentro del create del módulo de datos.
  • primero, ya explicada, es una variable que la primera vez que se abre la tabla tiene valor True y el resto de las veces mientras nos desplazamos por los registros de la tabla tiene valor False.
6) Para evitar que una vez se esté reproduciendo un trailer para un registro dado siga reproduciéndose con el cambio al registro anterior/posterior, hemos de escribir el siguiente código en el evento beforeScroll de la tabla películas,

procedure Tmd.tpeliculasBeforeScroll(DataSet: TDataSet);
begin
Upeliculas.fpeliculas.MP.Close;
Upeliculas.fpeliculas.Animate1.active:=False;
Upeliculas.fpeliculas.Animate1.Refresh;
end;

De esta manera cada vez que se haga scroll sobre los registros de la tabla lo primero que se hace es cerrar el componente TMediaPlayer, desactivar y refrescar el componente TAnimate.

7) El código anterior, funciona de forma sincronizada desde el segundo registro hasta el final de la tabla y viceversa, pero no funciona para el primer registro, ya que éste no se presenta mediante scroll la primera vez. Para resolver esto, en el evento Activate de la forma fpelículas escribimos:

procedure Tfpeliculas.FormActivate(Sender: TObject);
var
fichero:string;
begin
fichero:=dir0+'videos\'+inttostr(md.tpeliculas.FieldByName('Codigo_pelicula').AsInteger)+'.avi';
if fileexists(fichero) then
begin
Upeliculas.fpeliculas.MP.FileName:=fichero;
Upeliculas.fpeliculas.MP.Open;
Upeliculas.fpeliculas.MP.Play;
end;
end;

Con esto conseguimos presentar el video del primer registro de la tabla, si existe...

Y esto es todo!!.

Aunque parece farragoso pero es de una lógica sencilla si se sabe interpretar los eventos afterScroll y beforeScroll que se producen en una tabla conforme nos movemos sobre ella.

Existen otras solucione mas rápidas y cómodas, pero mucho me temo que requieren de controles/componentes u objetos propietarios, y muy probablemente motores de bases de datos distintos.

No hay comentarios: