Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Marca de agua en una banda específica (https://www.clubdelphi.com/foros/showthread.php?t=64978)

cestradar 12-11-2009 19:12:08

Marca de agua en una banda específica
 
Hola, gracias anticipadas por cualquier ayuda

Estoy intentando colocar una marca de agua en un QRBand ligado a un QRGroup. El problema lo tengo en que no hay un evento definido en las bandas que se ejecute por cada ves que se genera, o por lo menos no se actualiza la propiedad .TOP y la marca de agua se imprime en el mismo sitio quedando solo una.

Quiero que dependiendo de un estatus de ese grupo se coloque una marca de agua, ahora solo cambio el color para diferenciarla del resto, pero me han solicitado que vea la posibilidad de hacer esto que intento, pero me he topado con ese detalle ¿cómo puedo variar el parámetro DestY en la función StretchDIBits y cómo automatizar la llamada de tal forma que puedan imprimirse tantas imágenes como se ocupen en su posición correcta?

El código de la marca de agua es como todos los que circulan por este y otros foros:

Código:

TRY

    bmp := TBitMap.Create;
    bmp.LoadFromFile(ExtractFilePath(Application.ExeName)+'no_autorizado.bmp');

    with QuickRep1.QRPrinter do
    begin
      Y := YPos(PaperLengthValue) div 6;
      X := XPos(PaperWidthValue) div 4;
      R := Rect(X, Y, X*3, Trunc(Y*1.5));
      Cnv:=Canvas;
    end;

    with bmp do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      GetMem(Info, InfoSize);
      try
        Getmem(Image, ImageSize);
        try
            GetDIB(Handle, Palette, Info^,Image^);
            with Info^.bmiHeader do Begin
              StretchDIBits(Cnv.Handle, R.Left, R.Top,
                            R.Right - R.Left, R.Bottom - R.Top,
                            0, 0, biWidth, biHeight, Image,
                            Info^, DIB_RGB_COLORS, SRCAND );
            End;
        finally
            FreeMem(Image, ImageSize);
        end;
      finally
        FreeMem(Info, InfoSize);
      end;
    end;

  FINALLY
    bmp.free
  END;

Gracias!

PD. No se si esta pregunta ya este antes, he querido revisar las respuestas anteriores pero por alguna razón solo veo los temas nuevos, no he encontrado alguna nueva preferencia en mi panel de control para modificar esto.

rgstuamigo 13-11-2009 00:03:32

Bueno supongo que estas trabajando con QuickReport, si es asi pues te cuento que apartir de la version 4 hacia adelante se puede poner una imagen de fondo, eso significa que tu imagen debe de estar ya bien configurada en tono,brillo,transparencia,etc para lo cual puedes editarla con cualquier programa tal como PothoShop,etc. En otras palabras tu imagen ya debe estar preparada es un archivo image(*.BMP,jpg) aunque no lo he probado con imagenes Jpg.;)
Bueno teniendo ya tu imagen lista en un archivo lo que se hace es lo siguiente:
Cita:

* Se baja un componente QRImage encima de tu componente QuickReport.
OJO cuando se baje el QRImage hay que tener cuidado de no ponerlo encima de ninguna banda, es decir ponerlo, por decir asi, en una esquinita del QuickReport por fuera de las lineas de impresion.;)
*Escribir en la propiedad BackImageControl del QuickReport el nombre del componente QrImage que acabamos de Bajar.
*Cargar la imagen a nuestro componente QrImage, esto se hace con la propiedad Picture.
*Acomodar o centrar el tamaño de nuestro Componente QrImage acorde a nuestras necesidades, ojo a veces quisas el QrImage no se va ver por que esta detras de todas las bandas en ese caso podemos seleccionarla y darle click derecho>Control>BringToFront (esto para que se venga hacia adelante)
*Finalmente poner la propiedad TransparentBand y Transparent de las bandas y los QrLabel,etc respectivamente en true.
Ojo: Lo anterior se deja al criterio de cada uno.;)
Eso es todo , quisas podemos visualizar el reporte dandole click derecho al QuickRepot>Preview para tener una primera impresion visual.;)
Saludos...:)

