Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Error al asignar un TQRImage (https://www.clubdelphi.com/foros/showthread.php?t=98097)

Angel.Matilla 26-10-2026 18:54:57

Error al asignar un TQRImage
 
Buenas tardes. Estoy usando BCB6 y QR 3.0.9. Tengo este query:
Código SQL [-]
SELECT TRIM(A.Titulo)||' ('||CAST(A.Anyo AS VARCHAR(5))||')' Titulo, A.Interpretes, A.Autor, A.Duracion, A.Idiomas, A.Subtitulos, B.Caratula
   FROM Titulos A 
   LEFT JOIN Imagen B ON A.Tipo = B.Tipo AND A.Registro = B.Registro AND B.Posicion = 'P' WHERE A.Tipo = 1 AND A.Disco = :Disco
   ORDER BY Orden
que devuelve, por ejemplo, esto:

y tengo este código para meter el resultado del query en el QR:
Cita:

TMemoryStream *msImagen = new TMemoryStream;
static_cast<TGraphicField *>(Query->FieldByName("Caratula"))->SaveToStream(msImagen);
if (msImagen->Size > 0)
{
tbmp->Assign(Query->FieldByName("Caratula"));
ImgInf->Picture->Assign(tbmp);
}
Como veis el query devuelve una imagen. Sin embargo, al leer el query, no sé si lo que viene es un BMP o un JPG, y no sé en cual de los dos casos me da este error:

¿Cómo puedo esquivarlo?

emailx45 26-10-2026 22:30:24

Cuando usas un TStream (y subclases) para este tipo de acción, normalmente, tendrás que iniciar los bits para determinar el tipo de archivo junto a todos los demás bytes.

Así mismo, necesitarás hacer el "avance" para el punto donde realmente vienen los bytes de la imagen.

Cuando un mapa de bits se convierte en una secuencia de funciones básicas de Delphi, los 2 primeros bytes identifican el tipo de imagen. En este caso, un mapa de bits es igual a: byte 1 (66=B), byte 2 (77=M).

A partir del tercer byte comienzan los datos de la imagen.


Código Delphi [-]
procedure TForm2.LerBlobParaMemoryStream( MemTable: TFDMemTable; const FieldName: string; DestStream: TMemoryStream );
var
  BlobStream: TStream;
begin
  if MemTable.FieldByName( FieldName ).IsNull then
    Exit;

  BlobStream := MemTable.CreateBlobStream( MemTable.FieldByName( FieldName ), bmRead );
  try
    DestStream.Clear;
    DestStream.CopyFrom( BlobStream, BlobStream.Size );
    DestStream.Position := 0; // Retorna o ponteiro para o inicio do stream
  finally
    BlobStream.Free;
  end;
end;

Código Delphi [-]
procedure TForm2.Button1Click( Sender: TObject );
var
  LStream: TMemoryStream;
  LBytes : TBytes;
  LText  : string;
begin
  LStream := TMemoryStream.Create;
  try
    LerBlobParaMemoryStream( FDMemTable1, 'bitmapi', LStream );
    //
    if LStream.Size = 0 then
      Exit;

    LStream.Position := 0;
    //
    SetLength( LBytes, 3 );
    if LStream.Read( LBytes, 3 ) = 0 then
      Exit;
    //
    for var B in LBytes do
      LText := LText + '[' + B.ToString + ']=' + ifthen( B = 0, '0', Chr( B ) ) + ',';
    //
    Memo1.Lines.Add( 'Bytes= ' + LText );
  finally
    LStream.Free;
  end;
end;



La franja horaria es GMT +2. Ahora son las 22:43:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi