Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Uses en FastReport (https://www.clubdelphi.com/foros/showthread.php?t=87911)

santiago14 18-03-2015 00:21:44

Uses en FastReport
 
Buenas, la verdad, es que estoy medio perdido con este tema.
No puedo hacer que funcione una dichosa "uses" dentro de FastReport. Tal vez sea porque no se puede (de hecho los manuales dicen que sí) o yo no estoy dando en la tecla.

En realidad lo único que quiero hacer es que me muestre un cartel que me diga que objeto se va imprimiendo. Al estilo OutputDebugString(), la cuestión es que no he conseguido hacerlo.

No tiene sentido poner un ShowMessage() porque se detendría en cada cosa que se vaya poniendo en la hoja, por eso mi intención es que se vayan registrando en algún lugar, y me pareció lo mas simple ponerlos en los Eventos de Delphi.

Si no puedo ponerlos ahí a los mensajes, quisiera me dijeran donde.

Muestro aquí un pedacito de código de lo que quiero hacer.
Código Delphi [-]
uses
  'C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\source\rtl\sys\System.SysUtils.pas';
 
procedure Memo1OnAfterPrint(Sender: TfrxComponent);
begin
  Outputdebugstring('Hola');
end;

Begin

end.

Cuando quiero ejecutar esto me dice "Begin expected".

Bueno, espero se entienda y me puedan dar una mano.

Santiago.

AgustinOrtu 18-03-2015 02:43:14

Probá asi:

Código Delphi [-]
uses
 System.SysUtils;

duilioisola 18-03-2015 10:04:43

Las uses no van entre comillas. No son un string.
Prueba como te dice AgustinOrtu.

Si el compilador te dice que no encuentra esa librería, deberás darle los path en las opciones del proyecto.

En Delphi 6 es Project --> Options --> Directories/conditionals --> Search path.

santiago14 18-03-2015 12:47:30

Lo he probado como me dijeron, pero ahora sale el cartel "Identifier expected"
Código Delphi [-]
uses
  System.Sysutils;

Luego, fui a Project --> Options --> Directories and Conditionals --> Include file search text --> C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\source\rtl\sys, pero la cosa no cambia. Estoy en Delphi XE5.

duilioisola 18-03-2015 13:25:26

Vas a tener que darnos más información:
* Pon el mensaje de error completo y sin traducir. Puede ser que el mensaje de "Identifier Expected" se refiera a alguna otra línea.
* Muestra el código que tienes hasta ahora. El real. El resumen que has puesto en el primer mensaje, al no ser algo que pueda compilar no nos es útil.

He hecho una prueba desde cero y compila correctamente. Solo hice estos pasos:
1 File --> New --> VCL Forms Application - Delphi
2 En el Formulario que aparece agregué el evento OnShow.
3 Puse la línea que te da problemas.

Quedó así:
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   Outputdebugstring('Hola');
end;

end.

santiago14 18-03-2015 14:32:37

Ahhh, el ejemplo que pusiste funciona porque lo estás haciendo en el TForm1.
Lo que yo digo es dentro de la estructura de FastReport (PascalScript)
Transcribo lo que tengo:

En un DataModule tengo un frxReport (frxTapaBoletinViejo), entrando a él quiero hacer que FastReport me cuente que caja de texto ha sido impresa, de ahí que me pareció lo mas adecuado que eso salga a través de EventLog de Delphi.

Esto es lo que tengo en el DataModule
Código Delphi [-]
unit dmReportes;

interface

uses
  System.SysUtils, System.Classes, frxRich, frxClass, sRichEdit,
  Vcl.ExtCtrls, frxDBSet, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
  FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client, frxExportPDF, frxExportRTF,
  Datasnap.Provider, Datasnap.DBClient, frxDesgn, dataModule, frxExportText,
  Winapi.Windows;

type
  TdtmReportes = class(TDataModule)
    
    frxTapaBoletinViejo: TfrxReport;
    
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  dtmReportes: TdtmReportes;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}


end.

Ahora bien, entro en el frxReport (Edit report), me aparecen las herramientas de edición propias de FastReport.

Y en la parte de código (code), es donde intento poner el código que he puesto en post's anteriores.

Dentro de la pestaña Code he puesto lo siguiente:
Código Delphi [-]
uses 
  System.SysUtils;                                                                                    
   

procedure avisoCOMPROBANTEOnAfterPrint(Sender: TfrxComponent);
begin
  OutputDebugString('Hola');                                                        
end;

begin

end.

Al intentar correrlo, el error es "Identifier expected" y el cursos se posiciona en la "S" (la primera) de System.SysUtils

