11.05.2013 Views

La Cara Oculta de Delphi 6

La Cara Oculta de Delphi 6

La Cara Oculta de Delphi 6

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

WebSnap: conjuntos <strong>de</strong> datos 941<br />

Básicamente, una cesta contiene una cantidad variable <strong>de</strong> productos, ItemCount. Items<br />

<strong>de</strong>vuelve el nombre <strong>de</strong> un producto dada su posición en la cesta, y Qty contiene el<br />

número <strong>de</strong> unida<strong>de</strong>s para ese producto. Ambas propieda<strong>de</strong>s trabajan con la posición,<br />

y son útiles para generar representaciones visuales <strong>de</strong> la cesta. Por otra parte, la propiedad<br />

vectorial Units acepta como índice la <strong>de</strong>scripción <strong>de</strong>l producto, y <strong>de</strong>vuelve<br />

también la cantidad <strong>de</strong> unida<strong>de</strong>s que hay en la cesta. Si el producto no existe, Units<br />

<strong>de</strong>vuelve 0; <strong>de</strong> este modo, tienen sentido instrucciones como la siguiente:<br />

// Si no hay Coca Cola, se añadirá una unidad<br />

FBasket.Units['Coca Cola'] := FBasket.Units['Coca Cola'] + 1;<br />

Pero lo más interesante <strong>de</strong> TBasket es la propiedad AsVariant. Cuando leemos su<br />

valor, recibimos una representación lineal <strong>de</strong>l contenido <strong>de</strong> la cesta, <strong>de</strong>ntro <strong>de</strong> una<br />

ca<strong>de</strong>na <strong>de</strong> caracteres. Por el contrario, si asignamos en esa propiedad un variante que<br />

contenga ca<strong>de</strong>na correctamente formada, el contenido <strong>de</strong> la cesta se ajusta al valor<br />

codificado. Adicionalmente, las constantes especiales Unassigned y Null se interpretan<br />

como cestas vacías.<br />

Por último, crearemos una instancia <strong>de</strong> la cesta <strong>de</strong>ntro <strong>de</strong>l módulo <strong>de</strong> datos. Mi objetivo<br />

es evitar la creación <strong>de</strong>senfrenada <strong>de</strong> objetos temporales <strong>de</strong> cestas, cada vez que<br />

sea necesario operar con una <strong>de</strong> ellas. Esto pue<strong>de</strong> evitarnos algo <strong>de</strong> fragmentación <strong>de</strong><br />

la memoria <strong>de</strong>l servidor:<br />

type<br />

TmodDatos = class(TWebAppDataModule)<br />

// …<br />

private<br />

FBasket: TBasket;<br />

// …<br />

end;<br />

<strong>La</strong> variable se inicializa durante la construcción <strong>de</strong>l módulo <strong>de</strong> datos:<br />

procedure TmodDatos.WebAppDataModuleCreate(Sen<strong>de</strong>r: TObject);<br />

begin<br />

FBasket := TBasket.Create(Self);<br />

end;<br />

Y no hace falta <strong>de</strong>struirla; al ser un componente y especificar que su propietario es el<br />

módulo <strong>de</strong> datos, se <strong>de</strong>struye automáticamente cuando este último dice adiós.<br />

Añadir a la cesta<br />

Ahora nos ocuparemos <strong>de</strong> la acción <strong>de</strong> añadir a la cesta. Debe tener presente que<br />

ActionBasket va siempre ligada a una fila concreta <strong>de</strong>l adaptador. Para asociarle un<br />

código <strong>de</strong> producto utilizaremos los parámetros <strong>de</strong> la acción, que se <strong>de</strong>finen durante<br />

la respuesta al evento OnGetParams:<br />

procedure TmodDatos.ActionBasketGetParams(Sen<strong>de</strong>r: TObject;<br />

Params: TStrings);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!