Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2005
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Acceder a las propiedades protegidas de un DBGrid

Hola Amigos !

Intento lo siguiente con Delphi 2005 para poder acceder a la propiedad protegida DBGrid.Row
Código Delphi [-]
type
  THackGrid = class(TDBGrid);
...
procedure TMain.Panel1Enter(Sender: TObject);
var
  N_Row: Integer;
begin
  N_Row := THackGrid(DBGrid1).Row;
  Panel1.Top := 106 + (18*N_Row);
end;
pero al compilar me dá el siguiente error:
"[Error]: E2363 Only methods of descendent types may access protected symbol [Borland.VclDbCtrls]TCustomDBGrid.Row across assembly boundaries"

Alguna recomendación ? Gracias por vuestra ayuda.
Responder Con Cita
  #2  
Antiguo 09-11-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
El error te está diciendo que sólo puedes acceder a la propiedad Row desde algún método definido en la clase THackGrid y no desde la clase TMain

¿Qué es lo que quieres hacer?
Responder Con Cita
  #3  
Antiguo 10-11-2005
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Lo que intento precisamente es lo que se indica arriba en el código, al activar un panel ('Panel1'), posicionarlo en la pantalla según la línea del DBGrid1 que tenga selecccionado, concretamente en la posicion Top := 106 + (18*N_Row), siendo N_Row la línea del DBGrid1 que en ese momento se encuentre activa.

El código que tengo es:
Código Delphi [-]
unit Principal;
 
interface
 
uses
  ...
type
  THackGrid = class(TDBGrid);
  TMain = class(TForm)
    ...
    Frame1: TFrameA;
    ...
var
  Principal1: TMain;
 
implementation
...
procedure TMain.Panel1Enter(Sender: TObject);
var
  N_Row: Integer;
begin
  N_Row := THackGrid(Frame1.DBGrid1).Row;
  Panel1.Top := 106 + (18*N_Row);
end;
Nota: El FrameA está definido adicionalmente y el DBGrid1 es parte de ese FrameA, al igual que Panel1.
Gracias de nuevo por la ayuda.
Responder Con Cita
  #4  
Antiguo 10-11-2005
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola.

Como te dice el mensaje de error, no puedes acceder a dicha propiedad desde otra clase, sólo desde una clase descendiente. Por lo cual, la clase THackGrid debería publicar dicha propiedad (hacerla o bien public o bien published), y luego el mismo código que ya tienes te servirá:

Código Delphi [-]
THackGrid = class(TDBGrid)
public
  property Row;
end;

Por cierto, podrías también dejar la propiedad como protected (pero redeclarándola), y podrías accederla sólo desde la misma unit, pero no desde otras.

Código Delphi [-]
THackGrid = class(TDBGrid)
protected
  property Row;
end;

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #5  
Antiguo 10-11-2005
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias Andres1569,

He probado de las tres maneras, tanto public, published como protected. Ahora sí me deja compilar correctamente. Pero en todos los casos, al intentar acceder en el código del procedimiento a la función
Código Delphi [-]
N_Row := THackGrid(DBGrid1).Row;
me da un error en tiempo de ejecución "Object Reference not set to an instance of an Object" y no se ejecuta correctamente.

Que puedo estar haciendo mal ?

Nota : Una vez más indicar que utilizo Delphi 2005
Responder Con Cita
  #6  
Antiguo 10-11-2005
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola de nuevo:

Así a botepronto no sé el motivo, pero ése es el peligro de redeclarar una propiedad protegida, seguramente se dejó así por algo, habría que mirar en la VCL si el método (¿GetRow?) que devuelve dicha propiedad accede a algún objeto o puntero inexistente. O vete tú a saber, ese mensaje parece indicar que el objeto (¿el DBGrid1?) no apunta a una instancia válida.
__________________
Guía de Estilo
Responder Con Cita
  #7  
Antiguo 10-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
¿Has checado que el offset en la declaración de la clase sea el mismo en THackGrid y TDBGrid?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 11-11-2005
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Angry

Gracias Jachguate,

Me podrías por favor especificar un poco más el concepto de offset de ambas clases, o donde poder especificarlo ?

He probado el mismo código con Delphi 7 y funciona correctamente. La pregunta clave es por qué ...(!) no funciona en Delphi 2005 ?

Un saludo a todos.

Añado lo siguiente : Acabo de probar otra cosa cuanto menos sospechosa y curiosa. He intentado de la misma manera acceder a una función "no protegida" de THackGrid (por ejemplo, FieldCount) y me da el mismo error.
Código Delphi [-]
  N_Row := THackGrid(DBGrid1).FieldCount;
El error de nuevo es : "Object reference not set to an instance of an Object".

Última edición por gluglu fecha: 11-11-2005 a las 15:42:39.
Responder Con Cita
  #9  
Antiguo 11-11-2005
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Sigo comiéndome el coco con este tema !

Por lo que sigo consultando en todos los sitios que puedo encontrar, me hago una pregunta a mí mismo y a todos vosotros:

Sería necesario definir correctamente (en Delphi 2005) la propiedad 'Row', dentro de la definición de la clase THackGrid, de esta manera ?
Código Delphi [-]
protected property Row: Integer write SetRow;
Si fuera así, por desconocimiento mío, como se haría de manera correcta y completa?

Un saludo.
Responder Con Cita
  #10  
Antiguo 11-11-2005
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Hola, sólo puedo decirte que he probado ese código en Delphi 6.0 y funciona correctamente (haciendo uso de un Frame, como en tu ejemplo)

No creo que tenga que ver con la definición de la propiedad (no hace falta que le asignes ningún método write pues la propiedad ya existe en la clase base). Por el mensaje de error es como si accedieras a una propiedad de un Objeto inexistente, puede que el error esté en otra parte ...
__________________
Guía de Estilo
Responder Con Cita
  #11  
Antiguo 11-11-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Solo una pregunta, la aplicación que estás haciendo en Delphi 2005, es Win32 o .NET?

Por que el error que mencionas al principio del hilo me suena mucho a .NET (por aquello de los assembly), y puede ser que no sea posible hacer en .NET eso que quieres. Claro, solo estoy suponiendo, por que se tendría que investigar bien.


Saludos...
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 15:10:46.


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