Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-02-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Reto Delphi 2011

Hola a todos.

Ahora propongo este reto Delphi que me parece será más fácil de resolver que el anterior (esta vez no será necesario meternos con los registros de la CPU).

Tenemos una rutina de la cual sabemos que su última sentencia es una llamada a la función nativa GetMem:

Código Delphi [-]
Procedure T1.Proc1;
Begin
  ...
  GetMem (P, X);
End;

Como es de esperarse P es una variable puntero y X un entero que indica el tamaño del bloque de memoria que GetMem deberá reservar y asignar a la variable P.

T1 es una clase de la VCL de Delphi, cuyo código fuente podemos ver sin problemas. Proc1 es uno de los métodos públicos de T1. X es uno de sus campos privados (un miembro declarado en la sección Private de la clase), para el cual la clase no tiene propiedad o método alguno que nos permita conocer su valor.

En nuestra aplicación tenemos una instancia de clase T1 (variable Obj), y desde algún lugar realizamos esta llamada:

Código Delphi [-]
Begin
  Obj.Proc1;

Pero justo después de esa sentencia, necesitamos conocer el valor de X con el que Proc1 llamó a GetMem, es decir:

Código Delphi [-]
Begin
  Obj.Proc1;
  ShowMessage ('El valor de Obj.X es: ' + IntToStr (*));

La pregunta es: ¿Qué podemos colocar en lugar de ese asterisco para que el mensaje mostrado por ShowMessage diga la verdad, y qué código habría que escribir para lograrlo? Desde luego, sin modificar los fuentes de la VCL.

Recordemos que X es un campo privado de T1 y nuestro código de prueba (en mi caso hecho en Delphi 7), no forma parte de la misma unidad .pas que T1. Por lo tanto el compilador no admitirá un referencia explícita al campo Obj.X, ni siquiera derivando una clase de T1 (razón que me hace cuestionar de cuando en cuando la valía del nivel de visibilidad Private).

No vale el uso de moldes de acceso tipo:

Código Delphi [-]
T1Acceso = Class (MismoPadreQueT1)
  ...
  X :Integer;
End;

Estoy seguro que más de uno lo resolverá muy pronto. Cuando lo hagan, mencionen alguna pista si lo desean, pero por favor esperen un poco antes de publicar la solución completa. De esta forma la incógnita se mantendrá vigente por un tiempo considerable.

Un abrazo en privado.

Al González.
Responder Con Cita
 



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dudas sobre Delphi 2011 cmm07 Varios 9 15-01-2011 14:48:06
Lazarus Vs. Delphi 2011 (2012? 2014?) gatosoft Debates 33 14-08-2010 21:12:05
Delphi 2011 (Fulcrum) heroe Noticias 11 15-07-2010 10:00:21
delphi 2011 JXJ Noticias 13 03-04-2010 00:42:34


La franja horaria es GMT +2. Ahora son las 11:13:18.


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