Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.119
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Acceso a campos privados (explicación más amplia)

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:

Código Delphi [-]
  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:

Código Delphi [-]
  { 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.

Código Delphi [-]
  { 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:

Código Delphi [-]
  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

Código Delphi [-]
  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":

Código Delphi [-]
  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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:13:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi