Господа разработчики, пожалуйста, переставьте одну строку в коде
Уважаемые разработчики, я уже писал об этом баге здесь.
(а также здесь), здесь, а также в "стандартном" баг-репорте.
Пожалуйста, в модуле frxCustomDB, в определении класса TfrxDBLookupComboBox в секции published, разместите свойства ListField и KeyField после свойства DataSetName.
Чтобы секция published стала выглядеть вот так:
Далее - подробное описание бага.
(а также здесь), здесь, а также в "стандартном" баг-репорте.
Пожалуйста, в модуле frxCustomDB, в определении класса TfrxDBLookupComboBox в секции published, разместите свойства ListField и KeyField после свойства DataSetName.
Чтобы секция published стала выглядеть вот так:
TfrxDBLookupComboBox = class(TfrxDialogControl)
...
published
property AutoOpenDataSet: Boolean read FAutoOpenDataSet write FAutoOpenDataSet default False;
property DataSet: TfrxDBDataset read FDataSet write SetDataSet;
property DataSetName: String read GetDataSetName write SetDataSetName;
property ListField: String read GetListField write SetListField;
property KeyField: String read GetKeyField write SetKeyField;
property DropDownWidth: Integer read GetDropDownWidth write SetDropDownWidth;
property DropDownRows: Integer read GetDropDownRows write SetDropDownRows;
property OnClick;
property OnDblClick;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
Далее - подробное описание бага.
Комментарии
Описание ошибки:
При использовании TfrxDBLookupComboBox, когда в качестве поля ListField используется поле источника данных с алиасом, отличным от имени поля набора данных (например, "Компания" вместо "Company"), выбрасывается ошибка "Поле не найдено":
- при вызове метода TfrxReport.ShowReport() - через короткий промежуток после начала просмотра отчета
- при вызове метода TfrxReport.DesignReport() - после завершения просмотра отчета
Способ воспроизведения:
1. В папке \Demos\Main находим проект FRDemo.dpr, открываем.
2. Открываем Unit2.pas, находим CustomersDS. Вызываем "Edit Field Aliases..."
Для поля "Customer" задаем алиас "Компания", жмем ОК.
3. Сохраняем, компилируем, запускам приложение.
4. В деревце с отчетами открываем папку "Dialogs and script".
Выбираем отчет "Hello FastReport", жмем кнопку Design.
5. Меню - Отчет - Данные - ставим галку "Customers", жмем ОК.
6. Открываем форму диалога DialogPage1.
На форму бросаем DBLookupComboBox, настраиваем его свойства:
Запускам, видим, видим, что DBLookupComboBox работает, жмем ОК, наблюдаем preview, закрываем Preview - все ОК.
Меняем значение ListField.
Запускам, видим, видим, что DBLookupComboBox работает, жмем ОК, наблюдаем preview, закрываем Preview - получаем Exception.
Сохраняем отчет (Ctrl+S), закрываем дизайнер, жмем Preview, видим, что DBLookupComboBox работает, жмем ОК, наблюдаем Exception на фоне Preview.
Причина:
Модуль unit frxCustomDB;
При десериализации объекта TfrxDBLookupComboBox свойство ListField записывается/восстанавливается раньше, чем свойство DataSet.
Поэтому код
- не выполнит преобразования алиаса в физическое имя поля, и свойству ListField внутреннего компонента FDBLookupComboBox в нашем случае будет присвоено значение "Компания" (вместо "Company").
Багофикс:
Все, что нужно сделать - поменять порядок описания членов класса TfrxDBLookupComboBox в секции Published: - свойства KeyField и ListField разместить после свойства DataSetName;
Секция published теперь должна выглядеть так:
Код:
Совершенно непонятно, что мешает сделать такое исправление.
и каждый раз я им об этом пишу... кое что правда исправляют.. но очень редко.
Все будет исправлено в новой сборке