Ir al contenido


Foto

Como mostrar BLOB Text en un TMemo?


  • Por favor identifícate para responder
7 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 24 mayo 2014 - 02:19


En una BD SQLIte tengo declarado un campo llamado:

NOTAS de tipo BLOB_TEXT.


Cuando trato de recuperar el contenido de ese campo y mostrarlo en un Memo uso esta sentencia:



delphi
  1. memNotas.Lines.Text := dmCnx.uqyBuscarPlacasNotas.Value;



y obtengo esto al intentar compilar:



delphi
  1. [DCC Error] ufrmCamion.pas(436): E2010 Incompatible types: 'string' and 'System.TArray<System.Byte>'



¿Que estoy haciendo mal?  :huh:
  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 24 mayo 2014 - 04:41

Creo que la asignación que haces es el problema. No es posible asignar un BLOB de esa manera. Bueno al menos nunca lo hice.
Por lo pronto lo único que pude encontrar como ejemplo es de BLOBs con el uso de gráficos que por un tiempo me dejó algo perdido y tuve que recurrir a ayuda.
Esta fue la solución, supongo que análogamente se debe hacer con texto. Es decir usando streams.

Esto uso para leer el dato y mostrarlo en un control visual:

Este es el procedimiento que captura el evento OnDataChange de un TDataSource. Está recortado en su parte importante.



delphi
  1. procedure TfrmSABMArtic.dsArticDataChange(Sender: TObject; Field: TField);
  2. var
  3.   JpegImage: TJPEGImage;
  4.   BlobStream: TStream;
  5. begin
  6.   if (not dsArtic.DataSet.FieldByName('IMAGEN').IsNull) then
  7.     begin
  8.       BlobStream:= dsArtic.DataSet.CreateBlobStream(dsArtic.DataSet.FieldByName('Imagen'),bmRead);
  9.       JpegImage:= TJPEGImage.Create;
  10.       try
  11.         JpegImage.LoadFromStream(BlobStream);
  12.         imgImagenArtic.Picture.Assign(JpegImage);
  13.         imgImagenArtic.Visible := True;
  14.       finally
  15.         JpegImage.Free;
  16.         BlobStream.Free;
  17.       end;
  18.     end;
  19. end;



Esto uso al momento de asignar el dato:


delphi
  1.   TGraphicField(dsArtic.DataSet.FieldByName('Imagen')).LoadFromFile(odImgArt.FileName);



Espero te sirva para empezar
  • 0

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 24 mayo 2014 - 04:55

Me faltó aclarar que:
1. Existe un post de codicus sobre este tema, pero no se como ponerlo ni citarlo aquí.
2. L abase de datos no es SQLite (pero en esto creo que no tiene diferencia)
3. odImgArt es un TOpenDialog
4. dsArtic es un TDataSet

Deberías buscar en el foro por TStream quizá obtengas más info.

  • 0

#4 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 24 mayo 2014 - 07:26

Hola, creo que no debe ser tan complicado.  lo que tu planteas con el stream funciona bien y lo he utilizado con éxito, sin embargo se pude hacer directamente de la siguiente manera.


 

delphi
  1. Memo1.Lines.Text := Query1.FieldByName('campomemo').AsString;



o

 

delphi
  1. Memo1.Lines.Text := TMemoField(Query1.FieldByName('campomemo')).AsString;



Saludos.
  • 0

#5 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 24 mayo 2014 - 10:17

Creo que la asignación que haces es el problema. No es posible asignar un BLOB de esa manera. Bueno al menos nunca lo hice.
Por lo pronto lo único que pude encontrar como ejemplo es de BLOBs con el uso de gráficos que por un tiempo me dejó algo perdido y tuve que recurrir a ayuda.
Esta fue la solución, supongo que análogamente se debe hacer con texto. Es decir usando streams.

Esto uso para leer el dato y mostrarlo en un control visual:


Ya habia visto este codigo, no lo habia probado pero esta en la biblioteca (¡al fin se me ocurrio hacer una! ) :)

Hola, creo que no debe ser tan complicado.  lo que tu planteas con el stream funciona bien y lo he utilizado con éxito, sin embargo se pude hacer directamente de la siguiente manera.


 

delphi
  1. Memo1.Lines.Text := Query1.FieldByName('campomemo').AsString;



o

 

delphi
  1. Memo1.Lines.Text := TMemoField(Query1.FieldByName('campomemo')).AsString;



Saludos.


Funciono la primera sentencia, aun no pruebo la segunda. Como curiosidad cambie el "asString" por un "Value" y el resultado fue:

慆瑣牵⁡㌲㔴倠潲畤瑣畨敭潤



p.d. Repito como doy por resuelto el tema?
  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 25 mayo 2014 - 07:49

Hay que tener cuidado con el uso del Value, ya que dejas que el compilador decida el tipo de dato y eso no siempre funciona.

los caracteres raros se dan, porque el compilador no sabe si debe convertir el array de bytes a un AnsiString o a un WideString,  así que termina interpretando mal el array.

En este link te podrás dar cuenta de la diferencia de los tipos de datos de string.

http://hyperbasesuit...sistring-y.html

Saludos.


  • 0

#7 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 26 mayo 2014 - 08:55

Interesante articulo, sumamente claro y bien explicado.
  • 0

#8 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 26 mayo 2014 - 09:46

Realmente buen artículo.
Yo creo que me desvié demasiado de tema, por tomar otro camino.
Saludos y
Gracias  (y)

  • 0




IP.Board spam blocked by CleanTalk.