Vous êtes sur la page 1sur 18

Aplicaciones Web con Borland Delphi 4

Como crear aplicaciones web usando los modulos web v componentes de Delphi.
Sumario
Las ediciones superiores de Delphi cuentan con todos los elementos necesarios
para poder crear aplicaciones de servidor web, independientemente de que dicho
servidor ISAPI/NSAPI o mecanismos CGI estndar.
Crear aplicaciones que se ejecutan comunicandose con un servidor HTTP, segun las
peticiones de servicios eIectuadas por los clientes, es algo que poco a poco esta
convirtiendose en una necesidad. En principio aparecieron mecanismos, hoy
considerados primitivos, como CGI (Common Gatewav Interface) y un derivado de el
llamado Win-CGI. Posteriormente los servidores comenzaron a poner al servicio de esas
aplicaciones conjuntos de Iunciones como ISAPI (Internet Server Application
Programming Interface) y NSAPI (Netscape Server Application Programming
Interface), haciendo que el desarrollo de aplicaciones de servidor Iuese mas eIicaz y
simple. Posteriormente han aparecido otras nuevas tecnologias, como los componentes
que se comunican con el servidor mediante ActiveX o la especiIicacion EJB (Enterprise
JavaBeans).
En el articulo Aplicaciones Web con Jisual Basic 6, disponible tambien en Torre de
Babel, se muestra como es posible crear aplicaciones de servidor web mediante Visual
Basic. Este tipo de aplicaciones consisten en una libreria ActiveX que tiene acceso al
modelo de objetos de IIS (Internet Information Server). El mayor inconveniente es que
dichas aplicaciones tan solo pueden utilizarse con dicho servidor, pero no con cualquier
otro que podamos utilizar.
Borland Delphi, concretamente a partir de la version 3 y la edicion cliente/servidor,
dispone de todos los elementos necesarios para poder crear este tipo de aplicaciones.
Para ello es capaz de usar desde el tipico mecanismo CGI hasta las interIaces de
aplicaciones ISAPI/NSAPI, todo ello de Iorma transparente para el desarrollador.
Existen, ademas, varios componentes que generan automaticamente codigo HTML a
partir de inIormacion almacenada en bases de datos, Iacilitando una tarea que en Visual
Basic realizabamos manualmente, escribiendo el codigo necesario para generar las
etiquetas HTML y componer el documento.
Este articulo mostrara las bases del proceso que hay que seguir con Borland Delphi para
crear aplicaciones de servidor web, utilizando los modulos web y algunos de los
componentes especializados en la generacion de codigo HTML. Con todo ello se
propondran unos ejemplos similares a los creados en el citado articulo, de tal Iorma que
sea posible realizar una comparacion directa del trabajo y el resultado.
Para poder probar el Iuncionamiento de los ejemplos debera disponer de un servidor
HTTP instalado en su sistema. No es absolutamente necesario que este sea Internet
InIormation Server, como si ocurre con Visual Basic, pudiendo ser cualquiera que
implemente ISAPI, NSAPI o sea capaz de usar CGI.
Algunos fundamentos
Inicialmente los servidores HTTP o servidores web eran aplicaciones que se limitaban a
enviar al cliente los documentos que este solicitaba, documentos que estaban
almacenados en archivos en disco y cuyo contenido, como consecuencia, era estatico.
Esto signiIica que cada vez que el cliente solicitaba un determinado documento el
resultado siempre era el mismo, limitandose la interactividad a la posibilidad que tenia
el usuario de pulsar sobre los enlaces.
Un primer paso en la busqueda de aadir mayor Iuncionalidad a los servidores HTTP
consistio en permitir que ejecutaran pequeas aplicaciones, conocidas habitualmente
como CGIs, mediante un protocolo comun de comunicacion. El servidor podia, ademas,
recibir parametros del cliente y entregarlos al CGI, de tal Iorma que este generase un
contenido dependiente de la inIormacion recibida.
Los CGIs pueden escribirse practicamente en cualquier lenguaje y con cualquier
herramienta, desde un hasta un compilador, utilizandose como medio de
transporte de los parametros elementos diversos como los archivos en disco, la entrada
y salida estandar o las variables de entorno. Win-CGI es una version del mecanismo
CGI que buscaba un mayor rendimiento sobre Windows, aunque su Iuncionamiento es
casi identico.
El siguiente paso consistio en permitir que librerias de enlace dinamico con una cierta
estructura se ejecutasen en el mismo espacio de proceso que el servidor, de tal Iorma
que la comunicacion, mediante un cierto conjunto de Iunciones, Iuese mucho mas
rapida y eIiciente. Dos implementaciones diIerentes de este mecanismo son ISAPI y
NSAPI, usadas originalmente por Internet InIormation Server y Netscape FastTrack
Server y disponibles posteriormente en otros servidores.
Aunque el rendimiento de las aplicaciones ISAPI/NSAPI es siempre superior al de las
aplicaciones CGI, no es menos cierto que su Iuncionamiento resulta mas peligroso para
el propio servidor. Un Iallo en un CGI puede provocar que el cliente obtenga una
respuesta no esperada. Si se produce un Iallo en una aplicacion ISAPI/NSAPI, sin
embargo, es posible que el servidor se venga abajo puesto que la interrupcion se
produce en el mismo espacio de proceso.
Inicio de una aplicacin de servidor
Como la mayoria de los proyectos que es posible desarrollar con Delphi, para crear una
aplicacion de servidor hay que partir abriendo el Deposito de objetos. Este dispone de
un elemento, destacado en la Figura 1, que pone en marcha el asistente mostrado en la
Figura 2. Basicamente se trata de seleccionar el tipo de aplicacion que quiere crearse, de
tal Iorma que el asistente genere el codigo correspondiente.

