Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-04-2007
Avatar de juangiron
juangiron juangiron is offline
Miembro
 
Registrado: ene 2007
Posts: 26
Poder: 0
juangiron Va por buen camino
Question Paso de Array entre Clases

Hola Soy nuevo en el lenguaje DELPHI, llevo varios años trabajando en otros lenguajes y la verdad se me a complicado mucho el lograr pasar un arreglo dinamico de objetos de una clase particular, para utilizarlo en otra clase...
Código Delphi [-]type TObjeto = class private NombreObj:string; TipoObj:Integer; PosiObjX:Integer; posiObjY:Integer; MoveUP:Boolean; MoveDOWN:Boolean; MoveRIGHT:Boolean; MoveLEFT:Boolean; ColorObj: TColor; MyIcono: TIcon; public // procedure TObjeto.Create(AOwner: TObjeto); override; procedure setNombreObj(NomObj:String); procedure setTipoObj(TipObj: Integer); procedure setPosObj(posX:Integer;posY:Integer); procedure setMove(UP,DOWN,RIGHT,LEFT:Boolean); procedure setIcon(MyIco:TIcon); procedure setColor(Color:TColor); function getTipoObj():Integer; function getNombreObj():string; end;


la idea es que quiero encapsular muchos objetos de esta clase en un array, y poderlos mostrar en otra clase diferente en la que cree el array, he voletado mi codigo de mil maneras, pero no logro conseguir que mi arreglo tenga los datos que yo ingrese.. tal vez y creo yo que se estan perdiendo la referencia de la memoria, no se...

si alguien puede ayudarme le agradeceria mucho, ya que necesito entregar una aplicacion en menos de ocho dias y estooy quedado desde hace rato en algo tan basico como eso...

mil gracias
Juank
Responder Con Cita
  #2  
Antiguo 30-04-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
podrias poner un ejemplo de lo que quieres hacer en otro lenguaje que domines para explicarte como hacerlo en delphi?
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 30-04-2007
Avatar de juangiron
juangiron juangiron is offline
Miembro
 
Registrado: ene 2007
Posts: 26
Poder: 0
juangiron Va por buen camino
Question ya va!

clasee Tobjeto con sus respectivos metodos Set y Get
Código Delphi [-]
type TObjeto = class
  private
   NombreObj:string;
   TipoObj:Integer;
   PosiObjX:Integer;
   posiObjY:Integer;
   MoveUP:Boolean;
   MoveDOWN:Boolean;
   MoveRIGHT:Boolean;
   MoveLEFT:Boolean;
   ColorObj: TColor;
   MyIcono: TIcon;
  public
   procedure setNombreObj(NomObj:String);
   procedure setTipoObj(TipObj: Integer);
   procedure setPosObj(posX:Integer;posY:Integer);
   procedure setMove(UP,DOWN,RIGHT,LEFT:Boolean);
   procedure setIcon(MyIco:TIcon);
   procedure setColor(Color:TColor);
   function getTipoObj():Integer;
   function getNombreObj():string;
end;

en otro clase necesito llenar el arreglo de objetos
Código Delphi [-]
 type
  ArrayObj = Principal.ArrayObj;
type
  TFrmObjDisponibles = class(TForm)
    ListBox1: TListBox;
    BtnCerrar: TButton;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
   public
     ArrayObjetos : ArrayObj;
     MyObj : TFrmObjeto;

en esta clase quiero llenar ArrayObjetos con los objetos de Tobjetos
lo estoy haciendo asi
Código Delphi [-]
//tamano := high(Myjk.ArrayObjetos)+1;
 SetLength(Myjk.ArrayObjetos,tamano+1);
ArrayObjetos[tamano]:=TObjeto.Create;
ArrayObjetos[Tamano].setNombreObj(EdtNombreObj.Text);
ArrayObjetos[Tamano].setColor(ColorBox1.Color);
ArrayObjetos[Tamano].setIcon(MyIcono);
ArrayObjetos[Tamano].setMove(CBoxUP.Checked,CBoxDOWN.Checked,CBoxRIGHT.Checked,CBoxLeft.Checked);
ArrayObjetos[Tamano].setTipoObj(Tipo);
 inc(tamano);
efectivamente esta llenando el Array (al visualizarlo con un brekpoint)

ahora quiero desde una clase diferente a las 2 visualizar el arreglo

pero al hacer una funcion de pruueba para ver si esta llegando el tamaño de array me muestra -1 (osea que no es la misma referencia al array) o tratar de mostrar el nombre
Código Delphi [-]
for I := 0 to high(ArrayObjetos) do
    ShowMessage(ArrayObjetos[i].getNombreObj);
Responder Con Cita
  #4  
Antiguo 30-04-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
puedes crear tu array de objetos usando la funcion varArrayCreate, o usando el tipo TList, veamos como hacerlo con TList;
Código Delphi [-]
type
  TFrmObjDisponibles = class(TForm)
    ListBox1: TListBox;
    BtnCerrar: TButton;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
   public
     ArrayObjetos : TList;
     MyObj : TFrmObjeto;

el llenado de los atributos, no de los objetos:
Código Delphi [-]
var
  nuevoItem : TObjeto;
begin
  nuevoItem := TObjeto.create;
  nuevoItem.setNombreObj(EdtNombreObj.Text);  
  nuevoItem.setColor(ColorBox1.Color);  
  nuevoItem.setIcon(MyIcono);
  nuevoItem.setMove(CBoxUP.Checked,CBoxDOWN.Checked,CBoxRIGHT.Checked,CBoxLeft.Checked);
  nuevoItem.setTipoObj(Tipo);
  //añadir al array
  ArrayObjetos.add(nuevoItem);

el acceso:
Código Delphi [-]
for I := 0 to ArrayObjetos.count-1 do
    ShowMessage(TObjeto(ArrayObjetos[i]).getNombreObj);
__________________
self.free;

Última edición por droguerman fecha: 30-04-2007 a las 22:19:34.
Responder Con Cita
  #5  
Antiguo 30-04-2007
Avatar de juangiron
juangiron juangiron is offline
Miembro
 
Registrado: ene 2007
Posts: 26
Poder: 0
juangiron Va por buen camino
Question pregunta

me podrias ayudar en la definicion de los objetos respectivos de cada clase para poder acceder a los metodos.. es decir lo que creo que me esta pasando es que al instanciar un objeto de una clase, por ejemplo donde esta lleno el array, no es la misma instancia en memoria.. cual es la forma correcta de declarar un objeto de una clase en varias clases refiriendose al mismo espacio en memoria, algo asi como el patron SIngleton.. una solo instancia de una clase


mil gracias
Responder Con Cita
  #6  
Antiguo 30-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Todo objeto que se crea en Delphi está referenciado por la variable que se usa.
Código Delphi [-]
var miobjeto:Tobjecto;
begin
  miobjeto := TObjeto.Create;
Aquí, la variable miobjeto es un puntero hacia la zona de memoria donde se ha creado la instanciación de la clase (que vaya usted a saber donde es).

Cuando hacemos algo así:
Código Delphi [-]
var a : array [0..1] of TObjeto;
     miobjeto:Tobjeto;
begin
   miobjeto := Tobjeto.create;
  a[0] := miobjeto;
end;

En realidad estamos copiando el puntero a la posición cero del array "a". La zona de memoria donde reside el objeto, no se ha tocado para nada.

En tu caso particular, ocurre lo mismo:
Código Delphi [-]
ArrayObjetos[tamano]:=TObjeto.Create;

primero se crea el objeto en memoria, y la dirección donde reside, se copia en la posición "tamano" del array.

La respuesta a tu pregunta, por tanto, es copiar el puntero al interior de la clase, pero, no sé si se tratará de eso.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 30-04-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Lepe
Todo objeto que se crea en Delphi está referenciado por la variable que se usa.
... siempre que se use una variable y no la "construcción with"...

Código Delphi [-]
with TObjetoCualquiera.Create() do
begin
  try
    MetodoDeObjetoCualquiera();
  finally
    Free;
  end;
end;

Pero no lo digo sino para incordiar un poco a Lepe, o sea, no me hagan mucho caso.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 30-04-2007
Avatar de juangiron
juangiron juangiron is offline
Miembro
 
Registrado: ene 2007
Posts: 26
Poder: 0
juangiron Va por buen camino
Question ????

al declarar el objeto como "var" es acsequible desde cualquier clase? tengo que asignarle memoria al objeto que instancia esa clase en la nueva clase donde lo voy a utilizar?

