PDA

Ver la Versión Completa : Grabar un TImage en FB 2.5


Angel.Matilla
12-02-2022, 12:02:25
Buenos días. He estado mirando aquí y en otros foros cómo grabar el contenido de un TImage en una BB.DD. Firebird 2.5. La tabla está definida así:
CREATE TABLE IMAGEN (
TIPO SMALLINT NOT NULL,
REGISTRO INTEGER NOT NULL,
POSICION VARCHAR(1) NOT NULL,
CARATULA BLOB SEGMENT SIZE 240);
El TImage lo cargo a partir de un fichero que selecciono con un TOpenPictureDialog y para grabar el contenido del TImage en la tabla uso esto:
TJPEGImage *ImgJpg = new TJPEGImage;
TMemoryStream *msImagen = new TMemoryStream;

msImagen->Clear();
ImgJpg->Assign(Caratula->Picture->Bitmap);
ImgJpg->SaveToStream(msImagen);
msImagen->Seek(0, soFromBeginning);

Query->Close();
Query->SQL->Text = "INSERT INTO Imagen (Tipo, Registro, Posicion, Caratula) VALUES (:Tipo, :Registro, 'P', :Caratula)";
Query->ParamByName("Caratula")->LoadFromStream(msImagen, ftBlob);
Query->ParamByName("Tipo")->AsInteger = TabControl1->TabIndex + 1;
Query->ParamByName("Registro")->AsInteger = nRegistro;
Query->ExecSQL();
Query->Transaction->Commit();
Cunado selecciono el fichero se muestra en el formulario pero he comprobado que luego no graba nada en la tabla. ¿Algún consejo? Porque me he vuelto loco buscando ejemplos, pero ninguno me ha funcionado.

Casimiro Notevi
12-02-2022, 18:23:32
¿Y algo así?
TBlobField(DataSet.FieldByName('caratula')).LoadFromFile(dlgAbrirFichero.FileName);

Angel.Matilla
14-02-2022, 09:38:59
Sí, esa alternativa la había evaluado pero lo que me mosquea es que exactamente el mismo código en otra aplicación funciona perfectamente.

Casimiro Notevi
14-02-2022, 09:53:08
... el mismo código en otra aplicación funciona perfectamente. Entonces habrá alguna diferencia, revísalo con lupa.

Angel.Matilla
14-02-2022, 09:58:50
Eso hago. Me estoy volviendo loco. Gracias.

Angel.Matilla
14-02-2022, 12:13:05
Pues no sé que habré hecho pero ahora funciona bien con este código:
Query->Close();
Query->SQL->Text = "INSERT INTO Imagen (Tipo, Registro, Posicion, Caratula) VALUES (:Tipo, :Registro, :Posicion, :Caratula)";
Query->ParamByName("Tipo")->AsString = TabControl1->TabIndex + 1;
Query->ParamByName("Registro")->AsInteger = nRegistro;
Query->ParamByName("Posicion")->AsString = Imagen->Name == "Caratula" ? "P" : "T";
if (Imagen->Picture != NULL)
{
Imagen->Picture->SaveToFile(AnsiString(getenv("TEMP")) + "\\Temp.jpg");
Query->ParamByName("Caratula")->LoadFromStream(::ImagenToStreamJPG(AnsiString(getenv("TEMP")) + "\\Temp.jpg"), ftBlob);
}
Query->ExecSQL();
Realmente es una mezcla del que puse yo y la sugerencia de Casimiro.

Casimiro Notevi
14-02-2022, 12:19:19
^\||/^\||/^\||/