Delphi - DELPHI (CREACION OBJETO DE CLASE)

 
Vista:

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Leandro Palavecino (5 intervenciones) el 24/05/2021 08:02:29
Buenas tardes.
Estoy aprendiendo programacion. He buscado informacion pero no logro comprender del todo algunos aspectos basicos.
Estoy teniendo problemas con la creacion de objetos a partir de una clase propia. Fijese que al ejecutar el metodo free del objeto perro, se elimina tambien del vector posicion 1. Pienso que debe ser porque ambos acceden a la misma direccion de memoria, y no estoy especificando algo en el metodo constructor de la clase. Pero no estoy seguro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
type
	Tperro = class
	nombre : string;
	raza : string;
end
 
var
	vector : array [1..10] of TPerro;
 
implementation
 
	procedure Tform1.cargarperros;
	begin
        vector[1] := TPerro.create;
	vector[1].nombre := 'Cubo';
	vector[1].raza := 'caniche';
 
        vector[2] := TPerro.create;
	vector[2].nombre :='Chopper';
	vector[2].raza := 'labrador';
	end;
 
	procedure Tform1.mostrardatos;
	var
	Perro : TPerro;
	begin
	Perro := TPerro.create;
	Perro := vector[1];
 
	Label1.caption:= Perro.nombre;
 
	Perro.free;
	end;
 
	procedure Tform1.visualizarvector;
	begin
	showmessage(vector[1].name); // aca verifico que el vector siga teniendo sus datos correspondientes
	end


EL RESULTADO DE SHOWMESSAGE SE MUESTRA VACIO.
PIENSO QUE LA VARIABLE PERRO HACE REFERENCIA A LA MISMA DIRECCION DE MEMORIA QUE VECTOR[1] CUANDO LE ASIGNO LA MISMA.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Ezequiel (1244 intervenciones) el 24/05/2021 19:01:00
No uses Perro.free;
Puesto que lo necesitarás para despues, cuando quieres ver sus valores.
Intenta usando
Perro := nil;
si te marca error, simplemente no liberes el objeto hasta terminar la ejecución del programa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Leandro Palavecino (5 intervenciones) el 24/05/2021 20:53:58
Pero de que manera puedo crear el objeto Perro y utilizarlo de manera independiente ? Puesto que por ejemplo preciso hacerle modificaciones a sus propiedades internas y vericar una serie de cosas antes de por ejemplo pasarlo al vector[i] nuevamente.


Ejemplo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
vector : array [1..10] of TPerro;
 
implementation
 
procedure TForm1.edicion;  // editar Perro, utilizando el objeto "PERRO" y no directamente desde el vector
var perro : TPerro;
begin
Perro := TPerro.create;
Perro := vector[1];
 
Perro.name := 'Olmedo';
Showmessage('Nombre anterior ' + vector[1].name);   //aca el nombre sale "olmedo"
Showmessage('Nombre Nuevo ' + Perro.name);  //aca tambien sale "olmedo"
 
vector[1] := Perro   //aca vuelvo al vector, y le asigno las modificaciones en el (recipiente) PERRO.
 
end;


Pero el showmessage muestra el mismo nombre que le puse a PERRO, y precisaria en ese caso que PERRO, sea un objeto de mi clase que apunte a otra parte al igual que cada posicion del array.

Recuerdo que antes utilizando la clase (record) no tenia estos problemas. Pero como necesito agregarle metodos a la clase TPerro, preciso utilizarlo como Objeto y no como registro.Aunque no se si se puede agregar metodos a la clase record. Aun asi, estoy aprendiendo y preciso entender como funciona.

He probado con PERRO := nil ; pero igualemte todo cambio que realize al objeto , se realiza tambien a la posicion del array que previamente le asigne. ( PERRO := vector[1] )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Ezequiel (1244 intervenciones) el 24/05/2021 23:15:42
Lo que sucede es que, sin importa si modificas la variable Perro o tu objeto del vetcor (vector[1]) se modifican ambos, puesto que se trata del mismo objeto.
En todo caso tu codigo de ejemplo debe ser asi

1
2
3
4
5
6
7
8
9
10
11
12
13
var
vector : array [1..10] of TPerro;
 
implementation
 
