Ошибки в 3.04

2

Комментарии

  • отредактировано 11:36
    Теперь по поводу моего поста на предыдущей странице насчет полного зависания компа. Вот потратил больше двух часов, но подобрал минимальное количество действий, чтобы воссоздать ситуацию.

    1. Создаем новый пустой отчет: Файл -> Новый -> Путой стандартный отчет
    2. На обработчик событий Page1.OnBeforePrint вешаем следующий обработчик:
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
      Set('DetFootPopulation', 0);
      Set('ResultClients', 47);
      Set('DetFootClientsPercent', IIF(<DetFootPopulation> <> 0, <ResultClients>/<DetFootPopulation>*100, 0));
    end;
    
    3. Нажимаем кнопку "Предварительный просмотр".

    Компьютер вешается НАМЕРТВО. Помогает только Reset.
    Даже переменные в списке переменных создавать не нужно, хотя в моем полном отчете, откуда все это началось, они созданы и проинициализированы.


    Моя конфигурация: Athlon XP 2600+, 512 RAM, Windows XP Pro Rus SP1.
    Интересно, что при попытке сделать это же в VMWare происходит также полное зависание всего компьютера, а не только виртуальной машины.

    Предлагаю другим посетелям конференции повторить ситуацию и написать о результатах в конференцию. Сам я завтра поэкспериментирую на других компьютерах. Только не забудьте сохраниться. ;)
  • отредактировано 11:36
    AlexTZ написал:
    Большинство нештатных исключений перехватывается самим фастом, и выдается на экран (или в Report.Errors - если стоит Report.EngineOptions.SilentMode) в виде понятных сообщений.
    Я как раз имел ввиду, что "понятность сообщений" весьма относительное понятие: то что понятно для меня, совсем не означает, что оно будет понятно конечным пользователям. ;)

    Все-таки для такой _опциональной_ возможности как не выдавать сообщений на экран (или в Report.Errors), а райзить для обработки вызывающим приложением понадобится минимум телодвижений - зато польза налицо.

    Почему я на это обращаю так много внимания - просто я сам очень к этому привык и весьма поощряю других разработчиков в том, чтобы критические исключения никогда не "глушились" ни в каком библиотечном коде, а всегда обрабатывались только "end user code".
    Да, для этого можно использовать Report.Errors, но ведь это всего лишь StringList!!! Его нельзя использовать для структурированной обработки исключений, основываясь на классах исключений. Это противоречит правилам хорошего тона в программировании и является шагом назад в процедурный мир из мира объектно-ориентированного. Уж очень сильно оно попахивает на "IOError <> 0" из времен, когда по земле ходили динозавры ;)

    Предлагаю всем посетелям форума провести акцию: "Сделаем вместе ФастРепорт лучше" и в ее рамках отстаивать важные пункты функциональности ФР вплоть до того, чтобы засучив рукава править исходный код, дабы не отвлекать разработчиков от процесса убеждения нас самих в том, что функциональность, которую мы хотим, на самом деле нам не нужна. ;) Все-таки они не используют ФР в конечных приложениях так, как это делаем мы, а потому вряд ли смогут нас полностью понять, поэтому к недопониманию наших потребностей будем относиться с пониманием... ;)
  • отредактировано October 2004
    Возникла тут еще одна неприятная багофича.
    К примеру, вычисляются у меня в отчете денежные суммы и я хочу показывать числа с двумя знкаками после запятой, причем положительные числа со знаком "+", отрицательные - со знаком "-", а нули - в виде "0.00". Для некоторых ячеек расчет невозможен и я хочу оставить их пустыми.
    Сделал следующим образом: создал переменную Result, которая получает результат расчетов. Если расчет невозможен, то переменной присваивается Null. Далее в текстовом поле эту переменную вывожу используя функцию FormatFloat:
    [FormatFloat('+#,##0.00;-#,##0.00;0.00', <Result>)]
    

    Однако в тех ячейках, где <Result> = null появляется сообщение об ошибке:
    Could not convert variant of type (Null) into type (Double).

    Логично, функции FormatFloat передается Null и она его не может преобразовать в вещественное значение. В принципе, так и должно быть, преобразовываем в следующий код:
    [IIF(VarToStr(<Result>) = '', '', FormatFloat('+#,##0.00;-#,##0.00;0.00', <Result>))]
    

    Здесь вроде бы все предусмотрено: если <Result> = null, то возвращаем пустую строку, если нет - то делаем FormatFloat (к сожалению, функцию типа VarIsNull я не нашел, поэтому преобразовываю <Result> в строку и проверяю, не является ли пустой она).

    Однако сообщение об ошибке (Could not convert variant of type (Null) into type (Double)) никуда не пропадает. Как показал следственный эксперимент, ФР в любом случае пытается исполнить FormatFloat, даже если условие в приведенной конструкции IIF является true и необходимо вернуть пустую строку. Налицо поведение ФР в данной ситуации вызывает проявление синдрома обманутых ожиданий пользователя и требует пояснений. ;)
  • отредактировано October 2004
    koldovsky написал:
    . Трассировка показывает, что ошибка появляется в TfrxDBDataset.GetValue, а вызывает ее следующая строчка:
       Result := TField(Fields.Objects[i]).Value
    
    Где Fields.Objects ни на что не указывает.
    Мне надоела ошибка в это месте и я написал у себя
       Result := FDS.FieldByName(Index).Value
    
    Дышать стало значительно легче, хотя хотелось бы найти причину этого, но времени пока на это нет (интересно а есть ли оно у разработчиков ;) ).

    Компоненты тоже можно сказать самописные DBX переделаный. Кроме этого пришлось ещё в компоненте сделать принудительно переоткрытие Detail наборов в событии AfterOpen, иначе они не всегда переоткрываются.
  • отредактировано 11:36
    AlexTZ написал:
    AlexTZ написал:
    ;)
    Хочу обратить внимание разработчиков, что сообщения об ощибках лучше бы выдавать через стандартный механизм RAISE EXCEPTION, а не использовать для этих целей MessageBox!!!!!!

    Это называется - хрен поймаешь!!!
    У разработчиков свои цели. И raise этим целям не соответствует.
    ;)
    Может быть, но что делать в такой ситуации: имеется не один десяток отчётов, печатные формы которых собраны на 2.51. Переделывать их оч. долго, у людей нет на это времени. Поэтому я решил использовать и версию 2.51 и 3.03 одновременно (2.51 только просмотр). Печ. формы хранятся в БД. Но как отличить их версии не вводя ещё одно поле в таблицу БД? Сейчас при попытке загрузить в 3.03 формы сделанные в 2.51 выдаётся сообщение и всё. Если бы был exception можно было бы использовать try except для перехвата ошибки.

    Кстати, почему-то печатные формы собранные в 3.0 не загружаются в 3.03
  • отредактировано 11:36
    написал:
    У меня все есть и работает. Какие ресурсы ставите?
    Пробовал ресурсы анлийские, русские, украинские.
    От языка не зависит.
    Одинаково кнопки в тулбаре не работают и в Delphi5 и в BCB6.
    Однако редактор свойств работает правильно, хоть это спасает.
    Но все равно нехорошо.

    Судя по тому, что у других таких проблем нет, может причина в некорректной инсталляции/деинсталляции FR ?

    С самого начала у меня была демка 2.46.
    Потом купили 3.0. Ставил версии 3.01, 3.02, 3.03, 3.04.

    Старался переставлять версии корректно.

    Кнопки в тулбаре не работали ни в одной версии FR3.
    Access violation появился в 3.04.
  • отредактировано 11:36
    1. При frxReport.OldStyleProgress=false события OnProgressStart и OnProgressStop вызываются тольки при печати отчета. При просмотре - нет.

    2. При включении frxReport.OldStyleProgress=true события OnProgressStart и OnProgressStop отрабатывают и при просмотре, но при этом отчет НЕ РАБОТАЕТ ("List index out of bounds...")

    Кроме того, почему нельзя вообще отключить Progress ?
    Может добавить свойство ShowProgress ?
  • отредактировано 11:36
    Может я где-то, чего-то не уловил, поэтому заранее прошу прощения, если вопрос окажется глупым. ;)

    Вопрос следующего плана: можно ли переменным присваивать строковые значения, с помощью процедуры Set (Особенно, если в этих переменных ранее были числа)?

    У меня что-то не выходит.

    Делаю так:
    Set('Result', FormatFloat('+#,##0.00;-#,##0.00;0.00', Res));
    

    Ругается: Ошибка в выражении '0,00': ';' expected

    Делаю так:
    Set('Result', 'Privet');
    

    Ругается: Ошибка в выражении 'Privet': Неопределенный идентификатор: 'Privet'

    Почему это вообще происходит какая-то дополнительная обработка моей строки, поиск идентификаторов? Может это где-то отключается?



  • отредактировано 11:36
    2 Koldovsky

    Поставь точку с запятой в конце строки. Вот так

    '+#,##0.00;-#,##0.00;0.00;'

    Set('Result', 'Privet'); - так 'Privet' это идентификатор, которого нет.

    Попробуй так
    Set('Result', "Privet");
  • отредактировано 11:36
    А куда пропал "правильный" экспорт. В 2.51 был.

    Как все делают:
    1. Выбираем пункт Save As меню File
    2. Указываем выриант экспорта, вводим имя и нажимаем Ок
    3. Выдаем настройки экспорта.

    Всё! В 2.51 так и было! Зачем это убрали!

    В версиях, начиная с 3.0 экспорт сделан так (если спрятаны кнопки окна просморта, так надо):

    1. Выдаем форму с кучей радиобаттонов или ещё как-нибудь
    2. Анализируем какой из них помечен и вызываем метод Export с нужным фильтром

    Ну это же не удобно!

    Большая просьба вернуть метод SaveToFile ;)
  • отредактировано 11:36
    Ejik написал:
    Ejik написал:
    Ejik написал:
    ;)
    Хочу обратить внимание разработчиков, что сообщения об ощибках лучше бы выдавать через стандартный механизм RAISE EXCEPTION, а не использовать для этих целей MessageBox!!!!!!

    Это называется - хрен поймаешь!!!
    У разработчиков свои цели. И raise этим целям не соответствует.
    ;)
    Может быть, но что делать в такой ситуации: имеется не один десяток отчётов, печатные формы которых собраны на 2.51. Переделывать их оч. долго, у людей нет на это времени. Поэтому я решил использовать и версию 2.51 и 3.03 одновременно (2.51 только просмотр). Печ. формы хранятся в БД. Но как отличить их версии не вводя ещё одно поле в таблицу БД? Сейчас при попытке загрузить в 3.03 формы сделанные в 2.51 выдаётся сообщение и всё. Если бы был exception можно было бы использовать try except для перехвата ошибки.

    Кстати, почему-то печатные формы собранные в 3.0 не загружаются в 3.03
    Я определяю по коду из базы
    если код отчета меньше какой то цифери значит это 2.53
    больше значит 3

    и все работает
  • отредактировано October 2004
    Ejik написал:
    2 Koldovsky

    Поставь точку с запятой в конце строки. Вот так

    '+#,##0.00;-#,##0.00;0.00;'

    Set('Result', 'Privet'); - так 'Privet' это идентификатор, которого нет.

    Попробуй так
    Set('Result', "Privet");
    Странно, не помогает ни точка с запятой в конце строки форматирования,
    ни двойные кавычки, в которые включается строка.

    В первом случае сообщение несколько изменяется - вместо "";" expected" пишет "expression expected ", но результат, фактически тот же.

    Ну а во втором - интерпретарор отказывается воспринимать строку с двойными кавычками, что, в общем-то понятно, поскольку в PascalScript, который я использую, двойные кавычки для выделения строк не применяются.
  • отредактировано 11:36
    koldovsky написал:
    Теперь по поводу моего поста на предыдущей странице насчет полного зависания компа. Вот потратил больше двух часов, но подобрал минимальное количество действий, чтобы воссоздать ситуацию.

    1. Создаем новый пустой отчет: Файл -> Новый -> Путой стандартный отчет
    2. На обработчик событий Page1.OnBeforePrint вешаем следующий обработчик:
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
      Set('DetFootPopulation', 0);
      Set('ResultClients', 47);
      Set('DetFootClientsPercent', IIF(<DetFootPopulation> <> 0, <ResultClients>/<DetFootPopulation>*100, 0));
    end;
    
    3. Нажимаем кнопку "Предварительный просмотр".

    Компьютер вешается НАМЕРТВО. Помогает только Reset.
    Даже переменные в списке переменных создавать не нужно, хотя в моем полном отчете, откуда все это началось, они созданы и проинициализированы.


    Моя конфигурация: Athlon XP 2600+, 512 RAM, Windows XP Pro Rus SP1.
    Интересно, что при попытке сделать это же в VMWare происходит также полное зависание всего компьютера, а не только виртуальной машины.

    Предлагаю другим посетелям конференции повторить ситуацию и написать о результатах в конференцию. Сам я завтра поэкспериментирую на других компьютерах. Только не забудьте сохраниться. ;)
    Перепроверил на демке от 3.04. Все равно, floating point division by zero, и никаких зависаний! Win98, WinXP home.
  • отредактировано 11:36
    koldovsky написал:
    Однако сообщение об ошибке (Could not convert variant of type (Null) into type (Double)) никуда не пропадает. Как показал следственный эксперимент, ФР в любом случае пытается исполнить FormatFloat, даже если условие в приведенной конструкции IIF является true и необходимо вернуть пустую строку. Налицо поведение ФР в данной ситуации вызывает проявление синдрома обманутых ожиданий пользователя и требует пояснений. ;)
    IIF - это обычная функция. Как любой другой функции, ей требуется перед выполнением вычислить и передать ВСЕ параметры.
  • отредактировано 11:36
    SterhBy написал:
    Кнопки в тулбаре не работали ни в одной версии FR3.
    Access violation появился в 3.04.
    А в демке (та, что скомпилированная на нашем сайте лежит) работает?
  • отредактировано 11:36
    SterhBy написал:
    1. При frxReport.OldStyleProgress=false события OnProgressStart и OnProgressStop вызываются тольки при печати отчета. При просмотре - нет.

    2. При включении frxReport.OldStyleProgress=true события OnProgressStart и OnProgressStop отрабатывают и при просмотре, но при этом отчет НЕ РАБОТАЕТ ("List index out of bounds...")

    Кроме того, почему нельзя вообще отключить Progress ?
    Может добавить свойство ShowProgress ?
    2. Только что проверил на демке, все работает.
  • отредактировано 11:36
    koldovsky написал:
    Вопрос следующего плана: можно ли переменным присваивать строковые значения, с помощью процедуры Set (Особенно, если в этих переменных ранее были числа)?
    Это описано в документации. Надо так:
    Set('Result', '''' + 'Privet' + '''');
    
  • отредактировано 11:36
    написал:
    QUOTE (SterhBy @ Oct 26 2004, 11:31 PM)
    Кнопки в тулбаре не работали ни в одной версии FR3.
    Access violation появился в 3.04. 


    А в демке (та, что скомпилированная на нашем сайте лежит) работает?

    Проверил в демке - все работает.
    Но от этого не легче.
    Причина ведь должна быть. Может какие хвосты от старых версий...
  • отредактировано 11:36
    В редакторе кода

    если нажать кнопку INSERT текст также смещается
    снова жмем кнопку инсерт никакой реакции.

  • отредактировано 11:36
    Редактор кода не поддерживает режимы insert/overwrite.
  • отредактировано 11:36
    Народ, а что правда кто-то кинулся переделывать свои 100% работающие отчёты под FR 3.0 ?
    ИМХО пустая трата времени. Багов больше чем "фич" по сравнению с 2.4х ...
  • отредактировано 11:36
    Проблемы с IBXQuery:

    1.Проблемы с master-detail IBXQuery, работает не стабильно. Возникают ошибки 'field "" has no dataset'(чаще) или просто 'AV read 00000000'. При запуске из среды Delphi ошибки происходят почти всегда, из ОС не всегда. Testcase отправлен на tz@fast-report.com

    2.При помещении на диалоговую форму IBXQuery возбуждается исключение:
    ...EIBClientError ... "Empty SQL Statment" ...
    Это же происходит при копировании (не при вставке!), и отмене удаления
    нового IBXQuery. Если запускать проект не из среды Delphi, вроде бы такого не происходит.

    3.После копирования-вставки IBXQuery на диалоговую форму, при щелчке на
    кнопку списка свойства Master вставленного обьъекта, возбуждается
    исключение:
    ...EStringListError ... "List index out of bounds(-1)" ...
    Это происходит как при вставке из текущего отчета, так и из другого,
    и независимо от установленного значения свойства Master. И при запуске из среды Delphi, и при запуске из ОС.

    4.Почему нельзя удалить компоненты кнопкой Del на диалоговой форме, тем
    более, что есть Undo? На обычной странице Page компоненты удаляются
    нормально кнопкой, хотя и на странице и на форме в контекстном меню
    горячая клавиша в строке Delete не видна.
  • отредактировано 11:36
    AlexTZ написал:
    IIF - это обычная функция. Как любой другой функции, ей требуется перед выполнением вычислить и передать ВСЕ параметры.
    Спасибо, понял. Для таких целей IIF не подходит, хотя жаль, было бы красиво.
    AlexTZ написал:
    Это описано в документации. Надо так:

    Ну, по поводу этого я и сам догадывался, что где-то оно должно быть. Вот только документацию от начала и до конца читать не люблю, сделал поиск по слову "Set", ничего подходящего не нашлось, написал в форум.

    Спасибо за помощь.
  • отредактировано 11:36
    Georgy написал:
    Проблемы с IBXQuery:

    1.Проблемы с master-detail IBXQuery, работает не стабильно. Возникают ошибки 'field "" has no dataset'(чаще) или просто 'AV read 00000000'. При запуске из среды Delphi ошибки происходят почти всегда, из ОС не всегда. Testcase отправлен на tz@fast-report.com


    3.После копирования-вставки IBXQuery на диалоговую форму, при щелчке на
    кнопку списка свойства Master вставленного обьъекта, возбуждается
    исключение:
    ...EStringListError ... "List index out of bounds(-1)" ...
    Это происходит как при вставке из текущего отчета, так и из другого,
    и независимо от установленного значения свойства Master. И при запуске из среды Delphi, и при запуске из ОС.

    4.Почему нельзя удалить компоненты кнопкой Del на диалоговой форме, тем
    более, что есть Undo? На обычной странице Page компоненты удаляются
    нормально кнопкой, хотя и на странице и на форме в контекстном меню
    горячая клавиша в строке Delete не видна.
    To Georgy

    1. Почитай один из моих ответов этой ветке про FieldByName
    3. Report->Data, надо все прокрыжить
    4. Сказали что в 3.05 будет
  • отредактировано 11:36
    To AlexTZ:
    Александр, спасибо за быстрый ответ, с новым frxDBSet.pas проблем в master-detail вроде бы наблюдается.

    To Markus:
    написал:
    1. Почитай один из моих ответов этой ветке про FieldByName
    Спасибо, но не понятно при чем тут FieldByName?
  • Stalker4Stalker4 123
    отредактировано October 2004
    Vano
    написал:
    Народ, а что правда кто-то кинулся переделывать свои 100% работающие отчёты под FR 3.0 ?

    Ну например я.
    Я уже переделал где то 70% своих отчетов с FR2.5x на FR3.
    Особо неразрешимых проблем пока не было. А те проблемы что у меня были большей частью уже решены или исправленны в FR3 Александром.
  • отредактировано 11:36
    Georgy написал:
    To AlexTZ:
    Александр, спасибо за быстрый ответ, с новым frxDBSet.pas проблем в master-detail вроде бы наблюдается.

    To Markus:
    Georgy написал:
    1. Почитай один из моих ответов этой ветке про FieldByName
    Спасибо, но не понятно при чем тут FieldByName?
    Про FieldByName.
    Ссылки на поля Fields наборов в новой версии перекладываются в TStrings.Objects. Возможно в твоем случае frxDBSet.pas поможет, если он отличается от того что в 3.04. Поскольку я столкнулся с тем что эти ссылки не всегда указывают туда куда надо (при каждом переоткрытии набора Fields пересоздается), мне пришлось явно прописать, чтобы данные брались из полей набора. Стало намного стабильнее. Подождем 3.05 может ещё чего исправили.
  • отредактировано 11:36
    Подскажите, как быть?

    В отчёте используется подзапрос сделанный на frxADOQuery. Причём выборка должна идти из временных таблиц текущего подключения. В версии 2.51 была возможность выбирать одно из подключений проекта в качестве подключения frxADOQuery. В версии 3.03 это сделать нельзя.

    Почему столь удобный функционал был убран?
  • отредактировано 11:36
    Ejik написал:
    Подскажите, как быть?

    В отчёте используется подзапрос сделанный на frxADOQuery. Причём выборка должна идти из временных таблиц текущего подключения. В версии 2.51 была возможность выбирать одно из подключений проекта в качестве подключения frxADOQuery. В версии 3.03 это сделать нельзя.

    Почему столь удобный функционал был убран?
    DefaultDataBase задай. Если надо несколько коннектов передавать пиши свои компоненты.
  • APSAPS
    отредактировано 11:36
    Натолкнулся на странное поведение.
    Есть некая форма. На форме лежит frxReport, frxDesigner, frxDBDataset, frxPreview. Во время выполнения показывается preview отчета. Далее:
    1. Нажимаем F4: загружается дизайнер с отчетом;
    2. Нажимаем F4: дизайнер перерисовывается (такое впечатление, что пересоздаётся), на этот раз с пустым отчетом (на странице не видно ни одного компонента), также исчезает информация по свойствам;
    3. Это новое окно невозможно закрыть по "x" и не работает пункт меню Exit;
    4. Нажимаем еще раз в этом окне F4 и получаем окно Preview, которое можно закрыть, после чего возвращаемся в вызывающую форму;

    Используется: D5, FR 3.04.

    ЗЫ. Ради интереса проверил это же на демке от 3.04. Аналогичное поведение после нажатия кнопки Design и F4 в дизайнере.
    ЗЫЫ. Ради такого же интереса проверил то же на демке от 3.0 alpha 8. Не наблюдается.

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

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