En el formulario FastReport solament tengo una cajita de texto "AvisoComprobante" que es un Memo común de FastReport.

santiago14 18-03-2015 14:34:20

Intenté poniendo un frxReport en el TForm1 y la cosa no ha cambiado.

Teniendo el componente frxReport en un DataModule como en un TForm no salva el error.

Espero que ahora se entienda mejor.
Gracias compañeros.

Santiago.

duilioisola 18-03-2015 15:31:12

Ahora entiendo, no es en Delphi!
Es en el script de FastReport.

El script no está unido a Delphi. No puedes utilizar cosas de tu programa en ese script. Solo lo que FastReport te "traduce".

Creo que lo mejor es que en tu aplicación Delphi agregues algo al evento OnEnterRect del componente frxReport.

Algo así:

Código Delphi [-]
procedure TdtmReportes.frxTapaBoletinViejoEnterRect(Memo: TStringList; View: TfrView);
begin
  OutputDebugString('FastReport ha pasado por ' + View.Name + ', el cual contiene las siguientes líneas: ' + Memo.Text);
end;

santiago14 18-03-2015 16:09:54

Cita:

Empezado por duilioisola (Mensaje 490110)
Ahora entiendo, no es en Delphi!
Es en el script de FastReport.

El script no está unido a Delphi. No puedes utilizar cosas de tu programa en ese script. Solo lo que FastReport te "traduce".

Creo que lo mejor es que en tu aplicación Delphi agregues algo al evento OnEnterRect del componente frxReport.

Algo así:

Código Delphi [-]
procedure TdtmReportes.frxTapaBoletinViejoEnterRect(Memo: TStringList; View: TfrView);
begin
  OutputDebugString('FastReport ha pasado por ' + View.Name + ', el cual contiene las siguientes líneas: ' + Memo.Text);
end;


Uhhh, perfecto. Si logro hacer funcionar eso sería genial.

Lo pongo en práctica y publico los resultados aquí.

CONSULTA ADICIONAL: ¿De esta manera podría sacar un valor que se generó dentro del Script FastReport? Por ejemplo, ¿el nro de página que acaba de imprimir?.


Muchas gracias.

Santiago.

santiago14 18-03-2015 16:49:02

No hay un evento OnEnterRect()...
¿Será este el evento correcto?:
Código Delphi [-]
procedure TdtmReportes.frxAvisosRTFGetValue(const VarName: string;
  var Value: Variant);

begin

//.....
end;

Santiago.

duilioisola 18-03-2015 17:31:00

Perdón por la confusión. Lo que te he comentado es de otra vesión de FastReport.
En la que tu comentas (creo que debe ser la 3 o 4) debes utilizar el evento OnBeforePrint.

Código Delphi [-]
procedure TdtmReportes.frxAvisosRTFBeforePrint(Sender: TfrxReportComponent);
begin
  // Si se trata de un Memo
  if (Sender is TfrxCustomMemoView) then
  begin
     with TfrxCustomMemoView(Sender) do
     begin
        OutputDebugString('FastReport ha pasado por ' + Name + ', el cual contiene las siguientes líneas: ' + Memo.Text);
        // ...
     end;
  end;

  // Si se trata de un RichEdit
  if (Sender is TfrxRichView) then
  begin
     with TfrxRichView(Sender) do
     begin
        OutputDebugString('FastReport ha pasado por ' + Name + ' (RichEdit), el cual contiene el tag: ' + TagStr + ' las siguientes líneas: ' + Memo.Text);
        // ...
     end;
  end;

  // Si se trata de una imagen
  if (Sender is TfrxPictureView) then
  begin
     with TfrxRichView(Sender) do
     begin
        OutputDebugString('FastReport ha pasado por ' + Name + ' (Imagen), el cual contiene el siguiente tag: ' + TagStr);
        // ...
     end;
  end;
end;

A OnGetValue entra cada vez que evalúa una variable. Yo la utilizo para pasarle información que sería difícil controlar desde FastReport.
Código Delphi [-]
procedure TdtmReportes.frxAvisosRTFGetValue(const VarName: string; var Value: variant)
begin
  if (UpperCase(VarName) = 'CalculoDificilEnFastReport') then
  begin
     //...
     Value := {Resultado del cálculo}
  end;
end;

santiago14 18-03-2015 18:26:56

Mi versión de FastReport es la 5.2.
Me voy a sentar manos a la obra y luego publico mis resultados.

Gracias. Santiago.


La franja horaria es GMT +2. Ahora son las 22:41:00.

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