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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Acceso a campos 387<br />

Inspirado en la película <strong>de</strong> romanos que pasaron ayer por la tele, he <strong>de</strong>sarrollado un<br />

pequeño ejemplo que muestra el código <strong>de</strong>l cliente en números romanos:<br />

procedure TForm1.tbClientesCustNoGetText(Sen<strong>de</strong>r: TField;<br />

var Text: string; DisplayText: Boolean);<br />

const<br />

Unida<strong>de</strong>s: array [0..9] of string =<br />

('', 'I', 'II', 'III', 'IV", 'V', 'VI', 'VII', 'VIII', 'IX');<br />

Decenas: array [0..9] of string =<br />

('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC');<br />

Centenas: array [0..9] of string =<br />

(', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM');<br />

Miles: array [0..3] of string =<br />

('', 'M', 'MM', 'MMM');<br />

begin<br />

if Sen<strong>de</strong>r.AsInteger > 3999 then<br />

Text := 'Infinitum'<br />

// Hay que ser consecuentes con el lenguaje<br />

else<br />

begin<br />

I := Sen<strong>de</strong>r.AsInteger;<br />

Text := Miles[I div 1000] + Centenas[I div 100 mod 10] +<br />

Decenas[I div 10 mod 10] + Unida<strong>de</strong>s[I mod 10];<br />

end;<br />

end;<br />

NOTA IMPORTANTE<br />

Más a<strong>de</strong>lante presentaré los campos calculados <strong>de</strong> la VCL. Muchos programadores<br />

los utilizan para resolver problemas <strong>de</strong> visualización o incluso entrada <strong>de</strong> datos, aunque<br />

los campos calculados no permiten modificaciones. En la mayoría <strong>de</strong> los casos,<br />

sin embargo, el problema pue<strong>de</strong> resolverse más fácilmente utilizando OnGetText y<br />

OnSetText. En particular, si alguien le pregunta cómo teclear un valor para un “campo<br />

calculado”, sospeche inmediatamente que es un problema soluble con estos eventos.<br />

Si a algún usuario se le ocurriese la peregrina i<strong>de</strong>a <strong>de</strong> teclear sus datos numéricos<br />

como números romanos, el evento a<strong>de</strong>cuado para programar esto sería OnSetText. El<br />

prototipo <strong>de</strong>l evento es el siguiente:<br />

type<br />

TFieldSetTextEvent = procedure (Sen<strong>de</strong>r: TField;<br />

const Text: string) of object;<br />

Este evento es utilizado con frecuencia para realizar cambios sobre el texto tecleado<br />

por el usuario para un campo, antes <strong>de</strong> ser asignado al mismo. Por ejemplo, un<br />

campo <strong>de</strong> tipo ca<strong>de</strong>na pue<strong>de</strong> convertir la primera letra <strong>de</strong> cada palabra a mayúsculas,<br />

como suce<strong>de</strong> en el caso <strong>de</strong> los nombres propios. Un campo <strong>de</strong> tipo numérico pue<strong>de</strong><br />

eliminar los separadores <strong>de</strong> millares que un usuario pue<strong>de</strong> colocar para ayudarse en la<br />

edición. Como este evento se <strong>de</strong>fine para el campo, es in<strong>de</strong>pendiente <strong>de</strong> la forma en<br />

que se visualice dicho campo y, como veremos al estudiar los módulos <strong>de</strong> datos,<br />

formará parte <strong>de</strong> las reglas <strong>de</strong> empresa <strong>de</strong> nuestro diseño.<br />

Para ilustrar el uso <strong>de</strong>l evento OnSetText, aquí está el manejador que lleva a mayúsculas<br />

la primera letra <strong>de</strong> cada palabra <strong>de</strong> un nombre:

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

Saved successfully!

Ooh no, something went wrong!