Вычисление логических выражений

отредактировано 14:33 Раздел: FastReport 4.0
всем привет!

почему при таком коде
var
  ShowAdditional: Boolean;                                       
begin           
  ShowAdditional := (Report.Variables['ShowAdditionalFields'] <> NULL) and <ShowAdditionalFields>;
выдается сообщение "неизвестная переменная или поле БД: ShowAdditionalFields"?

Комментарии

  • RhinoFCRhinoFC Новосибирск
    отредактировано 14:33
    arj99 написал: »
    всем привет!

    почему при таком коде
    var
      ShowAdditional: Boolean;                                       
    begin           
      ShowAdditional := (Report.Variables['ShowAdditionalFields'] <> NULL) and <ShowAdditionalFields>;
    
    выдается сообщение "неизвестная переменная или поле БД: ShowAdditionalFields"?

    По существу в теме и в тексте два разных вопроса.
    1) Да, по короткому
    2) Потому что интерпретатор наткнулся на неизвестную ему переменную.

    Проведём эксперимент. Немного видоизменим код таким образом:
    var
      ShowAdditional: Boolean;                                       
    begin           
      ShowAdditional := (Report.Variables['ShowAdditionalFields'] <> NULL) and <ShowAdditionalFields>;        
      ShowMessage(ShowAdditional);
    

    Запускаем и видим: выдаётся сообщение "False", делается попытка построения отчёта (это хорошо видно при OldStyleProgress = True) и только потом происходит вылет с ошибкой о неизвестной переменной.
    Теперь делаем так:
    var
      ShowAdditional: Boolean;                                       
    begin           
      ShowAdditional := True and <ShowAdditionalFields>;        
      ShowMessage(ShowAdditional);
    

    Вылет происходит сразу-же, поскольку он попытался получить значение несуществующей переменной, в отличие от первого примера. Т.е. в первом примере он обработал только первую часть выражения, получил False и на этом успокоился. Но интерпретатор всё-таки получил в обработку выражение с несуществующей переменной (что уж он там с ней делал, я не знаю) и вылетел.

    А в итоге делать надо так:
    var
      ShowAdditional: Boolean;                                       
    begin           
      ShowAdditional := False;                                                    
      if Report.Variables['ShowAdditionalFields'] <> NULL  then
        ShowAdditional := <ShowAdditionalFields>; // <- !!!
      ShowMessage(ShowAdditional);                                                                   
    end
    

    В этом случае интерпретатор не получает строчку, помеченную "!!!", вообще, а следовательно не пытается обработать несуществующую переменную.

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

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