Web Server Application para iniciar una nueva aplicacion de servidor web.


Figura 2. El asistente es realmente simple, tan solo hav que seleccionar el protocolo
que utili:ara la aplicacion para comunicarse con el servidor.
Observe que la primera opcion permite crear una aplicacion, en Iorma de libreria de
enlace dinamico, que se ajusta tanto a ISAPI como a NSAPI, de tal Iorma que puede
Iuncionar con la mayoria de los servidores existentes sin necesidad de realizar cambio o
adaptacion alguna. Las otras dos opciones Iacilitan la creacion de ejecutables que se
comportan como CGIs corrientes o como Win-CGIs.
Tras cerrar el asistente, habiendo seleccionado cualquiera de las opciones disponibles
segun el tipo de servidor de que dispongamos, lo unico que veremos en el proyecto sera
una ventana similar a un modulo de datos de Delphi. Este modulo es un componente
TWebModule capaz de contener uno o mas componentes TWebActionItem. Cada uno de
estos representa un servicio implementado por la aplicacion capaz de devolver un
determinado documento.
Si observa el modulo de codigo asociado al TWebModule podra ver que no hay ningun
elemento que le diIerencie de cualquier otro modulo. En lugar de tener un TForm1 que
deriva de TForm contamos con un TWebModule1 que deriva de TWebModule. En lugar de
componentes tipicos, como las etiquetas de texto y botones, en el interior del
TWebModule insertaremos objetos TWebActionItem, cada uno de los cuales tendra las
correspondientes entradas en la deIinicion de la clase. Como veremos despues, tambien
es posible alojar en este modulo componentes cuya Iinalidad es generar codigo HTML.
Edicin de acciones
Inicialmente el modulo TWebModule que hay en el proyecto esta vacio, por lo que no
hay accion alguna que el servidor HTTP pueda ejecutar. Basta con hacer doble clic
sobre el propio TWebModule, o bien en la propiedad Actions en el Inspector de
objetos, para abrir el editor de acciones. Basicamente se trata de una lista normal y
corriente con cuatro columnas: el nombre de la accion, el camino al que esta asociada,
su estado y la indicacion de si es la accion por deIecto o no.
Para aadir acciones a esta lista nos podemos servir del menu emergente, aunque es
suIiciente con pulsar la tecla Insert o pulsar el primer boton de la ventana para crear un
nuevo TWebActionItem. En principio las acciones siempre estan activadas, no se
comportan como la accion por deIecto y, ademas, no tienen asociado un camino.
Como puede apreciarse en la Figura 3, cada uno de los elementos cuenta con cinco
propiedades que establecen sus atributos. Name contiene el nombre de la accion, de igual
Iorma que la propiedad Name de un TButton almacena el nombre del boton. Enabled
indica si la accion esta activa, puede ser ejecutada por el servidor HTTP, o no. Default
indica si esta es la accion por deIecto, la que se ejecutara en caso de que el servidor
HTTP acceda a la aplicacion sin Iacilitar un camino. Dicho camino se almacena en la
propiedad PathInfo que, en la practica, es como el nombre externo de la accion. Por
ultimo tenemos la propiedad MethodType, que indica a que tipo de metodo responde la
accion.

