 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Lun 15 Jul, 2013 3:05 pm Asunto: |
|
|
Vale,
Muchas gracias,
Carlos _________________ Carlos J. Fernandez |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 16 Jul, 2013 6:56 pm Asunto: |
|
|
| Carlos J. Fernandez escribió: | | compila sin problemas, pero va mal. |
¿Te compila en XE3 sin hacer cambios o has hecho algún cambio? Si es así, ¿cuales? |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 16 Jul, 2013 7:16 pm Asunto: |
|
|
Leo,
Lo unico que ademas leí por aquí por que tenia un problema al compilar por otras razones, creo recordar que era que borraramos en "Project Options" lo que ponía en "_TCHAR maps to", creo que era eso.
Por el resto nada, abrí el programa compile y todo perfecto salvo al llegar a esa parte.
Es más, he probado a quitarlo y poner BMP y todo va bien, es solo cuando uso intento usar ese código para poner los JPG cuando hace cosas raras.
Voy a seguir mirando por si fuera otra cosa y no tiene nada que ver con esto, lo mismo te estoy haciendo mirarlo sin que tenga nada que ver.
Pero la verdad es que es muy raro.
Un abrazo.
Carlos _________________ Carlos J. Fernandez |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 16 Jul, 2013 7:31 pm Asunto: |
|
|
Leo,
Ahora lo que he probado es quitar todo lo que tuviera que ver con ese componente TDBCtrlGrid, en los eventos OnResize, también al hacer click, vamos que he quitado todo y seguía con el mismo problema.
He puesto un nuevo TDBCtrlGrid accediendo a la tabla y poniendo un TDBImage al que he asociado al campo de la imagen, no tiene eventos ni nada, el efecto que hace es que repite en todos los registros la imagen del registro actual, en vez de mostrar la imagen de cada registro.
Si cambias al registro 2 todas las imágenes de la rejilla aparecen como el de la 2 y así según te vas moviendo entre registros.
Un poco extraño la verdad, es que le he dado mil vueltas y tengo la sensación de que solo puede ser eso, si lo quito logicamente me da error al intentar poner un JPG, y si solo pongo BMP va perfecto
Ahora lo que voy a probar es a crear un Formulario nuevo, solo con un TDBCtrlGrid, un TDBImage y accediendo a la tabla a ver que pasa.
Te estoy volviendo loco seguro.
Un abrazo.
Carlos _________________ Carlos J. Fernandez |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 16 Jul, 2013 7:50 pm Asunto: |
|
|
Te lo preguntaba porque a mí no me compila directamente en algunas versiones nuevas sin hacer cambios.
En vez de crear nuevo el proyecto de prueba, lo he actualizado abriendo uno creado con el BCB6, y después de hacer algunos cambios para que compilase funciona sin problemas, por lo menos en la prueba rápida que he hecho, al moverme por los registros que estaban creados, borrando algunos y creando nuevos, modificando las imágenes de los que estaban creados, etc.
Lo he probado usando ADO+MSAccess (aunque este detalle no debería ser importante) y normalmente uso esta combinación para las pruebas porque es más rápido de crear y a la vez es más sencillo cuando tengo que pasarle un ejemplo a alguien. Aunque cuando tengo tiempo generalmente hago las pruebas con más de un motor de base de datos por si acaso.
Un detalle importante, a mí al menos al actualizar el proyecto no ha actualizado bien las propiedades "DataField" y "DataSource" de alguno de los TDBImage, revísalo por si acaso. Y en caso de que despues de probar este código te siga haciendo lo mismo, si quieres puedes pasarme un pequeño ejemplo con el que se reproduzca el problema y la base de datos de pruebas para poder revisarlo..
El código completo ha quedado así, las pruebas las he hecho en la versión 2010 y la XE4 (la XE3 la desinstale ya que apenas hay diferencias más allá de correcciones de errores básicamente):
- Cabeceras: #include<memory> #include<jpeg.hpp>
| Código: | /////CARGA IMAGEN DE LA BASE DE DATOS////////////////////////////////////////
void __fastcall TDBImage::LoadPicture(void)
{
if (!FPictureLoaded && (!FDataLink->Field
|| (FDataLink->Field->DataType == ftGraphic)
|| (FDataLink->Field->DataType == ftBlob) ))
{
std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
->CreateBlobStream(FDataLink->Field, bmRead));
WORD tipo;
stream->Read(&tipo, sizeof(tipo));
stream->Position = 0;
if (tipo == 0xD8FF)
{
std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
jpeg->LoadFromStream(stream.get());
Picture->Assign(jpeg.get());
}
else
{
stream.reset();
Picture->Assign(FDataLink->Field);
}
}
}
/////GUARDA LA IMAGEN EN LA BASE DE DATOS////////////////////////////////////
void __fastcall TDBImage::UpdateData(TObject* Sender)
{
if (dynamic_cast<Graphics::TBitmap*>(Picture->Graphic))
{
FDataLink->Field->Assign(Picture->Graphic);
std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
->CreateBlobStream(FDataLink->Field, bmWrite));
std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
jpeg->CompressionQuality = 90;
jpeg->Assign(Picture->Graphic);
jpeg->SaveToStream(stream.get());
}
else if (dynamic_cast<TJPEGImage*>(Picture->Graphic))
{
std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
->CreateBlobStream(FDataLink->Field, bmWrite));
TJPEGImage* jpeg = static_cast<TJPEGImage*>(Picture->Graphic);
jpeg->SaveToStream(stream.get());
}
else
FDataLink->Field->Clear();
} |
| Código: | // Esta función solo es necesaria si usamos TDBCtrlGrid
void __fastcall TDBImage::Paint()
{
TRect R;
Canvas->Brush->Style = bsSolid;
Canvas->Brush->Color = Color;
if (FPictureLoaded || ControlState.Contains(csPaintCopy))
{
TPicture* DrawPict = new TPicture;
HPALETTE Pal = 0;
try
{
if (ControlState.Contains(csPaintCopy) && FDataLink->Field
&& ((FDataLink->Field->DataType == ftGraphic)
|| (FDataLink->Field->DataType == ftBlob)))
{
//////////////////////////////////
std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
->CreateBlobStream(FDataLink->Field, bmRead));
WORD tipo;
stream->Read(&tipo, sizeof(tipo));
stream->Position = 0;
if (tipo == 0xD8FF)
{
std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
jpeg->LoadFromStream(stream.get());
DrawPict->Assign(jpeg.get());
}
else
{
stream.reset();
DrawPict->Assign(FDataLink->Field);
if (DrawPict->Graphic->ClassNameIs("TBitmap"))
DrawPict->Bitmap->IgnorePalette = QuickDraw;
}
//////////////////////////////////
}
else
{
DrawPict->Assign(Picture);
if (Focused() && DrawPict->Graphic && DrawPict->Graphic->Palette)
{
Pal = SelectPalette(Canvas->Handle, DrawPict->Graphic->Palette, false);
RealizePalette(Canvas->Handle);
}
}
if (Stretch)
{
if (!DrawPict->Graphic || DrawPict->Graphic->Empty)
Canvas->FillRect(ClientRect);
else
Canvas->StretchDraw(ClientRect, DrawPict->Graphic);
}
else
{
SetRect(&R, 0, 0, DrawPict->Width, DrawPict->Height);
if (Center)
{
OffsetRect(&R, (ClientWidth - DrawPict->Width) / 2,
(ClientHeight - DrawPict->Height) / 2);
}
Canvas->StretchDraw(R, DrawPict->Graphic);
ExcludeClipRect(Canvas->Handle, R.Left, R.Top, R.Right, R.Bottom);
Canvas->FillRect(ClientRect);
SelectClipRgn(Canvas->Handle, 0);
}
}
__finally
{
if (Pal)
SelectPalette(Canvas->Handle, Pal, true);
delete DrawPict;
}
}
else
{
Canvas->Font = Font;
String S;
if (FDataLink->Field)
S = FDataLink->Field->DisplayLabel;
else
S = Name;
S = "(" + S + ")";
TSize Size = Canvas->TextExtent(S);
R = ClientRect;
Canvas->TextRect(R, (R.Right - Size.cx) / 2, (R.Bottom - Size.cy) / 2, S);
}
TCustomForm* Form = GetParentForm(this);
if (Form && (Form->ActiveControl == this)
&& !ComponentState.Contains(csDesigning)
&& !ControlState.Contains(csPaintCopy))
{
Canvas->Brush->Color = clWindowFrame;
Canvas->FrameRect(ClientRect);
}
} |
Como este mensaje viene a sustituir al primero de este hilo, recordar que:
Solo tenemos que añadir las funciones tal y como estan, sin modificar nada, en cualquier parte de nuestro programa:
(No tenemos que llamar a estas funciones desde nuestro programa en ningún momento, solo copiarlas y seguir trabajando de manera normal con el TDBImage)
* Evidentemente en tiempo de _diseño_ el TDBImage no podrá leer un JPEG, por lo que si activamos la tabla en tiempo de diseño recibiremos el mensaje “Bitmap image is not valid.”, pero en tiempo de ejecución funcionara correctamente. Así que cada vez que veamos este aviso mi consejo es que lo cerréis usando la tecla 'Escape' en lugar del ratón para evitar problemas con la captura del mismo.
¡ATENCION!: Esto solo funciona si tenemos enlazados estáticamente los packages con el ejecutable. O sea:
Ir al menú: Project -> Options... Dentro de ese dialogo ir a la pestaña: "Packages". Y dentro de esa pestaña desmarcar el Checkbox: "Build with runtime packages". |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 16 Jul, 2013 8:10 pm Asunto: |
|
|
Leo,
Funcionaaaaaaaaaaaaaaaa aunque no se por que jajaja
He realizado lo siguiente.
.- He creado una nueva aplicación.
.- Le he añadido el código de las tres funciones.
.- He añadido los formulario que tenia en la app vieja.
Y funciona todo correctamente con los formularios antiguos pero con una aplicación nueva.
Después me he puesto a comparar las funciones linea por linea que tenia con las que tengo ahora por si algo a cambiado y son iguales, pero si he cambiado la posición en el código, ahora están abajo del todo y antes por en medio.
Bueno aunque no se la razón todo ya va perfecto, aunque la conclusión que saco es que el programa estaba raro, en cuando hago una app nueva y añado todo ha cambiado en general, no solo eso sino que va mejor que antes, vamos que no se si tiene algo que ver, pero parece ser que eso ayuda a que se ajuste mejor al cambio de Builder.
Muchas gracias Leo, el mejor como siempre.
Un abrazo.
Carlos _________________ Carlos J. Fernandez |
|
| Volver arriba |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Jue 20 Sep, 2018 11:14 pm Asunto: |
|
|
| todo lo de Leo me compila correcto en RAD Studio 10.2.2 pero e incluso cuando con el OpenPictureDialog cargo la imagen en el DBImage la carga y la visualiza pero como se hace para que la guarde en el BLOB de la base de datos??? tengo puesto el FIELD y el datasource y todo correcto pero el BLOB parece estar en blanco...... no recuerdo como era para grabar el Picture del DBImage a la Base de datos (es MySQL 5) |
|
| 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.
|