Ir al contenido


Foto

Acceso a punteros dentro de una clase


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Vivas84

Vivas84

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 22 junio 2011 - 09:48

Buenas!
Utilizando la DCLX -Delphi Container Library-, he creado una lista que contiene objetos de una clase específica. Esta clase contiene varios punteros: a un TChart, a un TComboBox, o a un TCheckListBox entre otros. La cuestión es que si después de insertarlos, quiero acceder a ellos, el programa de da un "problema de acceso a memoria". Con clases sin punteros, puedo acceder a ellos sin problemas. Si reservo memoria para el puntero, puedo acceder al objeto, pero no se modifican los objetos TChart, TComboBox del formulario,..
Os copio y pego cómo son el constructor y los métodos que devuelven alguno de los objetos: como el TChart, el TComboBox, etc,... a ver si alguien sabe por dónde puede ir la cosa.



delphi
  1. Constructor ClaseA.Create(Poblado: ClasePropia; Combo: TComboBox;Representacion: TChart; CanalesImportantes: TCheckListBox);
  2. begin
  3.   Pueblo := @Poblado;
  4.   Caja := @Combo;
  5.   Grafica := @Representacion;
  6.   CanalesSeguimiento := @CanalesImportantes;
  7. end;





delphi
  1. function TClaseA.GetPueblo():Localidad;
  2. begin
  3. result := Pueblo^;
  4. end;



Saludos
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 junio 2011 - 10:26

Yo veo una cosa incorrecta en principio: Poblado es de un tipo, mientras que la funcion GetPueblo devuelve un objeto de otro tipo distinto... no se si es un error al copiar rapido y esas cosas, pero al menos tal como lo pones, ese punto fallaría.

Por lo que comentas y el mensaje de error, supongo que ambos objetos, el container y los referenciados, están en espacios de memoria diferentes, aunque sin saber de donde "recolectas" los punteros no sabria decirte si es o no por esto.

Si por ejemplo los punteros los pasa un EXE delphi a una DLL delhi, me temo que esos punteros podrian ser inaccesibles por la DLL, y aunque tengas un puntero "genuino", desde la DLL no es mas que un integer.

Si es esto, el acceso externo es dificil, puedes usar funciones de Win32 para acceder al objeto "window" que representea a un TEdit, por ejemplo, para obtener el TEdit.Text indirectamente, mirando en el objeto windows que tiene escrito.

En otros casos, como acceder a temas internos del objeto sin equivalente en su correspondiente objeto windows, lla cosa pintaria mal, pero supongo que no es imposible.
  • 0

#3 Vivas84

Vivas84

    Member

  • Miembros
  • PipPip
  • 23 mensajes

Escrito 22 junio 2011 - 10:37

Lo de Poblado ha sido un fallo mio al copiar.

Dentro de una clase que es un TForm que contiene tanto la lista como el TChart, el TComboBox, etc,.. es dónde se tienen todos los objetos.
La idea de la lista es que tenga agrupados los elementos que pertenecen a una misma sección (El combo, el checklistbox o el chart), y hacer las cosas correspondientes a cada sección de forma genérica, y no usar Chart1, ComboBox1, ComboBox2, etc,... y repetir más código del necesario.

Saludos.
  • 0

#4 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 22 junio 2011 - 11:58

Hola,

los objetos ya son punteros en sí, así que no veo razón para emplear la arroba a la hora de guaradr esas referencias, es más estarás guardando una dirección que no se corresponde con el objeto en sí sino con la dirección de los parámetros tal como te llegaron al constructor, ¿no te valdría lo siguiente?



delphi
  1. Constructor ClaseA.Create(Poblado: ClasePropia; Combo: TComboBox;Representacion: TChart; CanalesImportantes: TCheckListBox);
  2. begin 
  3.   Pueblo := Poblado; 
  4.   Caja := Combo; 
  5.   Grafica := Representacion;
  6.   CanalesSeguimiento := CanalesImportantes;
  7. end;




Saludos
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 junio 2011 - 04:04

Lo de Poblado ha sido un fallo mio al copiar.

Dentro de una clase que es un TForm que contiene tanto la lista como el TChart, el TComboBox, etc,.. es dónde se tienen todos los objetos.
La idea de la lista es que tenga agrupados los elementos que pertenecen a una misma sección (El combo, el checklistbox o el chart), y hacer las cosas correspondientes a cada sección de forma genérica, y no usar Chart1, ComboBox1, ComboBox2, etc,... y repetir más código del necesario.

Saludos.


Yo eso mismo lo consigo recorriendo el TForm.Components, o el TPanel donde tengas todo lo referente a una cosa, asi puedes localizar todos los TComboBox de un Form o de solo una pestaña del form cambiando algo en todos ellos.

Lo hago por ejemplo para enviarlos uno a uno a un "sistema de traduccion" simultanea, de forma que mi interface pase de español a ingles "al vuelo", asi que te puedo asegurar que es un metodo rapido de programar y de ejecutarse, ya que la lista de componentes esta ya lista, es solo una lista de punteros rapidisima de recorrer.

Eso si, haz de hacer la busqueda de componentes recursiva: Cada componente que encuentras pegado al form, podria ser un panel con sus propia lista de components de los que es owner, pero bueno, es el caso ideal para una rutina recursiva.
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 22 junio 2011 - 04:08

Un detalle sobre la idea anterior de recorrer los componentes del form: yo uso la lengueta donde estan pegados, o su tag, para diferenciarlos al tratarlos, pero tu podrias usar algo del estilo "disable todos los componentes cuyo nombre empiece por/contenga _Saldo_".

Siempre que sigas una metodologia paras nombrar tus componentes, es un metodo valido y no es lento de ejecutarse, vamos, que no es lo ideal, pero si tienes 500 componentes en tu form, que ya es mucho, hablas de comprobar 500 nombres de componentes, eso no es tiempo.
  • 0




IP.Board spam blocked by CleanTalk.