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

Я использую Delphi 5 и Fast Report 4 для создания приложения отчета. Я определил переменную «ReportTitle» в MyReport.f3 во время разработки и присвоил ей значение во время выполнения. Почему мой код вызывает исключение EStackOverflow?

Вот пример кода

  frxrprt1.LoadFromFile('c:\MyReport.fr3');
  frxrprt1.Variables['ReportTitle'] := 'Sales Summary Report';
  frxrprt1.ShowReport;

person rajeemcariazo    schedule 11.05.2011    source источник
comment
Какая строка вызывает переполнение стека. Вы видите в отладчике, есть ли переполнение стека в вашем коде или в коде быстрого отчета?   -  person David Heffernan    schedule 11.05.2011
comment
@David TfrxReport.Calc на frxClass.pas   -  person rajeemcariazo    schedule 11.05.2011
comment
Мне нравится, когда на StackOverflow.com возникают проблемы с переполнением стека.   -  person Warren P    schedule 11.05.2011


Ответы (2)


Использовать этот:

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

Значения «переменных» фактически обрабатываются как полноценные выражения; Если вы хотите, чтобы это была строка, это должна быть стандартная константа Паскаля с использованием одинарных кавычек; И поскольку вы делаете это из кода на паскале, вам нужно заключать кавычки в двойные кавычки.

Вы, вероятно, получаете переполнение стека, потому что механизм сценариев быстрого отчета пытается понять, что вы написали, и сталкивается с рекурсивной проблемой.

person Cosmin Prund    schedule 11.05.2011
comment
Я думаю, что вспомогательная функция, такая как SetVarLiteral(rpt,varname,value:String), которая устанавливает rpt.Variables[varname] := ''''+value+'''';, может быть полезной. Иначе я бы всегда беспокоился, что кто-то не знает об этом. - person Warren P; 11.05.2011

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

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

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

person Gromozeka    schedule 16.05.2011