Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Copiar imagen

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Copiar imagen Responder citando

Hola Foro

Tengo el siguiente inconveniente

Tengo en mi proyecto 2 Forms

En el Form principal un objeto Image (Image1) al cual le asigno una imagen bmp mediante un objeto OpenPictureDialog; y tambien tengo un boton (Button1).

En el Form 2 tengo otro objeto Image

Lo que quiero hacer es que al presionar el boton en el Form1 la imagen que esta en el objeto Image1 del form principal se copie en el objeto Image del Form2.

Alguien puede decirme como hago esto, ya que lo he tratado de esta forma

/* en el Form2 */
Image1->Picture->Bitmap->Assign(Form1->Image1->Picture->Bitmap);

y no me ha dado resultado.

Gracias
Volver arriba
Mensaje    Asunto: Copiar Imagen Responder citando

Que tal:

Vamos por partes.
Form1, Image1, Unit1.cpp, Unit1.h, pertenecen a la forma principal
Form2, Image1, Button1, Unit1.cpp, Unit1.h, pertenecen a la forma secundaria

Primero debes hacer un include de los .h de cada forma en los respectivos cpp, de la siguiente manera:

En el Unit1.cpp escribes: #include "Unit2.h"
En el Unit2.cpp escribes: #include "Unit1.h"

Despues de esto en el boton de la forma 2 haces esto (asumo que la forma principal ya tiene una imagen asignada para el image):

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Image1->Picture=Form1->Image1->Picture;
}

A mi me funciona, haz la prueba.

Suerte
_________________
--Gregus
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

HOLA:


Vayamos por partes,
He leido el otro mensaje tuyo, y es normal que se te quede colgado (por cierto muy currada la explicacion de Angel).


Image1->Picture=Form1->Image1->Picture;
Es una burrada estas asignando la misma direccion de memoria a dos componentes, como son componentes iguales, en principio traga, pero cuando destruyes uno, la direccion de memoria se libera creando un error en el otro componente que apuntaba a el mismo espacio.


Mi consejo, desde el Form1 al pinchar el boton.

TForm2 *a = new TForm2(this);
a ->Image1 ->Picture ->Bitmap ->Assign(Image1 ->Picture ->Bitmap);
a ->ShowModal();
a ->Free();

Veras como no tienes problemas en el destructor.

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Copiar Imagen Responder citando

Hola a todos:

Lo cierto es que TOÑO tiene razón, la instrucción: Image1->Picture=Form1->Image1->Picture;

crea confilctos utilizamos el destructor, Pero funciona, es una forma burda de hacer las cosas pero creo que cumple con lo que se pregunta. La solución de TOÑO no funciona del todo bien y hay que hacerle un par de modificaciones.

En todo caso, disculpen la ignorancia, pero aquí algunos estamos aprendiendo.

Chao.
_________________
--Gregus
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Cita:
Image1->Picture=Form1->Image1->Picture;
Es una burrada estas asignando la misma dirección de memoria ...

Lo seria si estuviésemos hablando de C++ puro, donde Picture seria un puntero, pero en este caso es una propiedad, la cual esta definida del siguiente modo:

    __property Graphics::TPicture* Picture = {read=FPicture, write=SetPicture};

o sea, que cuando leemos su valor actúa como un puntero normal, pero cuando la asignamos llama a la función SetPicture con el valor del puntero que intentamos asignar como argumento. Dicha función en los fuentes de la VCL esta implementada así:

    procedure TImage.SetPicture(Value: TPicture);
    begin
        FPicture.Assign(Value);
    end;

por tanto las dos líneas siguientes serian equivalentes:

    Image1->Picture = Form1->Image1->Picture;
    Image1->Picture->Assign(Form1->Image1->Picture);

Incluso en varios de los ejemplos de Borland se usa de este modo.

Si seguimos la pista en los fuentes de la VCL a que hace esto y resumiéndolo es crear un nuevo objeto dinámicamente y destruir el anterior en caso de que ya hubiese uno. (Esto lo podemos encontrar en el fuente 'graphics.pas')

Cita:
Alguien puede decirme como hago esto, ya que lo he tratado de esta forma
/* en el Form2 */
Image1->Picture->Bitmap->Assign(Form1->Image1->Picture->Bitmap);
y no me ha dado resultado.


Una posible razón por la que eso no te funcione es que el TImage no contenga un BMP, sino un JPEG u otro formato.


PD: Rara vez suelo contestar para corregir a alguien aun pensando que su respuesta no es correcta, pero siendo algo tan común, ya que hay más casos donde se usa este tipo de asignaciones y podría generar confusiones en la gente que empieza. Y si alguien piensa que estoy equivocado me gustaría que me mostrase un ejemplo reproducible donde esta asignación de algún problema.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Copiar Imagen Responder citando

Hola a todos.

Gracias Leo por la aclaración, la verdad es que ya me estaba haciendo trabas con este asunto, puesto que he probado esta signación tal cual muchas veces y no me había presentado problema, incluso me ha funcionado bien con imágenes JPG.

Suerte
_________________
--Gregus
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

HOLA:

Curioso, años maravillandome de la grandeza de la herencia de clases, la encapsulacion, la potencia de las herramientas rad y en cuanto veo algo que se parece a un misero puntero salta la bestia c pura y dura que llevo dentro, que le vamos a hacer me estare volviendo viejo y quisquilloso, de todas formas muchas por estar atento a las respuestas.

Cita:
Rara vez suelo contestar para corregir a alguien aun pensando que su respuesta no es correcta


Pues no entiendo por que, hasta el mejor escribano tiene un borron.

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.