PDA

Ver la Versión Completa : Acceso a campos privados (explicación más amplia)


dec
01-07-2006, 00:14:35
En Borland/Object Pascal, como en algunos otros lenguajes, existe lo que se llama "molde de tipo" o "typecast". En términos generales, hacer un molde de tipo, es aplicar un tipo de dato a un bloque de memoria, con el fin de tener acceso a su contenido bajo el formato del tipo de dato utilizado.


Ejemplos:


Letra := Char (ValorByte);
TipoDelVariante := TVarData (ValorVariante).VType;
Application.MessageBox (PChar (Mensaje), PChar (Titulo), mb_IconStop Or mb_OK);
PExtended (Puntero)^ := 3.141592;


Los moldes de tipo también pueden usarse con instancias de objetos, como se ve en ocasiones dentro de los manejadores de eventos:


{ Deshabilitar el botón que disparó el evento OnClick }
TButton (Sender).Enabled := False;


En ocasiones me he visto en la necesidad de accesar directamente a campos privados (referenciables sólo dentro de la unidad que declara la clase) de una instancia de objeto, cuya clase fue definida en una unidad aparte de la que requiero tenga el acceso. Para lograrlo creo lo que denomino "molde de acceso", como el que aparece a continuación.


{ Tipo Molde de Acceso a TField }
TMoldAcceTField = Class (TComponent)
Public { En la declaración de TField, esta sección es privada }
FDataSet :TDataSet;
FFieldName :String;
FDataType :TFieldType;
FReadOnly :Boolean;
End;


Como ejemplo, si se quiere poner en False la propiedad ReadOnly de un componente campo en tiempo de ejecución, basta con codificar la sentencia:


Campo.ReadOnly := False;


La sentencia anterior no sólo cambia el valor de la propiedad ReadOnly, también lleva a cabo procesos internos que por lo general no causan ningún problema. En cierta aplicación tuve la necesidad de anular tales procesos internos.

¿Cómo pasar por alto los procesos internos, derivados del cambio de valor de la propiedad ReadOnly?

Observando el código fuente de la VCL (Delphi 3), se puede notar que la propiedad ReadOnly guarda su valor en un campo privado llamado FReadOnly. Para cambiar el valor de la propiedad pasando por alto los procesos internos, sólo hay que cambiar el valor de FReadOnly, sin embargo la sentencia


Campo.FReadOnly := False;


No es posible (y con justa razón), debido a que FReadOnly es un campo privado.

Aquí es donde entra en juego el uso de un molde de acceso, como el presentado párrafos atrás. TMoldAcceTField tiene la misma declaración inicial que TField, la clase base de un componente campo, con dos marcadas diferencias:

1. La sección de los campos privados de TField, es una sección pública en TMoldAcceTField.

2. La declaración termina con el último campo privado al que se desea tener acceso, en el caso del ejemplo, FReadOnly (no hay necesidad de declarar una copia exacta de la estructura completa).

Usando el molde de acceso, el compilador autoriza (y la aplicación ejecuta) la sentencia que cambia el valor de la propiedad ReadOnly, sin que el componente campo "se de cuenta":


TMoldAcceTField (Campo).FReadOnly := False;


NOTA: Recomiendo utilizar con discreción y sólo como último recurso, esta técnica de Molde de Acceso, ya que no es una práctica sólida de programación.

Espero haya sido de utilidad, gracias.

Alberto González.

GH15, Alta Calidad en Desarrollo de Sistemas.
gh15 ARROBA usa.net, algonzalez01 ARROBA usa.net