Figura 3. Usando el Inspector de obfetos establecemos las propiedades de las acciones
aadidas al modulo web.
Por deIecto la propiedad MethodType contiene el valor mtAny, lo cual signiIica que la
accion puede ejecutarse ante cualquier metodo HTTP. Si queremos asociar la accion al
envio de algun dato desde el cliente al servidor, por ejemplo, dariamos el valor mtPost
a esa propiedad. Esto impediria que la misma accion pudiera ejecutarse ante otros
metodos, representados por constantes como mtGet o mtHead.
Seguramente la propiedad mas importante de una accion web es PathInfo. Esta
contendra el camino asociado a la accion, camino que puede considerarse el nombre de
este TWebActionItem Iuera de la aplicacion. Si asignasemos a esta propiedad el valor
/Portada, suponiendo que la aplicacion se llamase WebPCWorld.dll, para ejecutar la
accion habria que usar el URL http://miservidor/WebPCWorld.dll/Portada.
Obviamente miservidor seria el nombre del sistema donde se encuentra el servidor
HTTP. A continuacion tenemos el nombre de la aplicacion a ejecutar y por ultimo el
elemento de esa aplicacion al que quiere accederse.
Las acciones pueden moverse en la lista con el Iin de alterar su orden, asi como
eliminarse con una simple pulsacion de boton. Como es logico, aunque la aplicacion
cuente con muchas acciones diIerentes tan solo debera existir una que tenga el valor
true en la propiedad Default, puesto que no puede existir mas de una accion por
deIecto.
Compilacin y ejecucin
Dependiendo de la eleccion que se hiciese en el asistente (vease Figura 2) el resultado
de la compilacion de un proyecto de este tipo sera una libreria de enlace dinamico, si se
eligio la primera opcion, o un ejecutable, en caso contrario.
En cualquier caso, ya sea libreria de enlace dinamico o ejecutable, la aplicacion
resultante debe alojarse en una carpeta accesible por el servidor HTTP que estemos
utilizando. Si estamos trabajando en Windows 98 con los servicios del Personal Web
Server, por mencionar un caso habitual, lo normal es que nuestra aplicacion tenga que
copiarse a la carpeta InetPub\Scripts.
Una aplicacion de este tipo no esta diseada para ejecutarse directamente, algo que
ademas no es posible en caso de tratarse de una libreria de enlace dinamico. La
ejecucion se eIectuara siempre a traves del servidor HTTP, como resultado de una
peticion recibida de un cliente. El proceso, por lo tanto, consiste en usar un cliente como
puede ser Netscape Navigator o Internet Explorer, introduciendo tras el nombre del
servidor y camino que corresponda el propio nombre de la aplicacion.
En este caso, y a diIerencia de lo visto para Visual Basic y sus modulos web, no es
necesario realizar inscripcion alguna en el registro de Windows. Esto se debe a que
nuestra aplicacion no es un componente COM. Tampoco existe una pagina ASP ya que
este tipo de recurso puede utilizarse tan solo con Internet InIormation Server, mientras
que las aplicaciones creadas con Delphi pueden usarse con cualquier servidor.
Envo de informacin al cliente
Logicamente si el servidor HTTP ejecuta nuestra aplicacion a peticion de un cliente, es
porque este espera que le demos una contestacion. Para ello sera preciso responder a la
seleccion de cada una de las acciones que hayamos deIinido, codiIicando el metodo
asociado al evento OnAction. Dicho metodo recibe varios parametros, entre ellos uno
llamado Response a cuya propiedad Content se asignara la inIormacion a devolver.
Suponiendo que tenga un modulo con una accion, segun se muestra en la Figura 3,
seleccionela, abra la pagina Events del Inspector de objetos y haga doble clic sobre el
evento OnAction. Introduzca tan solo esta sentencia:
Response.Content :=
'Hola desde PC World';
Ahora compile el proyecto y aloje la librera o ejecutable en la carpeta que
proceda, segn la configuracin de su servidor web. En este momento ya
puede ejecutar su cliente habitual e introducir la URL apropiada para ver el
resultado. En la Figura 4 puede ver el resultado obtenido usando Netscape
Navigator.

