Как передать значение переменной в скрипт?

borbor Москва
отредактировано 02:36 Раздел: FastReport 3.0
Есть такая проблема:

Имеется отчет (компонент TfrxReport). В нем на странице кодов (то есть в скрипте) - переменная int N.
Хочу из программы присвоить ей значение

frxReport1->Script->Variables["N"] = 2;
frxReport1->ShowReport();

Выдается сообщение "Идентификатор N переопределен".
В документации сказано, что если переменной нет, она будет создана, в противном случае ей просто присвоится значение.
Отказаться от описания переменной в скрипте не могу, т.к. значение для нее иногда должно передаваться, а иногда нет. В последнем случае FR будет ругаться на то, что переменная не определена.

Функция frxReport1->Script->Find("N") выдает NULL, то есть переменная не видится (следовательно, при присвоении значения
пересоздается). Почему, собственно, она не видится?

Как это обойти?

Комментарии

  • gpigpi
    отредактировано 02:36
    Передавайте в отчёт переменную N1, а в скрипте присваивайте N=N1
  • borbor Москва
    отредактировано 02:36
    Годится.
    Но как это согласуется с описанием в документации?
    И вторая часть вопроса - почему переменная не видится функцией Find?
  • отредактировано 02:36
    Если у вас скриптовая переменная, то делайте как сами написали.
    Если у вас переменная фастрепорта (fx), то:
    frxReport1->Variables->Items[frxReport1->Variables->IndexOf("N")]->Value = 2;
    frxReport1->ShowReport(true)
    
  • borbor Москва
    отредактировано 02:36
    В том-то и дело, что как делаю я - не получается (сообщение "Идентификатор N переопределен"). Придется, как посоветовали, делать все через промежуточную переменную N1, что некрасиво.

    Рискуя показаться назойливым, повторю вторую часть вопроса - почему описанная в скрипте переменная не видится функцией Find?
  • отредактировано 02:36
    bor написал: »
    В том-то и дело, что как делаю я - не получается (сообщение "Идентификатор N переопределен"). Придется, как посоветовали, делать все через промежуточную переменную N1, что некрасиво.
    Для скрипта все намного проще:
    frxReport1->Script->Variables ["N"] = 2
    
    и все...
    При этом переменную в скрипте можно использовать без объявления.
    bor написал: »
    Рискуя показаться назойливым, повторю вторую часть вопроса - почему описанная в скрипте переменная не видится функцией Find?
    Это уже вопрос к разработчикам...
    Но, думаю, find вам и не придется использовать...
  • borbor Москва
    отредактировано 02:36
    Пока ждал ответов, поковырялся в исходниках и разобрался сам.
    Все скриптовые переменные становятся видимыми движку FR только прсле срабатывания функции PrepareScript (вызывается автоматически при подготовке отчета).
    До сего момента скрипт - всего лишь StringList. Именно поэтому не работает Find, а ранее объявленная в скрипте переменная при присвоении значения определяется как бы во второй раз.
    Принудительный вызов PrepareScript не решает проблему, поскольку последующий вызов PrepareReport (а в нем, соответственно, штатно вызывается PrepareScript) обнуляет все списки переменных скрипта и заполняет их заново.

    Попробую пошуршать в исходниках, чтобы изменить порядок вызова функций.

    О результатах доложу.

    Всем спасибо!

  • отредактировано 02:36
    Напишите так
    frxReport1->Script->Variables ["N"] = 2
    
    и не объявляйте переменную в скрипте, просто используйте.

    Все будет работать.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.