#delphi #delphi-5 #fastreport
#delphi #delphi-5 #fastreport
Вопрос:
Я использую Delphi 5 и Fast Report 4 для создания приложения для создания отчетов. Я определил переменную «ReportTitle» в MyReport.f3 во время разработки и присвоил ей значение во время выполнения. Почему мой код вызывает исключение EStackOverflow?
Вот пример кода
frxrprt1.LoadFromFile('c:MyReport.fr3');
frxrprt1.Variables['ReportTitle'] := 'Sales Summary Report';
frxrprt1.ShowReport;
Комментарии:
1. Какая строка вызывает переполнение стека. Можете ли вы увидеть в отладчике, есть ли переполнение стека в вашем коде или в коде fast report?
2. @David TfrxReport. Calc в frxClass.pas
3. Мне нравится, когда проблемы с переполнением стека возникают на StackOverflow.com
Ответ №1:
Используйте это:
frxrprt1.Variables['ReportTitle'] := '''Sales Summary Report''';
Значения «переменной» фактически обрабатываются как полноценные выражения; Если вы хотите, чтобы это была строка, это должна быть стандартная константа pascal, использующая кавычки с одним тиком; И поскольку вы делаете это из кода pascal, вам нужно заключить кавычки в двойные кавычки.
Вероятно, вы получаете переполнение стека, потому что скриптовый движок fast report пытается разобраться во всем, что вы написали, и сталкивается с рекурсивной проблемой.
Комментарии:
1. Я думаю, что вспомогательная функция, подобная
SetVarLiteral(rpt,varname,value:String)
that setsrpt.Variables[varname] := '''' value '''';
, может быть полезной. В противном случае я бы всегда беспокоился, что кто-то не знал об этом.
Ответ №2:
Или вы можете использовать другой способ.
frxrprt1.Variables['ReportTitle'] := QuotedStr('Sales Summary Report');
Функция QuotedStr возвращает строку S, заключенную в одинарные кавычки. Это означает, что S заключено в одинарные кавычки, и каждая отдельная кавычка в S удваивается. Это эквивалентно вызову AnsiQuotedStr(s, «»).