cestradar 13-11-2009 00:38:01

Hola rgstuamigo, gracias por contestar.

Efectivamente trabajo con QR (de ahí el nombre de los objetos) pero lo hago con el que viene en Delphi 7, es decir la versión 3.0.9; nunca he intentado usar otra versión por que entiendo que ya sería de pago.

Las intrucciones que colocas deduzco son para colocar una marca de agua al reporte, y ese no es el problema, el problema es que yo quiero la marca de agua en una banda específica.

Imagina un reporte quickreport con una banda de agrupación y un detailBand ligado a esta y un footerBand ligado al detail (o a la agrupadora, da lo mismo), al general el reporte se generan N hojas con M números de grupos, bueno, quiero que cuando un grupo tenga cierto estatus, en la banda correspondiente a ese grupo se coloque una marca de agua.

De momento solo coloreo la bada agrupadora dependiendo del estatus para diferenciarlo, pero como ya mencioné estoy analizando la posibilidad de todo el grupo presentarlo con una marca de agua.

Puedo colocar tantas marcas de agua como llamadas haga al StretchDIBits del código que puse, y en la posición que manualmente coloque en sus parámetros. Aquí era la pregunta, ¿cómo saber las coordenadas en la página de cierta banda?, con eso podría automatizar ese dato, pero no hay evento que se ejecute por cada grupo generado. Quizá con un sumaryBand pero igual no tengo la posición de la banda agrupadora.

Quizá simplemente no se puede :(

rgstuamigo 13-11-2009 14:10:51

Lamentablemente los pasos que te he dicho es solo,como bien dije para versiones de Quick report desde la 4 hacia adelante(segun tengo entendido);), si tuvieras estas versiones te ubiera dicho que intentes seguir los pasos que te habia puesto anteriromente con la diferencia que solo hagas transparente la banda en la que quieres que se visualize la imagen,desde luego deberias redimensionar el tamaño del QrImage al tamaño especifico de la banda y ubicarlo exactamente atras.:)
Pero como bien digo esto es solo para versiones a partir de la 4 hacia adelente; personalmete trabajo con la version 5.02 de Quick Report.;)
Saludos...:)

cestradar 13-11-2009 18:48:35

Supongo que eso solo haría que se viera en todos los agrupamientos, como si fuera una marca de agua de reporte, y no es lo que necesito.

Es la misma banda, hacerla transparente no me serviría por que yo quiero que la marca de agua este en esa banda si y solo si un dato en específico vale algo. Por ello el interes de saber la posición en la hoja de la banda en el momento de esa condición.

Igual, supongo no se puede.

rgstuamigo 13-11-2009 18:56:34

Cita:

Empezado por cestradar (Mensaje 346558)
Supongo que eso solo haría que se viera en todos los agrupamientos, como si fuera una marca de agua de reporte, y no es lo que necesito.

Es la misma banda, hacerla transparente no me serviría por que yo quiero que la marca de agua este en esa banda si y solo si un dato en específico vale algo. Por ello el interes de saber la posición en la hoja de la banda en el momento de esa condición.

Igual, supongo no se puede.

Bueno en tal :rolleyes: caso quisas podrias usar el evento BeforePrint(antes de imprimir) de tu banda en cuestion, para poder poner la propiedad enable del qrImage en true o false segun la condicion que desees..heee:rolleyes:, no lo sé, abria que probarlo.;)
Saludos..:)

rgstuamigo 13-11-2009 19:09:03

Otra opcion que veo(Bueno hay que probarlo) es que el QRImage lo pongas en la banda que deses que solo se imprima y utilizar el evento BeforePrint de la banda ,como te he comentado en el anterior post.;)

cestradar 13-11-2009 19:09:30

