Как узнать что будет напечатано в поле Memo?
Всем Здравствуйте!
Подскажите пожалуйста в каком порядке срабатывают OnGetValue и OnBeforePrint у frxReport'а? По трассировке получается, что сначала OnBeforePrint, а потом OnGetValue???? Неужели так и должно быть? Тогда как же узнать перед печатью какой текст (уже готовый, без переменных и агрегатных функций) будет выведен в поле данного Memo?
Подскажите пожалуйста в каком порядке срабатывают OnGetValue и OnBeforePrint у frxReport'а? По трассировке получается, что сначала OnBeforePrint, а потом OnGetValue???? Неужели так и должно быть? Тогда как же узнать перед печатью какой текст (уже готовый, без переменных и агрегатных функций) будет выведен в поле данного Memo?
Комментарии
используй событие MemoOnAfterData
Я нашёл ссылку на это событие в документации, но не совсем понятно, я, что, должен сам вписывать ссылку на обработчик этого события во все Memo документа, или его можно инициировать как-то иначе?
И второе: в документации сказано, что:
"Одно замечание – если в объекте содержится несколько выражений,
например [expr1] [expr2] – в переменную Value попадет значение последнего
выражения." -
и какже мне увидеть ВЕСЬ готовый текст, который будет помещён в поле Memo?
MemoText:=Memo1.Text
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, frxClass;
type
TForm1 = class(TForm)
frxReport1: TfrxReport;
procedure frxReport1GetValue(const VarName: String;
var Value: Variant);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.frxReport1GetValue(const VarName: String;
var Value: Variant);
begin
if VarName='var' then Value:='Text';
ShowMessage('frxReportGetValue '+TfrxMemoView(frxReport1.FindObject('Memo1')).Text);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
frxReport1.ShowReport();
end;
end.
==================dfm====================
object Form1: TForm1
Left = 191
Top = 114
Width = 296
Height = 265
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object frxReport1: TfrxReport
Version = '3.20'
DotMatrixReport = False
IniFile = '\Software\Fast Reports'
PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick]
PreviewOptions.Zoom = 1.000000000000000000
PrintOptions.Printer = 'По умолчанию'
ReportOptions.CreateDate = 38774.892350740740000000
ReportOptions.LastChange = 38774.892350740740000000
ScriptLanguage = 'PascalScript'
ScriptText.Strings = (
'procedure Memo1OnBeforePrint(Sender: TfrxComponent);'
'begin'
' ShowMessage(''Memo1OnBeforePrint ''+Memo1.Text);'
'end;'
''
'procedure Memo1OnAfterData(Sender: TfrxComponent);'
'begin'
' ShowMessage(''Memo1OnAfterData ''+Memo1.Text);'
' Memo1.Text:=''Corrected text'';'
'end;'
''
'begin'
''
'end.')
OnGetValue = frxReport1GetValue
Left = 98
Top = 58
Datasets = <>
Variables = <>
Style = <>
object Page1: TfrxReportPage
PaperWidth = 209.973333333333300000
PaperHeight = 296.862500000000000000
PaperSize = 9
LeftMargin = 10.000000000000000000
RightMargin = 10.000000000000000000
TopMargin = 10.000000000000000000
BottomMargin = 10.000000000000000000
object Memo1: TfrxMemoView
Left = 22.000000000000000000
Top = 24.000000000000000000
Width = 246.000000000000000000
Height = 16.000000000000000000
OnAfterData = 'Memo1OnAfterData'
OnBeforePrint = 'Memo1OnBeforePrint'
Memo.UTF8 = (
'[var]')
end
end
end
end
Так есть ещё какой-нибудь способ увидеть из внешнего кода строку, готовую к печати в Memo?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, frxClass, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
frxReport1: TfrxReport;
procedure frxReport1GetValue(const VarName: String;
var Value: Variant);
procedure FormCreate(Sender: TObject);
function frxReport1UserFunction(const MethodName: String;
var Params: Variant): Variant;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.frxReport1GetValue(const VarName: String;
var Value: Variant);
begin
if VarName='var' then Value:='Text';
ShowMessage('frxReportGetValue '+TfrxMemoView(frxReport1.FindObject('Memo1')).Text);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
frxReport1.AddFunction('function GetText(Text:string):string');
frxReport1.ShowReport;
end;
function TForm1.frxReport1UserFunction(const MethodName: String;
var Params: Variant): Variant;
begin
if MethodName='GETTEXT' then
begin
Label1.Caption:='Text in memo - '+VarToStr(Params[0]);
Result:=Params[0];
end;
end;
end.
====dfm====
object Form1: TForm1
Left = 191
Top = 114
Width = 296
Height = 265
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 100
Top = 38
Width = 32
Height = 13
Caption = 'Label1'
end
object frxReport1: TfrxReport
Version = '3.20'
DotMatrixReport = False
IniFile = '\Software\Fast Reports'
PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick]
PreviewOptions.Zoom = 1.000000000000000000
PrintOptions.Printer = 'По умолчанию'
ReportOptions.CreateDate = 38774.892350740700000000
ReportOptions.LastChange = 38774.892350740700000000
ScriptLanguage = 'PascalScript'
ScriptText.Strings = (
'procedure Memo1OnBeforePrint(Sender: TfrxComponent);'
'begin'
' ShowMessage(''Memo1OnBeforePrint ''+Memo1.Text);'
'end;'
''
'procedure Memo1OnAfterData(Sender: TfrxComponent);'
'begin'
' ShowMessage(''Memo1OnAfterData ''+Memo1.Text);'
' {Memo1.Text:=''Corrected text'';}'
'end;'
''
'begin'
''
'end.')
OnGetValue = frxReport1GetValue
OnUserFunction = frxReport1UserFunction
Left = 50
Top = 32
Datasets = <>
Variables = <>
Style = <>
object Page1: TfrxReportPage
PaperWidth = 210.000000000000000000
PaperHeight = 297.000000000000000000
PaperSize = 9
LeftMargin = 10.000000000000000000
RightMargin = 10.000000000000000000
TopMargin = 10.000000000000000000
BottomMargin = 10.000000000000000000
object Memo1: TfrxMemoView
Left = 22.000000000000000000
Top = 24.000000000000000000
Width = 246.000000000000000000
Height = 16.000000000000000000
OnAfterData = 'Memo1OnAfterData'
OnBeforePrint = 'Memo1OnBeforePrint'
Memo.UTF8 = (
'[GetText(<var>)]')
end
end
end
end
Проще говоря, совсем непонятно, что делать!
Ситуация такая: пользователи программы создают новый отчёт:
// первая колонка DataBand'а вторая колонка ..... и т.д.
[var1] бла-бла-бла [var2] бла-бла-бла [var3] | [var4] бла-бла-бла [var5] .........
регистрируют его у меня в системе, и я, зная, что надо подставлять вместо [var1], [var2], ..... и т.д., строю отчёт. Но перед тем как готовая, содержащая все подстановки переменных строка будет выведена в отчёт, я должен произвести из кода программы довольно сложный анализ и обработку этой строки.
Так как-же в свете последнего примера это можно сделать?
На мой взгляд, именно OnBeforePrint у frxReport'а и должен давать мне такую возможность!
2. перед запуском отчета в скрипт из программы добавь обработчик(просто дописать текст перед первым Begin
End.) 3. Всем мемка в отчете поставить твой обработчик
По доке: создал в программе программе процедуру , зарегистрировал её в FR в скрипте отчёта поместил обработчик OnAfterData для мемок
Толкаю - только молча строится отчёт.
Через отладчик вижу, что AddFunction нормально регистрирует MyParse в FR(регистрирует саму процедуру, парсит и регистрирует список её переменных), для мемок нормально запускается AllMemoOnAfterData, но управление в и, тем более, ко мне в MyParse не попадает!
Где ещё грабли???
1. пустая форма ложу frxReport и TButton.
2. 3. 4. 5. в отчете одна мемка в с обработчиком
все работает.
Проверь весь код еще раз.
вот файл с отчетом
////////////////////////////////////////////////////
unit1.dfm
////////////////////////////////////////////////////
////////////////////////////////////////////////////
unit1.pas
////////////////////////////////////////////////////
Может быть это связано с версией Delphi? У меня D5, а примеры, я так понимаю, в более поздней(т.к. в uses есть юнит Variants, которого в D5 нет и я его убираю. При этом всё строится без проблем.) Про пользовательские функции сейчас почитаю, но думаю, это ничего не даст.