LazReport
Модератор: Модераторы
дайте тест проект
нужен совет:
основой отчета служат три запроса при этом любой из них может быть пустым, или два из трех пустые
вопрос : как сделать чтоб на месте данных из пустого запроса отображался следующий "непустой";
будет ли отображаться шапка пустого запроса ?
прошу прощения, если вопрос покажется не совсем понятным
основой отчета служат три запроса при этом любой из них может быть пустым, или два из трех пустые
вопрос : как сделать чтоб на месте данных из пустого запроса отображался следующий "непустой";
будет ли отображаться шапка пустого запроса ?
прошу прощения, если вопрос покажется не совсем понятным
Композитный отчет?
ну я б так не сказал,
отчет один, никакие другие он в себя не включает
хотя, это может быть идеей ..
отчет один, никакие другие он в себя не включает
хотя, это может быть идеей ..
Ошибка!!!
В модуле LR_Class на строке 11658 - tkFloat : SetFloatProp(aObj,Prop,StrToFloat(aValue));
вылазит ошибка "EConvertError" c сообщением "1.5 is an invalid float".
Предыстория: В дизайнере добавляю объект Barcode, делаю настройку и устанавливаю свойство ZOOM в значение "1,5" (именно запятая иначе не дает) сохраняю отчет,
а при открытии отчета валится выше описанная ошибка.
Решил это дело таким способом (наверное не очень красивым, но у мну работает
) -
tkFloat: SetFloatProp(aObj,Prop,StrToFloat(StringReplace(StringReplace(aValue, ',', FormatSettings.DecimalSeparator, [rfReplaceAll, rfIgnoreCase]), '.', FormatSettings.DecimalSeparator, [rfReplaceAll, rfIgnoreCase])));
Разделителем в региональных настройках стоит запятая.
В модуле LR_Class на строке 11658 - tkFloat : SetFloatProp(aObj,Prop,StrToFloat(aValue));
вылазит ошибка "EConvertError" c сообщением "1.5 is an invalid float".
Предыстория: В дизайнере добавляю объект Barcode, делаю настройку и устанавливаю свойство ZOOM в значение "1,5" (именно запятая иначе не дает) сохраняю отчет,
а при открытии отчета валится выше описанная ошибка.
Решил это дело таким способом (наверное не очень красивым, но у мну работает
tkFloat: SetFloatProp(aObj,Prop,StrToFloat(StringReplace(StringReplace(aValue, ',', FormatSettings.DecimalSeparator, [rfReplaceAll, rfIgnoreCase]), '.', FormatSettings.DecimalSeparator, [rfReplaceAll, rfIgnoreCase])));
Разделителем в региональных настройках стоит запятая.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
ssadragon, это проблема как раз вашей программы, а не LazReport. Приведение формата чисел к региональным настройкам задача для приложения, а не компонента.
Padre_Mortius Может тогда подскажете как мне можно повлиять на данную ситуацию, чтобы данная ошибка впредь не имела место. 
alexs, хм я ж написал "свойство ZOOM в значение "1,5" (именно запятая иначе не дает)"
В инспекторе объектов дизайнера в свойстве ZOOM дает ставить и запятую и точку, но при применении этого свойства (например нажатием ENTER) со значением с точкой ругается Invalid float, со значением с запятой применяет, объект штрихкода зуммируется все сохраняется, но при просмотре отчета ошибка Invalid float.
При двойном нажатии на объекте появляется окно "Редактор штрих-кода". В этом окне свойство "Масштаб" по умолчанию имеет значение "1,0", но поставить запятую юзеру вообще не дает, только точку и при нажатии на ОК не происходит зуммирование компонента BARCODE, а при повторном открытии этого окна (двойным кликаньем на компоненте) свойство "Масштаб" установлено в "1,0". И все повторяется как и в прошлом варианте "со значением с запятой применяет, объект штрихкода зуммируется все сохраняется, но при просмотре отчета ошибка Invalid float."
В инспекторе объектов дизайнера в свойстве ZOOM дает ставить и запятую и точку, но при применении этого свойства (например нажатием ENTER) со значением с точкой ругается Invalid float, со значением с запятой применяет, объект штрихкода зуммируется все сохраняется, но при просмотре отчета ошибка Invalid float.
При двойном нажатии на объекте появляется окно "Редактор штрих-кода". В этом окне свойство "Масштаб" по умолчанию имеет значение "1,0", но поставить запятую юзеру вообще не дает, только точку и при нажатии на ОК не происходит зуммирование компонента BARCODE, а при повторном открытии этого окна (двойным кликаньем на компоненте) свойство "Масштаб" установлено в "1,0". И все повторяется как и в прошлом варианте "со значением с запятой применяет, объект штрихкода зуммируется все сохраняется, но при просмотре отчета ошибка Invalid float."
Здрасте!!!
Эт опять я.
Вообщем нашел где в модуле (LR_Class) косяк (на мой взгляд).
В функции GetSaveProperty (что на 11634 строке) происходит такая фигня:
Что на мой взгляд не есть хорошо. Ну например у меня многопоточное приложение и в этот самый момент я тоже начинаю обращаться к DecimalSeparator`у и мой поток ловит "is an invalid float" (ну или что-нибудь др., в общем не очень хорошо будет).
Моё решение выглядит след. образом:
Добавил переменную (в Var s: String;), ну так чтоб не громоздить. Удаляю на всякий случай разделитель групп разрядов. Меняю региональную настройку на точку (раз она так нужна).
А при восстановлении (в функции RestoreProperty (что на 11685 строке того же модуля)) проделываю примерно все также в обратную сторону:
Ну вот как бы моё решение, сильно не пинайте, но мне кажется оно будет логичнее, ну и без "is an invalid float".
Вообщем нашел где в модуле (LR_Class) косяк (на мой взгляд).
В функции GetSaveProperty (что на 11634 строке) происходит такая фигня:
Код: Выделить всё
tkFloat: begin
OldSep := DecimalSeparator;
DecimalSeparator := '.';
Result := FloatToStr(GetFloatProp(aObj,Prop));
DecimalSeparator := OldSep;
end;
Что на мой взгляд не есть хорошо. Ну например у меня многопоточное приложение и в этот самый момент я тоже начинаю обращаться к DecimalSeparator`у и мой поток ловит "is an invalid float" (ну или что-нибудь др., в общем не очень хорошо будет).
Моё решение выглядит след. образом:
Код: Выделить всё
tkFloat: begin
s := FloatToStr(GetFloatProp(aObj,Prop));
s := StringReplace(s, ThousandSeparator, '', [rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(s, DecimalSeparator, '.', [rfReplaceAll, rfIgnoreCase]);
end;
Добавил переменную (в Var s: String;), ну так чтоб не громоздить. Удаляю на всякий случай разделитель групп разрядов. Меняю региональную настройку на точку (раз она так нужна).
А при восстановлении (в функции RestoreProperty (что на 11685 строке того же модуля)) проделываю примерно все также в обратную сторону:
Код: Выделить всё
tkFloat: begin
s := StringReplace(aValue, '.', DecimalSeparator, [rfReplaceAll, rfIgnoreCase]);
SetFloatProp(aObj,Prop,StrToFloat(s));
end;
Ну вот как бы моё решение, сильно не пинайте, но мне кажется оно будет логичнее, ну и без "is an invalid float".
alexs писал(а):LazReport абсолютно не многопоточный.
А я и не пишу что LazReport многопоточный, я пишу
Ну например у меня многопоточное приложение...
alexs писал(а):В нём куча плохого кода.
Ну а вы как-то можете посодействовать продвижению моего фикса в Trunk LazReport`a.
Как я понял вас там уже знают.
Собственно, вопрос не совсем по Lazreport`у... Вроде бы попадалась информация - но что то не найду...
Итак, как можно скомпилировать проект, что бы репорты были в исполняемом файле, и как к ним потом добраться. В Delphi был редактор русурсов, а как в Lazarus это делается?
Итак, как можно скомпилировать проект, что бы репорты были в исполняемом файле, и как к ним потом добраться. В Delphi был редактор русурсов, а как в Lazarus это делается?
Ну как бы создай для каждого репорта свой TFRReport и размести на форме, включаешь у каждого свойство StoreInForm и все сохранится в ресурсе формы, потом просто вызываешь нужный.
SeZuka, Благодарю!
