 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Juan e Isabel Invitado
|
Publicado: Jue 21 Oct, 2004 10:01 am Asunto: destruccion de una clase |
|
|
Hola, en mi programa tengo definida una clase el ".h"
class icono
{
public:
int X, Y;
TImage* Image;
TLabel* Label;
}
en el cpp tengo...
tengo un std:vector de "icono"´s
el tema es que deseo crear un botón de elminar "icono" y que me lo elimine del vector, pero... es suficiente borrar del vector?, luego tengo que eliminar el Image y el Label de la pantalla?
Como puedo hacer para que me elimine de un plumazo todo? por que claro si no elimino el Image con "delete Image..." no me lo borra de la pantalla. Tengo que declarar la clase de otro modo?
Gracias por las respuestas |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Jue 21 Oct, 2004 4:19 pm Asunto: |
|
|
holas creo que para que tu clase pueda destruirse depende de como la inicialices si utilizas un puntero a la clase debera ser inicializada con New y para ser eliminada se utilizara con delete.
Asi mismo depende de que atributos tenga tu clase si existen punteros u otros tipos de datos en el Constructor de la clase debe estar la inicializacion de la misma, para que al destruirla se llame al destructor de la clase en donde debes liberar los puntero que utiliza la clase
en el h
| Código: | class cadena
{
Private
char *datos;
int nro;
public:
cadena(int); // constructor
~cadena(); // destructor
}; |
y en el cpp
| Código: | //constructor
cadena::cadena(int longitud)
{
datos=new char[longitud];
nro = longitud
}
//destructor
cadena::~cadena()
{
delete datos;
} |
como ven la clase se encarga de gestionar el puntero que crea en su constructor ya que en el destructor se encarga de eliminarlo de memoria, Espero haberme echo entender.
Américo
C++ Builder lo Mejor de lo mejor |
|
| Volver arriba |
|
 |
americo_bcb Lt

Registrado: 05 May 2004Mensajes: 84
|
|
| Volver arriba |
|
 |
Juan e Isabel Invitado
|
Publicado: Jue 21 Oct, 2004 4:47 pm Asunto: Lo tengo asi |
|
|
en el .h
class Tico
{
public:
int ID;
String name;
TImage *Image;
TLabel *Label;
};
en la cabecera de .cpp
Tico * icono; // icono es ce clase Tico
std::vector<Tico *> icos(2000); // creamos un vector de icos
...
y despues en el programa...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Tico* icono = new Tico;
icos[n]= icono; //icos[n] es un icono (clase Tico)
icos[n]->ID=n;
icos[n]->Image=new TImage(this);
icos[n]->Label=new TLabel(this);
icos[n]->posX=12;
icos[n]->Image->Left=3;
icos[n]->Image->Parent=Form1->ScrollBox1;
icos[n]->Label->Parent=Form1->ScrollBox1;
icos[n]->Image->Tag=n;
icos[n]->Image->Top=10;
icos[n]->Image->Left=10;
icos[n]->Image->AutoSize=true;
icos[n]->Image->Picture=Image1->Picture;
icos[n]->Image->BringToFront();
icos[n]->Image->OnMouseDown=ImgDown;
icos[n]->Image->OnMouseMove=ImgMove;
icos[n]->Image->OnMouseUp=ImgUp;
icos[n]->Image->OnClick=ImgClick;
icos[n]->Label->Top=icono->Image->Top+Image1->Height;
icos[n]->Label->Left=icono->Image->Left;
icos[n]->Label->Caption="icono "+IntToStr(icono->Image->Tag);
icos[n]->Label->Transparent=true;
icos[n]->Label->Visible=true;
n++;
}
ya asi me voy creando los objetos de la clase Tico
para destruirlo intento:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
icos.erase(icos.begin() + id);
}
pero claro, la imagen del ico no desaparece de la pantalla, y por eso deberia de hacer un delete icos[id] que no funciona claro
espero haberme explicado bien
Gracias |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 21 Oct, 2004 8:58 pm Asunto: |
|
|
Bien, dada la explicacion, utilizando std::vector, esto puede quedar asi..
para destruir la imagen, que no necesitas, no existe, una funcion "delete" y pasarle un parametro para borrarlo como si fuera un indice.
pero existe, una funcion, para intercambiar la imagen, con otra, y pasarle los elementos del vector, que estan, y una opcion seria enviar el elmento a borrar al final del vector, y luego utilizar, la funcion pop_back, ya que se supone que grabas con push_back, y posteriormente, redimensionar al vector
| Código: |
#include <vcl.h>
#include <vector>
//funcion de la clase.
void TFotos::deleteFoto(int Index){
int recorrer;
// recorremos el vector e intercambiamos los elementos
//
for(recorrer=Index;recorrer!=(int) this->Fotos.size()-1;recorrer++){
std::swap(this->Fotos[recorrer],this->Fotos[recorrer+1]);
}
// y borramos el ultimo,
this->Fotos.pop_back();
}
|
y una forma de usar la funcion, previa clase
| Código: | TFoto *pfot = new TFoto();
pfot -> pFot->deleteFoto(4); // borramos el boton o foto 4 |
_________________

Ultima edición por Cesar C. Salazar Gonzalez el Jue 21 Oct, 2004 11:17 pm, editado 2 veces |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 21 Oct, 2004 11:14 pm Asunto: |
|
|
por si no ven la respuesta, je je _________________
 |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Jue 21 Oct, 2004 11:23 pm Asunto: |
|
|
Hola, estoy empezando a manejar vectores, por eso me interesó este hilo.
Lo que ocurre es que me da la sensación de que Juan e Isabel hacen lo correcto, aprovechar los métodos de std::vector para borrar un elemento determinado sin abusar de código.
El problema no me parece que esté en el borrado del elemento sino en su presencia en pantalla ¿es eso? ¿habéis comprobado si el vector tiene un elemento menos después de su borrado? (con el debugger o un simple mensaje mostrando icos.Count).
Lo que ocurre es que borrar un elemento de la memoria no equivale a refrescar la pantalla, seguramente tendréis que actualizar el índice del elemento a mostrar en pantalla y posteriormente pedir que lo muestre ¿me equivoco?
Saludos. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 21 Oct, 2004 11:34 pm Asunto: |
|
|
lo he probado haciendo un vector de botones, uno de imagene, uno de paneles, y siempre, se redimenziona automaticamten, el vector, el codigo es para borrar el elemento del vector, el control del mismo corresponde a los usuarios finales,
je
saludos _________________
 |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|