El beforePrint, como dice su nombre, se ejecuta antes de ser impreso o previsualizado y actua sobre todas la bandas que se hayan ocupado, ahí no vale ninguna condición por que pondria transparente todas las bandas del mismo tipo, yo ocuparía algo como el OnNeedData.

Igual, solo era por estética, el colorear la banda agrupadora cumple el objetivo.

Saludos

rgstuamigo 13-11-2009 19:14:14

Cita:

Empezado por cestradar (Mensaje 346564)
El beforePrint, como dice su nombre, se ejecuta antes de ser impreso o previsualizado y actua sobre todas la bandas que se hayan ocupado, ahí no vale ninguna condición por que pondria transparente todas las bandas del mismo tipo, yo ocuparía algo como el OnNeedData.

Igual, solo era por estética, el colorear la banda agrupadora cumple el objetivo.

Saludos

No confundas las cosas; el evento OnNeedData es solo del componente QuickRep desde luego tambien tiene su respectivo evento BeforePrint, alo que me estaba refiriendo es al evento BeforePrint pero de la banda en cuestion.;)

cestradar 13-11-2009 19:40:07

No estoy confundiendo las cosas, te he entendido en cada uno de tus post, el que quizá no esta entiendo lo que necesito, y por qué lo que me dices no me sirve eres vos. No sirve modificar las propiedades de una banda dentro de esos eventos por que afectaría a todas las bandas del reporte, no haría caso del contenido específico de dichas bandas. Lo que te mencioné del OnNeedData era que que vieras que necesito algo que se ejecute cuando se obtengan datos pero a nivel de banda, no de DataSet obviamente.

Nada que ver con lo que me estas diciendo

Igual, todo lo que haz mencionado es en un hipotético caso que ya aclaramos no se cumple, no uso esa versión de QR, y no ocupo poner una marca a nivel de reporte.

Gracias de todas formas

rgstuamigo 13-11-2009 19:47:25

Cita:

Empezado por cestradar (Mensaje 346568)
No estoy confundiendo las cosas, te he entendido en cada uno de tus post, el que quizá no esta entiendo lo que necesito, y por qué lo que me dices no me sirve eres vos. No sirve modificar las propiedades de una banda dentro de esos eventos por que afectaría a todas las bandas del reporte, no haría caso del contenido específico de dichas bandas. Lo que te mencioné del OnNeedData era que que vieras que necesito algo que se ejecute cuando se obtengan datos pero a nivel de banda, no de DataSet obviamente.

Nada que ver con lo que me estas diciendo

Gracias de todas formas

Creo que por ayudar mas bien voy a salir reteado.:o
Haber....(voy tratar de hacerme entender mejor esta ves ;))dale click atu banda (selecionala para que se vean sus propiedades en el Object Inspector), ahora ve ala pestaña evento del Object Inspector y si te das cuenta cada banda tiene sus propios eventos,el que te estoy pidiendo que uses es el evento que ya anteriormente te mencioné es decir BeforePrint de tu banda; de ahi que te dije que te estabas confundiendo.:)
Espero que haya quedado claro.;)
Saludos...:)

cestradar 13-11-2009 20:16:19

Disculpa si te he ofendido, te juro que jamás pensaría ser malagradecido con quien intenta ayudarme, pero te repito: entiendo lo que dices, conozco Delphi, conozco QR y conozco que lo que necesito no se puede hacer como tu me dices.

En evento que tu dices, aunque sea el evento de la banda afecta a todas y cada una de las bandas DetailBand (o cualquier banda) que se hayan impreso, no sirve para lo que ocupo. Recuerda que yo ocupo que las bandas se comporten o tengan algo difernete (la marca de agua) solo en cierto caso.

Si haces una prueba, verás que en ese evento no puedes afectar a la banda poseedora del evento de manera discrecional, se afectan todas. No puedes decir en ese evento que la ponga transparente la banda o que haga x cosa dependiendo del valor por que lo haría solo una vez.

