Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Duda con QuickRep en c++ builder 6 (https://www.clubdelphi.com/foros/showthread.php?t=78271)

LuisMiguel 03-04-2012 22:08:37

Duda con QuickRep en c++ builder 6
 
Saludos a todos

Necesito mostrar en un QRDBImage1 que se encuentra dentro de un QuickRep las imágenes que tengo almacenada en mi BD, asocié el QRDBImage1 a mi ADOQuery en el Dataset y en el campo DataField seleccioné el campo que tiene la dirección de la imagen.
No se si el problema de lo que estoy haciendo es que solo en el campo imagen de la BD tengo almacenado la dirección donde tengo guardada la imagen y el QRDBImage1 no me reconoce esto, esta es la forma como almaceno la dirección de la imagen en el campo imagen: Imagen/prueba.jpg

Gracias por la ayuda que pudieran brindarme.

ecfisa 04-04-2012 01:20:22

Hola LuisMiguel.

Supongo que obtenes el mensaje: Bitmap Image is not valid. Este tema se trató con referencia a Delphi [ aquí ], quizá puedas sacar alguna idea.

En tu lugar pondría un TQRSubDetail con su propiedad DataSet apuntando al DataSet en questión, dentro de él un TQRImage en lugar del TQRDBImage y luego en el evento AfterScroll del TDataSet:
Código:

void __fastcall TForm1::DataSetAfterScroll(TDataSet *DataSet)
{
 QRImage1->Picture = NULL;
  if (FileExists(DataSetRUTA->AsString))
    QRImage1->Picture->LoadFromFile(DataSetRUTA->AsString);
}

Donde DataSetRUTA es el nombre del campo persistente que almacena la ruta y nombre de imágen.

Saludos.

LuisMiguel 04-04-2012 02:58:10

Gracias ecfisa

La idea que usted me da esta buena, solo un pequeño detalle y es que no encuentro ese evento AfterScroll del TDataSet,cuando lo ejecuto me da el siguiente error.

[C++ Error] Unit1.cpp(18): E2316 '_fastcall TForm1:: DataSetAfterScroll(TDataSet *)' is not a member of 'TForm1'

ecfisa 04-04-2012 05:43:46

Hola Luis Miguel.

'DataSet' es un nombre que usé por convención, ya que TDataSet es la clase base de todos los componentes que pueden representar datos de una tabla.

Tenes que usar el evento AfterScroll del DataSet que referencia la tabla donde está el campo con la ruta+nombre_imágen. Por tu primer mensaje creo entender que es un ADOQuery. (desconozco el nombre que le hayas dado)

Saludos. :)

LuisMiguel 05-04-2012 18:01:20

Saludos ecfisa
Su ejemplo me funciono a la perfeccion, solo tengo un pequeño problemita y es que de la forma que lo hice me muestra la misma imagen para todos los datos que muestro en el QuickRep.
Me explico mejor:
Esta es la forma como obtengo las datos de mi tabla

Código:

ADOQueryCalculos->SQL->Clear();
          ADOQueryCalculos->SQL->Add("SELECT * from Resultado");
          ADOQueryCalculos->Open();
          String  DataSetRUTA=ADOQueryCalculos->FieldByName("Imagen")->AsString;

Si pusiera en el DataSetAfterScroll el código para mostrar la imagen no me reconocería el DataSetRUTA,por eso lo puse seguidamente del codigo anterior:
Código:

QRImage1->Picture = NULL;
          if (FileExists(DataSetRUTA->AsString))
          QRImage1->Picture->LoadFromFile(DataSetRUTA->AsString);

Como ve de esta forma en DataSetRUTA solo se almacenaria el primer valor de la Imagen y me mostraría los restantes datos con esa misma imagen.
Finalmente lo que quisiera lograr es mostrar en el QuickRep las imagenes de esta forma:
Nombre PA SA Imagen // campos mostrados en el QuickRep
DA MA NA Imagen1
--- --- -- Imagen2
--- --- -- Imagen3
Saludos y muchas gracias por la ayuda.

ecfisa 05-04-2012 19:48:28

Hola.

Creo que no me he explicado con claridad, voy a intentarlo paso a paso.
  • Crea un campo persistente en el TADOQuery que por defecto se llamará el nombre de tu quey ADOQueryCalculos + el nombre de campo que tenga tu tabla; suponiendo que el nombre de campo sea RUTA el nombre sería: ADOQueryCalculosRUTA.
  • En el TQuickRep poné un componente TQRSubDetail, no un TQRBand con su propiedad BandType = rbSubDetail ya que no es lo mismo. En la propiedad DataSet del TQRSubDetail poné ADOQueryCalculos y agregá un TQRImage dentro de esta banda.
  • Luego en el evento AfterScroll (ADOQueryCalculosAfterScroll) agregá:
    Código:

    void __fastcall TForm1::ADOQueryCalculosAfterScroll(TDataSet *DataSet) {
      QRImage1->Picture->LoadFromFile(ADOQueryCalculosRUTA->Value);
    }

  • Por último y para probarlo agrega un TButton y este código para el evento OnClick:
    Código:

    void __fastcall TForm1::Button1Click(TObject *Sender) {
      QuickRep1->Preview();
    }


De ese modo tiene que funcionarte sin problemas.

Saludos. :)

dmartinezn 05-04-2012 21:42:06

Podria explicar como crear un campo persistente en el TADOQuery, eso es una duda que tambien me ha surgido y que no habia visto!
Saludos.

ecfisa 05-04-2012 23:51:15

Cita:

Empezado por dmartinezn (Mensaje 429414)
Podria explicar como crear un campo persistente en el TADOQuery, eso es una duda que tambien me ha surgido y que no habia visto!
Saludos.

Si como no. De modo visual es muy sencillo, doble click sobre el componente TADOQuery -> se abre el editor de campos -> click botón derecho sobre el editor de campos -> Aparecerán estas opciones:
  • Add fields : Abre una ventana para seleccionar los campos disponibles para agregar.
  • New field: Se utiliza para crear un nuevo campo, como por ejemplo un campo calculado.
  • Add all fields: Agrega todos los campos disponibles.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 12:27:20.

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