clase1

Código Delphi [-]
var miobjeto:Tobjecto;
begin
  miobjeto := TObjeto.Create;

Última edición por dec fecha: 30-04-2007 a las 23:42:55.
Responder Con Cita
  #9  
Antiguo 01-05-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
al llamar al constructor estás reservando memoria en el heap, la variable solo sirve en este caso para no perder la referencia de donde está esa clase, luego cuando la asignamos como un nuevo elemento de TList (en el ejemplo que te dí), aun recordamos la referencia a memoria
__________________
self.free;
Responder Con Cita
  #10  
Antiguo 01-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Las variables de ese tipo "no están bien vistas" . Pero vamos... se siguen usando.

Tendrás que ver donde necesitas la variable y la visibilidad, me explico:
Código Delphi [-]
unit clases;

interface

uses ....

Type Cliente = class (Tobject)


var pepe: TCliente;

implementation 

uses ...

var jose :TCliente



initialization 
  pepe := TObject.Create;

finalization
  pepe.Free;

Si necesitas que fuera de la unidad, se pueda hacer uso de pepe,
tendrás que declarar la variable pepe en la zona de interface.

Si solo usas la variable temporalmente y no quieres que sea accesible desde fuera de la unidad "Clases", entonces, usa una variable del tipo jose (en la zona de implementación).

En ambos casos, debes llamar al constructor de la clase para crear el objeto. Una de las formas, te la muestro con pepe, creando dicha variable cuando se haga uso de la unidad por primera vez (initialization), y manteniéndolo en memoria hasta que la unidad ya no haga falta (cuando cierres el programa).

Si necesitas más control de si está creada o no, puedes hacerlo así:
Código Delphi [-]
unit clases;

interface

uses ....

Type Cliente = class (Tobject)


var pepe: TCliente;

implementation 

uses ...

var jose :TCliente

procedure uno;
begin
  if not assigned(jose) then // preguntamos si jose ha sido creado en memoria
    jose := TCliente.Create;// no está creado, así que lo creamos
  jose.nombre := 'jose';
  // trabajar con jose

  FreeAndNil(jose); // lo destruimos asegurando que se asigna un nulo, para 
// que la proxima vez que se ejecute este procedimiento funcione
// la pregunta "not assigned(jose)
end;

Lo que si espero que quede claro, es que "pepe" no es lo mismo que "jose"

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 02-05-2007
Avatar de juangiron
juangiron juangiron is offline
Miembro
 
Registrado: ene 2007
Posts: 26
Poder: 0
juangiron Va por buen camino
Thumbs up Gracias!!

ya me quedo claro.. MIL GRACIAS PARA TODOS,,, CHEVERE QUE SE PREOCUPEN POR AYUDAR A LA DEMAS GENTE... POR ULTIMO ME QUEDA PREGUNTARLES si existe algún libro que me puedan recomendar para comprarlo... o donde encuentren ebooks sobre delphi....
Responder Con Cita
  #12  
Antiguo 02-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
la cara oculta de delphi 4 es gratuito y podrás encontrarlo rápidamente en google.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 02-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
Las variables de ese tipo "no están bien vistas" . Pero vamos... se siguen usando.
¿A qué te refieres?

// Saludos
Responder Con Cita
  #14  
Antiguo 02-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ahora que lo mencionas, he suspuesto mucho, de hecho, he supuesto que se trata de variables globales, pero pensaba en otras cosas. Ahora mismo recuerdo las variables:

ShortdateTime, LongDateTime, DecimalSeparator, etc de la unidad SysUtils, así que... tendré que rectractarme de lo dicho :P


OFFTOPIC: joo.. no se puede tener un lapsus de memoria en estos foros...

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
ayuda paso a paso Shared Connection eangeles Providers 0 09-11-2006 02:06:04
Novato (Paso a Paso de una consulta) enecumene Conexión con bases de datos 2 29-05-2006 20:52:19
Paso de Array en variable $_POST mieltxo PHP 4 16-06-2005 08:22:51
como paso variables entre paginas.php sarga PHP 5 22-08-2004 02:06:40
Paso de parametros entre delphi y c++ jsb C++ Builder 0 16-02-2004 16:22:49


La franja horaria es GMT +2. Ahora son las 13:52:43.


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