Mucho antes de rendirme y desidir buscar ayuda en un foro ya he intendado eso, preguntar en un foro es lo último que hago, tengo la costumbre de primero agotar alternativas por mis medios, no me gusta molestar a la gente con "preguntas bobas" (costumbre que me quedó de años atras en alguna lista de correo) que se han resulto decenas de veces en Internet, quizá por eso mi desesperación a tu apreciación de que no entiendo tan elementales conceptos que me haz cometado, jejeje.

Gracias por tu interes rgstuamigo, de verdad te lo aprecio mucho, pero lo que necesito no se puede hacer usando los eventos beforePrint o afterPrint de las bandas.

rgstuamigo 13-11-2009 20:57:31

1 Archivos Adjunto(s)
Cita:

Empezado por cestradar (Mensaje 346571)
Disculpa si te he ofendido, te juro que jamás pensaría ser malagradecido con quien intenta ayudarme, pero te repito: entiendo lo que dices, conozco Delphi, conozco QR y conozco que lo que necesito no se puede hacer como tu me dices.

En evento que tu dices, aunque sea el evento de la banda afecta a todas y cada una de las bandas DetailBand (o cualquier banda) que se hayan impreso, no sirve para lo que ocupo. Recuerda que yo ocupo que las bandas se comporten o tengan algo difernete (la marca de agua) solo en cierto caso.

Si haces una prueba, verás que en ese evento no puedes afectar a la banda poseedora del evento de manera discrecional, se afectan todas. No puedes decir en ese evento que la ponga transparente la banda o que haga x cosa dependiendo del valor por que lo haría solo una vez.

Mucho antes de rendirme y desidir buscar ayuda en un foro ya he intendado eso, preguntar en un foro es lo último que hago, tengo la costumbre de primero agotar alternativas por mis medios, no me gusta molestar a la gente con "preguntas bobas" (costumbre que me quedó de años atras en alguna lista de correo) que se han resulto decenas de veces en Internet, quizá por eso mi desesperación a tu apreciación de que no entiendo tan elementales conceptos que me haz cometado, jejeje.

Gracias por tu interes rgstuamigo, de verdad te lo aprecio mucho, pero lo que necesito no se puede hacer usando los eventos beforePrint o afterPrint de las bandas.

Claro que se puede hacer mi amigo, por lo cual te he adjuntado un archivo ejemplo para que lo mires.;):)
Ten en cuenta que el evento BeforePrint de cada banda se ejecuta tanta veces se tenga que imprimir la banda, es decir si por ejemplo tengo que imprimir el contenido de un Dataset que tiene 10 registros, entonces el evento BeforePrint se de la Banda que imprimira los 10 registros, se ejecutara 10 veces.;)
Si te sirvio no dejes de comentarnos.
saludos...:)

cestradar 17-11-2009 18:41:48

Hola rgstuamigo

Disculpa la tardanza en responder, ayer fue dia feriado en México y no probé tu ejemplo hasta hoy.

Como te he comentado ya bastantes veces, eso no es lo que estoy ocupando, ese ejemplo hace exactamente lo que te he dicho que no necesito, no ocupo poner o quitar una marca de agua en el reporte según una condición, para eso si que sirven el evento que usas, o incluso cualquier otro de cualquier otra banda. Eso de que se ejecuta el mismo número de veces que registros se tienen pues .... no viene al caso discutirlo, pero de que si afectas las propiedades de la banda se afectan las de todas las bandas generadas en el reporte, lo he comprobado, no se pueden definir condiciones particulares para cierto grupo en ese evento.

Veo que por más que lo digo de formas diferentes no me doy a entender contigo, así que te pondré una imagen. Yo necesito algo como esto:

http://img526.imageshack.us/img526/9605/image2or.jpg

