 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Max Invitado
|
Publicado: Jue 17 Jul, 2003 7:28 am Asunto: Copiar imagen |
|
|
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 |
|
 |
Gregus Cdt


Registrado: 13 May 2003Mensajes: 9
|
Publicado: Jue 17 Jul, 2003 6:36 pm Asunto: Copiar Imagen |
|
|
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 |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Vie 18 Jul, 2003 12:49 pm Asunto: |
|
|
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 |
|
 |
Gregus Cdt


Registrado: 13 May 2003Mensajes: 9
|
Publicado: Vie 18 Jul, 2003 8:57 pm Asunto: Copiar Imagen |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 18 Jul, 2003 10:37 pm Asunto: |
|
|
| 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 |
|
 |
Gregus Cdt


Registrado: 13 May 2003Mensajes: 9
|
Publicado: Sab 19 Jul, 2003 4:20 pm Asunto: Copiar Imagen |
|
|
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 |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Lun 21 Jul, 2003 8:35 am Asunto: |
|
|
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 |
|
 |
|
|
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.
|