Figura 4. Resultado que genera la primera accin implementada por nuestra
aplicacin de servidor.
Uso de documentos prediseados
Desde el cdigo de nuestra aplicacin podemos asignar a la propiedad Content
del objeto Response cualquier cadena, de tal forma que es posible componer un
documento HTML completo. No obstante, suele ser ms sencillo disear dicho
documento con una herramienta externa guardndolo en un archivo, de tal
forma que posteriormente nuestra aplicacin lo recupere y use.
Para poder realizar esta tarea lo primero que necesitamos es un documento
HTML ya almacenado en un archivo. Supongamos que ya lo tenemos. Para
leerlo y poder usarlo desde la aplicacin insertaremos en el mdulo web un
componente TPageProducer. Encontrar este componente en la pgina
Internet de la Paleta de componentes de Delphi.
Las dos propiedades fundamentales del componente TPageProducer son
HTMLDoc y HTMLFile. La primera es una lista de cadenas de caracteres a la que
se puede asignar el documento, mientras que la segunda se utiliza para
mantener una referencia al documento HTML almacenado en un archivo. La
primera cuenta con el habitual editor de las propiedades de tipo TStrings, de
tal forma que es posible componer el documento simplemente introduciendo las
etiquetas HTML.

Figura 5. Utilizaremos un componente TPageProducer para poder enviar al
cliente un documento HTML prediseado y almacenado en un archivo.
Suponiendo que tengamos un documento almacenado en un archivo con el
nombre Portada.htm, estableceramos las propiedades que pueden verse en la
Figura 5. Tenemos un TPageProducer llamado Portada cuya propiedad
HTMLFile contiene el camino y nombre del documento. Acto seguido
tendramos que modificar el cdigo que habamos escrito, sustituyendo la
sentencia existente por esta:
Response.Content := Portada.Content;
Portada es el nombre del componente TPageProducer, componente que cuenta
con una funcin llamada Content() que se encarga de recuperar el documento
y devolver su contenido. Es este contenido el que asignamos al objeto
Response, de tal forma que sea la informacin enviada al cliente. El resultado
obtenido ser idntico al que veramos al abrir el documento HTML original
directamente.

