vladmal
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Delphi 2007, FastReport 4.9.60 Описание бага + багофикс. ============================= Описание ошибки: При использовании 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, настраиваем его свойства: AutoOpenDataSet = "True"; DataSet = "Customers"; KeyField = "Cust No"; ListField = "Phone"; Запускам, видим, видим, что DBLookupComboBox работает, жмем ОК, наблюдаем preview, закрываем Preview - все ОК. Меняем значение ListField. ListField = "Компания"; Запускам, видим, видим, что DBLookupComboBox работает, жмем ОК, наблюдаем preview, закрываем Preview - получаем Exception. Сохраняем отчет (Ctrl+S), закрываем дизайнер, жмем Preview, видим, что DBLookupComboBox работает, жмем ОК, получаем наблюдаем Exception на фоне Preview. Причина: ============================= При десериализации объекта TfrxDBLookupComboBox свойство ListField записывается/восстанавливается раньше, чем свойство DataSet. Поэтому код Код: procedure TfrxDBLookupComboBox.SetListField(Value: String); begin if FDataSet <> nil then Value := FDataSet.ConvertAlias(Value); FDBLookupComboBox.ListField := Value; end; | - не выполнит преобразования алиаса в физическое имя поля, и свойству ListField внутреннего компонента FDBLookupComboBox в нашем случае будет присвоено значение "Компания" (вместо "Company"). Багофикс: ============================= Все, что нужно сделать - поменять порядок описания членов класса TfrxDBLookupComboBox в секции Published: - свойство KeyField разместить после свойства DataSetName; Секция published теперь должна выглядеть так: Код: 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; | ============================== Это все . | Всего записей: 10 | Зарегистр. 26-08-2004 | Отправлено: 05:30 13-05-2010 | Исправлено: vladmal, 05:37 13-05-2010 |
|