En esa imagen puedes ver que tengo tres marcas de agua en la misma banda (un detailBand ligado a un GroupBand) pero dependiendo de cierta condición quisiera se imprimiera o no algo. Si coloco en código duro las coordenadas para cada marca de agua funciona, pero claro que esto no funciona en la realidad, supongo no se puede hacer con QR, quizá con Rave u otro reporteador, pero para efectos prácticos, con el color en la banda agrupadora tengo.

Espero ahora si visualices lo que en realidad he estado intentando decir

Saludos

URBANO 06-12-2009 14:34:37

Hola Cestradar,

No se realmente como se puede hacer lo que comentas, pero por lo que he leido tu si sabes lo que yo necesito y que no consigo hacer. Necesito poner un marca de agua en un informe (QR) en el centro de este. El informe es de una sola hoja.

He visto el codigo que utilizas, pero no lo entiendo, algo complejo para mi. Podrías explicarme algo ese codigo. De que metodo se llama, declaración de variables que utilizas, uses, etc...

Te agradecería mucho la ayuda. Gracias.

Saludos.

cestradar 07-12-2009 15:09:09

Hola URBANO, en realidad con el ejemplo de rgstuamigo tienes para hacer lo que ocupas, pero si deseas hacerlo con el código que coloqué es fácil, esta explicado en muchos post en este y otros foros por internet, basta con que coloques una función como esta:

Código Delphi [-]
 
procedure TFQRBorrador.ImprimeMarcaAgua(QuickRep1:TQuickRep; Sender: TQRCustomBand);
var
   bmp : TBitMap;
   R      : TRect;
   X, Y   : integer;
   Cnv    : TCanvas;
   Info : PBitMapInfo;
   InfoSize : DWORD;
   Image : Pointer;
   ImageSize : DWORD;
begin
  TRY
    bmp := TBitMap.Create;
    bmp.LoadFromFile(ExtractFilePath(Application.ExeName)+'no_autorizado.bmp');
    with QuickRep1.QRPrinter do
    begin
      Y := YPos(PaperLengthValue) div 6;
      X := XPos(PaperWidthValue) div 4;
      R := Rect(X, Y, X*3, Trunc(Y*1.5));
      Cnv:=Canvas;
    end;//with
    with bmp do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      GetMem(Info, InfoSize);
      try
         Getmem(Image, ImageSize);
         try
            GetDIB(Handle, Palette, Info^,Image^);
            with Info^.bmiHeader do Begin
               StretchDIBits(Cnv.Handle, R.Left, R.Top,
                             R.Right - R.Left, R.Bottom - R.Top,
                             0, 0, biWidth, biHeight, Image,
                             Info^, DIB_RGB_COLORS, SRCAND );
            End;
         finally
            FreeMem(Image, ImageSize);
         end;//try-finally
      finally
         FreeMem(Info, InfoSize);
      end;//try-finally
    end;//with
  FINALLY
    bmp.free
  END;//try-finally
end;

y la mandes llamar en el evento AfterPrint de alguna banda o del reporte, con algo como esto:

Código Delphi [-]
 
   If not QBorradorAutorizado.AsBoolean Then Begin
      ImprimeMarcaAgua(QRBorrador, Sender)
   End

Se puede hacer de otras formas pero con ese funcionará. Cambia la ruta/imagen que viene el código duro.

Las funciones StretchDIBits, GetDIBSizes, GetMem y demás estan explicadas en el menu Ayuda apartado Windows SDK

Saludos

URBANO 10-12-2009 13:39:33

Gracias por tus comentarios. Lo he probado y funciona bien.

El único problema que he encontrado es a la hora de convertirlo a pdf. Si mando el informe a imprimir a una impresora virtual (PDFCreator) , me genera el informe pero imprime la marca de agua delante del texto. Esto lo he solucionado utilizando el componente "ExportQR" el cual lo he colocado en mi informe y me permite generar un pdf a partir de el. Con lo que ya no dependo de tener instalada una impresora virtual de pdf en el sistema y la marca de agua aparece de forma correcta en el documento pdf.

Saludos.


La franja horaria es GMT +2. Ahora son las 14:14:18.

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