Figura 6. La funcin 0 del componente TPageProducer se encarga de
recuperar el documento, permitiendo su visualizacin desde el cliente que ha
enviado la solicitud.
Sustitucin de etiquetas
Obviamente no es preciso crear una aplicacin de servidor web para poder
recuperar una pgina con contenido esttico, ya que es mucho ms sencillo y
eficiente poner el documento original directamente accesible para los clientes.
Utilizar el componente TPageProducer, sin embargo, tiene algunas ventajas,
entre ellas la posibilidad de sustituir ciertas etiquetas durante el proceso de
composicin de la respuesta.
Cada vez que al procesar el cdigo HTML se encuentra una etiqueta que
comienza con la pareja de caracteres <# el componente TPageProducer genera
un evento OnHTMLTag, facilitando todos los parmetros necesarios para poder
realizar la sustitucin por el contenido que convenga. De los parmetros
recibidos los dos ms interesantes son TagString y ReplaceText. El primero
contiene el nombre de la marca encontrada, exceptuando los caracteres antes
mencionados, mientras que el segundo ser el destinatario del contenido que
hay que insertar.
Para ver en la prctica cmo se codifican estas etiquetas sustituibles y cul es
el proceso a seguir, vamos a modificar el documento usado como portada
aadiendo un contador, la fecha y la hora locales. Para ello abriremos el
documento original y aadiremos al final las dos lneas siguientes:
<p align="center">Es el visitante nmero <#CONTADOR></p>
<p align="right"><#FECHAHORA></p>
Tras guardar esta modificacin seleccione el componente TPageProducer, abra
la pgina Events del Inspector de objetos y haga doble clic sobre el evento
OnHTMLTag. El texto a introducir es el mostrado en el Listado 1. Observe que se
ha codificado una funcin independiente que se encarga de devolver el valor
actual del contador actualizndolo.
procedure TWebModule1.PortadaHTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText:
String);
begin
Case TagString[1] Of // Nos guiamos por el primer carcter de la
marca
'C': // si es el contador
ReplaceText := IntToStr(Contador);
'F': // si es la fecha y hora
ReplaceText := DateToStr(Date) + ' - ' + TimeToStr(Time);
End;
end;
// Este mtodo se encarga de devolver el valor del contador
Function TWebModule1.Contador: Integer;
Var
ArchivoContador: File of Integer;
ValorContador: Integer;
Begin
// Asignamos el archivo
AssignFile(ArchivoContador, 'ContadorVisitas.DAT');
Try // intentamos abrirlos para lectura
Begin
Reset(ArchivoContador); // para leer el valor actual
Read(ArchivoContador, ValorContador);
CloseFile(ArchivoContador);
End;
Except On Exception Do // si no es posible
ValorContador := 1; // inicializamos el contador
End;
Result := ValorContador; // lo devolvemos
Inc(ValorContador); // incrementamos
Rewrite(ArchivoContador); // y guardamos de nuevo
Write(ArchivoContador, ValorContador); // en el archivo
CloseFile(ArchivoContador);
End;

Listado 1. Cdigo para insertar en la pgina un contador, la fecha y la hora
A pesar de que las etiquetas introducidas en el cdigo HTML tienen un nombre
completo, como CONTADOR y FECHAHORA, a la hora de comprobar cul es la que
hay que sustituir tan slo se ha tenido en cuenta el primer carcter. Esto se ha
hecho por simple comodidad, con el fin de poder usar la sentencia Case de
Pascal. Podramos haber comparado las cadenas completas usando la
sentencia If.
Tras volver a compilar la aplicacin, al ejecutarla podr ver que el documento
ahora cuenta con un contador que se incrementa y que, adems, se muestran
la fecha y hora actuales. stos son elementos que no pueden introducirse en
un documento esttico, siendo las aplicaciones de servidor una de las tcnicas
que pueden generarlos.

