Почему Fast Report VCL в Delphi вызывает исключение переполнения стека при редактировании переменной?

#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 sets rpt.Variables[varname] := '''' value ''''; , может быть полезной. В противном случае я бы всегда беспокоился, что кто-то не знал об этом.

Ответ №2:

Или вы можете использовать другой способ.

   frxrprt1.Variables['ReportTitle'] := QuotedStr('Sales Summary Report');
  

Функция QuotedStr возвращает строку S, заключенную в одинарные кавычки. Это означает, что S заключено в одинарные кавычки, и каждая отдельная кавычка в S удваивается. Это эквивалентно вызову AnsiQuotedStr(s, «»).