Cómo acceder a la variable privada de una clase
Artículo por Club Developers · 31 diciembre 2005
5356 vistas
Ejemplo concreto:
Queremos, por ejemplo, acceder desde código a la variable privada FImageIndex de un TMenuItem (aunque no importarÃa ni la variable, ni el objeto ni la unidad).
Solución:
Todo está en las posibilidades del casteo, y de hacer que los tipos clase no son otra cosa que tipos de punteros particulares.
Lo primero que necesitamos es declarar una clase TMenuItemPublic de tal manera que derive de la misma clase que TMenuItem, es decir, de TComponent.
Observar que hay las mismas variables y exactamente en el mismo orden que en la clase TMenuItem, a diferencia que estas variables estarán declaradas como públicas.
De esta manera obtenemos una clase que tendrá la misma estructura en memoria que la clase TMenuItem, ¡¡lo que nos permite hacer un casteo de TMenuItem a TMenuItemPublic permitiéndonos acceder a todas las variables privadas de la primera como si fueran públicas!!
La variable que nos interesa es FImageIndex, el problema queda resuelto asÃ:
Queremos, por ejemplo, acceder desde código a la variable privada FImageIndex de un TMenuItem (aunque no importarÃa ni la variable, ni el objeto ni la unidad).
Solución:
Todo está en las posibilidades del casteo, y de hacer que los tipos clase no son otra cosa que tipos de punteros particulares.
Lo primero que necesitamos es declarar una clase TMenuItemPublic de tal manera que derive de la misma clase que TMenuItem, es decir, de TComponent.
Observar que hay las mismas variables y exactamente en el mismo orden que en la clase TMenuItem, a diferencia que estas variables estarán declaradas como públicas.
De esta manera obtenemos una clase que tendrá la misma estructura en memoria que la clase TMenuItem, ¡¡lo que nos permite hacer un casteo de TMenuItem a TMenuItemPublic permitiéndonos acceder a todas las variables privadas de la primera como si fueran públicas!!
delphi
type TMenuItemPublic=class(TComponent)  public   FCaption: string;   FHandle: HMENU;   FChecked: Boolean;   FEnabled: Boolean;   FDefault: Boolean;   FAutoHotkeys: TMenuItemAutoFlag;   FAutoLineReduction: TMenuItemAutoFlag;   FRadioItem: Boolean;   FVisible: Boolean;   FGroupIndex: Byte;   FImageIndex: TImageIndex;   FActionLink: TMenuActionLink;   FBreak: TMenuBreak;   FBitmap: TBitmap;   FCommand: Word;   FHelpContext: THelpContext;   FHint: string;   FItems: TList;   FShortCut: TShortCut;   FParent: TMenuItem;   FMerged: TMenuItem;   FMergedWith: TMenuItem;   FMenu: TMenu;   FStreamedRebuild: Boolean;   FImageChangeLink: TChangeLink;   FSubMenuImages: TCustomImageList;   FOnChange: TMenuChangeEvent;   FOnClick: TNotifyEvent;   FOnDrawItem: TMenuDrawItemEvent;   FOnAdvancedDrawItem: TAdvancedMenuDrawItemEvent;   FOnMeasureItem: TMenuMeasureItemEvent;   FAutoCheck: Boolean;  end;
La variable que nos interesa es FImageIndex, el problema queda resuelto asÃ:
delphi
var  UnMenuItem: TMenuItem; begin ....  TMenuItemPublic(UnMenuItem).FImageIndex := NewIndex; .... end;