Figura 7. El documento ahora cuenta con algunos elementos dinmicos, como
un contador, la fecha y hora.
Generar HTML a partir de tablas de
datos
En la mayora de las ocasiones las aplicaciones de servidor web componen los
documentos, total o parcialmente, a partir de informacin almacenada en bases
de datos. En estos casos, y segn se vio en el artculo Aplicaciones Web con
Visual Basic 6, suele ser necesario obtener los datos, abriendo una tabla o
ejecutando una consulta, recorrerlos y generar el cdigo HTML.
Con Delphi este proceso es ms simple, puesto que existen varios
componentes que facilitan la creacin de cdigo HTML a partir de datos
obtenidos de una tabla o consulta. Concretamente son tres los componentes
disponibles: TDataSetPageProducer, TDataSetTableProducer y
TQueryTableProducer. Los dos ltimos generan una tabla HTML que, como
veremos, puede ser personalizada completamente durante la fase de diseo.
Supongamos que al pulsar el enlace Entrada existente en la pgina de
portada, enlace que tendramos que definir apropiadamente, desesemos
mostrar una lista con todos los artculos existentes en una tabla alojada en una
base de datos Microsoft Access. Se trata de la misma base de datos empleada
en el artculo antes citado.
El primer paso ser crear un alias para poder acceder a dicha base de datos
mediante un componente TTable. Es posible realizar esta tarea desde el
Explorador SQL, tal y como se muestra en la Figura 8. Disponiendo de este
alias ya podemos insertar en el TWebModule un componente TTable asignando
los valores apropiados a DatabaseName y TableName.

Figura 8. Mediante el Explorador SQL creamos un alias que nos permita
acceder a la base de datos que contiene la tabla de artculos.
A continuacin se insertar en el mdulo un componente
TDataSetTableProducer, asignando a la propiedad DataSet una referencia
al TTable anterior segn se ve en la Figura 9. Haciendo doble clic sobre
TDataSetTableProducer se abrir un editor que permite establecer las columnas
que sern visibles en la tabla HTML, as como sus atributos particulares y las
propiedades generales de la tabla. Usando este editor configuramos la tabla de
tal forma que quede segn puede ver en la Figura 10.

Figura 9. Asociamos el componente TDataSetTableProducer con el TTable, de
tal forma que pueda obtener todas las filas de la tabla y generar el cdigo
HTML.


Figura 10. Usando el editor asociado al TDataSetTableProducer es posible
establecer la mayora de las propiedades de la tabla HTML a generar.
Lo nico que queda por hacer para que el cliente pueda acceder a esta tabla
de artculos es facilitar una opcin para ello. Con este fin se facilitar un enlace
en la pgina de portada que ejecutar la accin ListaArticulos. Esta accin,
que habr que aadir al TWebModule, tendr asociado el cdigo siguiente en el
evento OnAction.
tblArticulos.Open; // abrimos la tabla
// enviamos al cliente el contenido
Response.Content :=
ListaArticulos.Content;
tblArticulos.Close; // y la cerramos
Tras recompilar el proyecto podr acceder desde su cliente web y ver el
resultado. Si est usando la misma base de datos facilitada como ejemplo, la
informacin mostrada por el cliente ser similar a la de la Figura 11.

Figura 11. Al solicitar la lista de artculos el servidor abre la tabla, genera el
cdigo y lo devuelve al cliente.
Personalizar la generacin de cdigo
Aparte de establecer una serie de atributos para la tabla y las columnas,
nuestra aplicacin tambin puede controlar individualmente el contenido de
cada una de las celdas. Para ello el componente TDataSetTableProducer
genera un evento OnFormatCell por cada una de las celdillas, facilitando sus
coordenadas, alineacin, color y contenido.
Las coordenadas de las celdillas se inician en la columna cero y fila cero,
correspondientes a la esquina superior izquierda de la tabla. El contenido se
recibe en una variable llamada 3 y es posible modificarla directamente,
al igual que el color, alineacin y atributos.
En teora es posible usar el evento OnFormatCell para realizar cualquier
operacin que afecte a los atributos o contenido de una celdilla de la tabla.
Para verlo en la prctica seleccione el componente TDataSetTableProducer que
hay en el mdulo web, haga doble clic sobre el citado evento e inserte el cdigo
siguiente:
If (CellColumn=1) And (CellRow<>0) Then CellData :=
'<a href="ConsultaAutor?Autor=' +
CellData + '">' + CellData + '</a>';
Lo que se hace, como puede ver, es comprobar si la celdilla corresponde a la
primera columna de una fila que no sea la de ttulos. Dicha columna contiene el
nombre del autor del artculo, nombre que convertimos en un enlace que
ejecutar una accin llamada ConsultaAutory que contar con una parmetro
llamado Autor. El valor de este parmetro ser el propio nombre del autor.
Si tras hacer estos cambios vuelve a compilar e instalar la aplicacin, al
obtener la lista de artculos podr ver, como en la Figura 12, que todos los
nombres de autor actan ahora como enlaces. Al pulsar sobre ellos,
lgicamente, no se obtiene documento alguno puesto que no se ha codificado
la accin ConsultaAutor.