procedure TForm1.edicion; // editar Perro, utilizando el objeto "PERRO" y no directamente desde el vector
var perro : TPerro;
begin
Perro := TPerro.create;
Perro := vector[1];
Showmessage('Nombre anterior ' + vector[1].name); //aca el nombre sale "olmedo"
Perro.name := 'Olmedo';
Showmessage('Nombre Nuevo ' + Perro.name); //aca tambien sale "olmedo"

//vector[1] := Perro //aca vuelvo al vector, y le asigno las modificaciones en el (recipiente) PERRO.
La linea de arriba sería inecesaria, por lo mismo que ya te dije, que las modificaciones de cualquiera de los dos objetos es lo mismo.


end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Leandro Palavecino (5 intervenciones) el 24/05/2021 23:31:10
Lo se, ese es el problema, lo que yo necesitaria, es que PERRO, y VECTOR sean distintos objetos de la misma clase.

No se si eso es posible ? Puesto que por ejemplo a una etiqueta label1 y una etiqueta label2

realizo

1
2
3
4
5
label1.caption := 'hola';
 
label2 := label1;
 
label2.caption := 'chau'

en este caso, label1 tendria (hola) y label2 tendria (chau).

(nota, probando este pequeño codigo, me estoy dando cuenta que no funciona)

Leyendo un poco, lo correcto seria utilizar (assign) ?? estaria bien?
Pense que al asignarle a un objeto := otro objeto, se copiaban todas sus propiedades, mas cada uno de ellos seguiria siendo distintos objetos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Ezequiel (1244 intervenciones) el 25/05/2021 01:13:51
Cual es el objetivo de tu programa?
Para que funcione lo que comentas, tendrías que hacer una copia del objeto dentro de la variable Perro, hay una función copy pero no la he usado, no se si tu objeto la debe implementar o si es heredada de la propia clase, assign debería funcionar, pero puede que necesites hacer algunas modificaciones a tu código.

https://stackoverflow.com/questions/4041760/correct-way-to-duplicate-delphi-object
https://jonlennartaasenden.wordpress.com/2015/02/20/delphi-clone-object/
https://groups.google.com/g/borland.public.delphi.non-technical/c/T06FbLNxdkI?pli=1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Leandro Palavecino (5 intervenciones) el 25/05/2021 02:18:59
Cual es el objetivo de tu programa?

Tengo una clase llamada TSolicitud ( la cual es un objeto con varias propiedades , nombre, tipo ). etc

Tengo un vector de 10000 posiciones de la clase tsolicitud.

Ahora en el formulario tengo un boton, el cual se encargará de crear una nueva solicitud, para posteriormente añadirla al vector.
Pero como antes de añadirla al vector, debo realizarle chequeos de la informacion que se ingrese, lo hago sobre una variable interna de la clase (Tsolicitud)dentro del procedimiento del boton para trabajar sobre ella y no directamente sobre el vector.

Una vez que la variable de la misma clase TSOLICTUD, este con sus valores correspondiente y haya pasado los filtros traspasarla al vector, el cual es el que contiene la coleccion real.

Es decir, no quiero trabajar sobre el objeto real que guardara esa TSOLICITUD (el vector), sino trabajar sobre otra variable independiente, y posterioremente guardarla sobre el vector.
Luego el vector sera guardado entero a disco en un txt.

DE TODAS FORMAS SEGUIRE INVESTIGANDO. VI QUE UTILIZANDO LA CLASE (RECORD) NO TENGO PROBLEMAS, pero preciso agregarle métodos al objeto posteriormente. y a su vez trato de entender como funciona , porque si no estoy tirando codigo al azar.

IGUALMENTE MUCHAS GRACIAS, REVISARE LOS ENLACES QUE ME ENVIASTE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Ezequiel (1244 intervenciones) el 26/05/2021 00:02:43
Pues en este caso, te recomiendo hacer las validaciones de información antes de crear tu objeto, ya si pasa las validaciones entonces crea el objeto e inserta la información en él
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

DELPHI (CREACION OBJETO DE CLASE)

Publicado por Leandro Palavecino (5 intervenciones) el 26/05/2021 01:38:06
Perfecto. Efectivamente . Realize la misma pregunta en stackoverflow, y me puse a investigar las bases sobre POO, y me dieron una explicacion sobre los que pasa cuando realizo esta asignacion

Perro := vector[1];

Y es lo que no entendia. No me sucedia lo mismo antes con la clase (record) puesto que PERRO, adquiere no los valores de vector[i] siendo de clase objeto, si no mas bien una referencia en memoria de ese objeto.

Seguire profundizando. Mil gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar