PDA

Ver la Versión Completa : Cargar Imagenes En Una Tabla De Interbase


Ericklsca
26-06-2006, 10:05:24
Bueno tengo el siguiente problema, estoy desarrollando una aplicación en Delphi 6 para una tienda de discos en la cual ademas de capturar los datos del disco en el modulo de compras tambien se pueda cargar una imagen(caratula) del cd comprado para posteriormente visualizarla en el catalogo de cd. Bueno el problema es que mi codigo para cargar la imagen me manda un error cuando quiere cargar la imagen los componentes que utilizo son: IBDatabase, IBTransaction, IBDataSet Y DataSource enlazo todo como de costumbre y el codigo en el boton de cargar la imagen es el siguiente:

procedure TForm1.Button1Click(Sender: TObject);
var
m, f: TStream;
s: string;
begin
if OpenPictureDialog1.Execute then
begin
IBDataSet1.Edit; //tendria que dar error sin esto
m:= IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('FOTO'), bmWrite);
f:= TFileStream.Create(OpenPictureDialog1.filename, fmOpenRead);
m.CopyFrom(f, f.Size);
s:= AnsiUpperCase(ExtractFileExt(OpenPictureDialog1.FileName)); //Siempre en mayusculas
if s='.JPEG' then s:= '.JPG'; //un caso especial
IBDataSet1.FieldByName('FORMATO_FOTO').AsString:= Copy(s,2,3); //elimino el punto
IBDataSet1.Post;
f.Free;
m.Free;
end
end;

Despues el codigo que puse en el evento OnDataChange del componente DataSource es este:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
m, f: TStream;
begin
if IBDataSet1.FieldByName('FOTO').IsNull then
Image1.Picture:= nil
else
begin
if IBDataSet1.FieldByName('FORMATO_FOTO').AsString = 'BMP' then
Image1.Picture.Graphic:= TBitmap.Create
else
Exit;
m:= IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('FOTO'), bmRead);
Image1.Picture.Graphic.LoadFromStream(m);
m.Free;
end;
end;

La primera vez que ejecute la aplicacion al darle click al boton de cargar y escoger la imagen me mando el siguiente error:

Project Project1.exe raised exception class EDatabaseError with message 'IBDataSet1: Cannot modify a read-only dataset'. Process stopped. Use Step or Run to continue

Entonces en la propiedad Active del componente IBDataSet la cambie a false y despues ejecute nuevamente el programa y nuevamente al momento de querer cargar la imagen me mando el siguiente error:

Project Project1.exe raised exception class EDatabaseError with message 'IBDataSet1: Cannot perform this operation on a closed dataset'.Process stopped. Use Step or Run to continue

Soy principiante en Delphi asi que la verdad no he podido encontrar el error quisiera que alguno de los compañeros foristas pueda ayudarme con mi problema o si alguien sabe alguna otra manera de cargar una imagen en una tabla de Interbase y luego visualizarla en un DBImage me seria de gran ayuda, espero que alguien me pueda ayudar con este problema.

fidel
26-06-2006, 21:14:53
Hola:

Yo cargo fotos de igual maneray me funciona bien.

El mensaje es que el DataSet esta en modo solo de lectura y por eso no te deja modificar, por lo que al desactivarlo al diseñar no vas a lograr nada, porque lo tendrás que activar en algún momento al ejecutar.

Prueba a ver esto:

Botón dcho en el DataSet .. opción DatasetEditor (la 2º) ... pestaña SQL... vas picancdo las 4 opciones que hay: Modify, Insert, Delete, Refresh y quitas el código que tienes en ellas (¿o no tienes nada y por eso no funciona?).

Cuando están limpas de código vuelves a la pestaña Options
Click en el botón Select Primary Keys, y es probable que el campo clave se quede seleccionado (en azul) si no lo seleccionas tú manualmente.

Una vez seleccionado el KeyField, click en el botón Generate SQL y guardar.

Con esto se habrán llenado de código los cuatro apartados de la pestaña SQL , y pruebas a ver si funciona.

Un saludo.