Figura 12. La tabla que genera ahora la aplicacin genera un enlace por cada
autor.
Ejecucin de consultas
Para que los enlaces asociados a los nombres de autor sirvan para algo, aparte
de aparecer en un bonito color y subrayados, ser preciso codificar una nueva
accin en el TWebModule. sta se encargara de recuperar el parmetro
facilitado, el nombre del autor, ejecutando una consulta para obtener los
artculos que correspondan y generar una nueva tabla. Este proceso puede
realizarse, en su mayor parte, tan slo con dos componentes.
El primer componente a aadir al mdulo ser un TQuery que, mediante la
propiedad DatabaseName, asociaremos al alias que habamos creado y usado
previamente. La consulta que ejecutar este componente, y que deberemos
introducir en la propiedad SQL, ser tan simple como esta:
SELECT *
FROM Articulos
WHERE Autor=:Autor

Observe que la clusula WHERE tiene asociado un parmetro, llamado :Autor,
que coincide en nombre con el parmetro que facilita el enlace de la tabla
HTML. Esto permitir una sustitucin automtica del parmetro en la consulta
por el valor obtenido de la peticin del cliente, sin necesidad de ninguna
intervencin por nuestra parte.
Para generar la tabla HTML a partir del resultado que se produzca en el TQuery
precisaremos un nuevo componente: TQueryTableProducer. ste estar
asociado al primero mediante la propiedad Query. Al igual que
TDataSetTableProducer, el componente TQueryTableProducer cuenta con un
editor que facilita la configuracin de la mayora de los atributos de la tabla.
Usaremos este editor, como puede verse en la Figura 13, para fijar las
columnas que se mostrarn, el tipo de borde y los colores.

Figura 13. Usamos el editor del componente TQueryTableProducer para
establecer las columnas visibles y los atributos de la tabla HTML.
El ltimo paso ser definir la nueva accin en el TWebModule. El camino
asociado a esta accin ser ConsultaAutor, tal y como se estableci al generar
los enlaces anteriormente. El cdigo asociado al evento OnAction de esta
accin ser una simple sentencia:
// Enviamos el resultado
Response.Content :=
TablaArticulosAutor.Content;
Ahora ya podemos compilar e instalar de nuevo la aplicacin. Pulsando sobre
cualquier autor de la tabla de artculos obtendremos otra nueva, ms reducida,
que contendr tan slo los artculos del autor seleccionado.

Figura 14. La consulta genera una nueva tabla que contiene slo los artculos
del autor seleccionado.
Resumen
Como se ha demostrado en este artculo, la creacin de aplicaciones de
servidor web con Borland Delphi es una tarea realmente sencilla, incluso ms
que con Visual Basic si comparamos la cantidad de cdigo escrita en el artculo
Aplicaciones Web con Visual Basic 6 con la escrita en ste. Esto se debe,
principalmente, a la existencia de componentes como TDataSetTableProducer y
TQueryTableProducer, capaces de interactuar directamente con una tabla de
datos o una consulta.
Gracias a la existencia de estos componentes no hay que preocuparse por
tareas como obtener los parmetros de un enlace o un formulario, ya que estos
parmetros son recuperados automticamente y usados, como se ha visto,
para ejecutar las consultas codificadas en la fase de diseo. Lo nico a tener
en cuenta es que hay que seguir unas ciertas reglas, de tal forma que los
nombres de los parmetros coincidan en el cdigo HTML y las consultas.
1997-2001 Francisco Charte Ojeda