Решил перенести сюда информацию от Chaosbringer...
На текущий момент
1. Не все отчеты из демоверсии корректно экспортируются в Excel
через ole (Особенно отчета с RichText, Диаграммой и сохраняемыми гурппами)
2. Окошко инспектора объектов не убирается как в прошлых версиях в полоску, при двойном щелчке по заголовку окна
3. После нескольких выполнений отчета "отказался" работать "Выход"
из дизайнера.
4. Куда то делись cross header, cross data, cross footer Оставленный вариант не вседа подходит.
5. Как то странно работает отладчик: отрабатывает сразу несколько строчек за раз.
6. Теперь необходимо все переменные объявлять?
7. При "вырезании" бенда с мемками на нем и последующей вставке мемки съезжали со своих мест. Пару раз поймал подобный эффект пр переключении между страницами.
8. При использовании отступа в мемо(параграфа) буквы заезжают за правую границу мемки если стоит выравнивание по ширине
Пока все
З.Ы.
Функция str уже не входит в словарь скриптового языка?
1) В инспекторе обьектов дизайнера нет очень удобной особенности - как в Дельфи - если я раскрыл какое-нибудь свойство Frame у одного обьекта Memo, задал необходимые параметры и затем переключился на другой обьект Memo - свойство Frame должно оставаться раскрытым в инспекторе.
А так мне приходится открывать его снова и снова для каждого обьекта.
Тогда я попробовал выделить несколько обьектов Memo, чтобы задать для них Frame одним махом - но не тут-то было! Это свойство исчезает, если выделено более одного обьекта Memo!
То есть нужно, чтобы:
- свойства не сворачивались
- свойства не исчезали при выделении нескольких обьектов
2) При выборе курсора для обьекта неплохо сразу видеть его изображение, как в Дельфи
3) Много непонятных свойств. Нужна хоть какая-нибудь дока. Пусть сырая, на английском, в виде текстовых файлов - все равно...
Первое впечатление КЛАССНО!
Второе, будем смотреть .
Теперь вопрос:
Может чего не понял, но в демке если бросил бэнд, то переместить его выше/ниже уже не могу. Может я чего не понял, или это баг?
1) Проверил оба отчета - вполне корректно.
2) Это и не нужно - интерфейс с докингом.
3) Как повторить эффект?
4) cross bands нет и не будет - все что нужно делает объект TfrxCrossView.
5) Пример?
6) Все что используется необходимо объявлять.
7,8) да, будем лечить.
вместо ф-и Str - IntToStr, FloatToStr
Volm:
1) да, нет - но я и не старался скопировать всю функциональность делфийского инспектора.
2) делать было уже лень
3) как раз английской доки пока нет, есть русская, но в практически нечитабельном виде.
Может чего не понял, но в демке если бросил бэнд, то переместить его выше/ниже уже не могу. Может я чего не понял, или это баг?
Бэнды размещаются согласно своему назначению (группа header-бэндов - вверху, footer-внизу, data - посередине). Если не нравится - в View|Options надо включить Free bands placement.
1) Я у себя в проекте в качестве DataSet использую только наследников от TClientDataSet (TVClientDataSet)
И вот значит я положил на форму такого наследника, повесил на него TfrxDBDataSet и запустил дизайнер.
Могу ли я своему компоненту TVClientDataSet из дизайнера (в модуле кода) менять свойства, открывать, закрывать и т.д.
Или мне его нужно заворачивать в FastReport-wrappers и регистрировать, как это сделано например с ADODataSet ?
2) Не смог из дизайнера изменить значение переменной (frVariables), например <var1> := '1'
Я этого просто делать не умею, или это невозможно?
(хотя я конечно могу завести глобальную переменную в модуле кода, написав
var
v1:string;
begin
v1 := '1';
end.
но все же хотелось бы знать - frVariables меняются из дизайнера (из скрипта)?
)
1) К своему датасету обращаться не обязательно - все что нужно есть у TfrxDBDataset:
{: Объект, предназначенный для навигации по набору данных. Является
: базовым для компонентов TfrxDBDataSet, TfrxUserDataSet. }
TfrxDataSet = class(TfrxDialogComponent)
public
{: Открывает набор данных. }
procedure Open; virtual;
{: Закрывает набор данных. }
procedure Close; virtual;
{: Устанавливает указатель на первую запись в наборе данных. Если
: свойство RangeBegin установлено в rbCurrent, то указатель
: устанавливается на запись, которая была текущей при начале
: работы с набором данных. }
procedure First; virtual;
{: Перемещает указатель на следующую запись в наборе данных. }
procedure Next; virtual;
{: Перемещает указатель на предыдущую запись в наборе данных.
: Этот метод используется только при печати групп. }
procedure Prior; virtual;
{: Функция возвращает истину, если достигнут конец набора данных. }
function Eof: Boolean; virtual;
{: Функция возвращает количество полей, определенных в наборе данных. }
function FieldsCount: Integer; virtual;
{: Функция возвращает True, если набор данных имеет поле с заданным именем. }
function HasField(const fName: String): Boolean;
{: Функция возвращает True, если набор данных имеет поле с заданным именем
: и это поле типа BLOb. }
function IsBlobField(const fName: String): Boolean; virtual;
{: Метод возвращает список полей набора данных. }
procedure GetFieldList(List: TStrings); virtual;
{: Возвращает значение указанного поля в виде форматированной строки. }
property DisplayText[Index: String]: String read GetDisplayText;
{: Возвращает размер данных в указанном поле. }
property DisplayWidth[Index: String]: Integer read GetDisplayWidth;
{: Возвращает тип указанного поля. }
property FieldType[Index: String]: TfrxFieldType read GetFieldType;
{: Возвращает значение указанного поля. }
property Value[Index: String]: Variant read GetValue;
{: Определяет, надо ли закрывать таблицу БД после работы с ней.
: Значение по умолчанию - False. }
property CloseDataSource: Boolean read FCloseDataSource write FCloseDataSource default False;
{: Определяет, надо ли открывать таблицу БД перед началом работы с ней.
: Значение по умолчанию - True. }
property OpenDataSource: Boolean read FOpenDataSource write FOpenDataSource default True;
{: Возвращает текущий номер записи. Первая запись имеет номер 0. }
property RecNo: Integer read FRecNo;
{: Обработчик этого события вызывается при закрытии набора данных. }
property OnClose: TNotifyEvent read FOnClose write FOnClose;
{: Обработчик этого события вызывается при открытии набора данных. }
property OnOpen: TNotifyEvent read FOnOpen write FOnOpen;
published
{: Определяет, надо ли показывать этот набор данных в отчете. }
property Enabled: Boolean read FEnabled write FEnabled default True;
{: Определяет начальную точку при навигации по набору данных. }
property RangeBegin: TfrxRangeBegin read FRangeBegin write FRangeBegin default rbFirst;
{: Определяет конечную точку при навигации по набору данных. }
property RangeEnd: TfrxRangeEnd read FRangeEnd write FRangeEnd default reLast;
{: Определяет максимальное количество записей в наборе, по которым
: будет осуществляться навигация. При этом свойство RangeEnd должно
: быть установлено в reCount./n
: Например, для просмотра первых 20 записей надо установить
: RangeBegin = rbFirst, RangeEnd = reCount и RangeEndCount = 20. }
property RangeEndCount: Integer read FRangeEndCount write FRangeEndCount default 0;
{: Пользовательское имя (псевдоним) набора данных. Под этим именем набор
: будет показываться в отчете. }
property UserName: String read FUserName write SetUserName;
{: Обработчик этого события вызывается для проверки, не достигнут
: ли конец набора данных. }
property OnCheckEOF: TfrxCheckEOFEvent read FOnCheckEOF write FOnCheckEOF;
{: Обработчик этого события вызывается при перемещении на первую запись
: набора данных. }
property OnFirst: TNotifyEvent read FOnFirst write FOnFirst;
{: Обработчик этого события вызывается при перемещении на следующую запись
: набора данных. }
property OnNext: TNotifyEvent read FOnNext write FOnNext;
{: Обработчик этого события вызывается при перемещении на предыдущую запись
: набора данных. Это используется только при печати групп. }
property OnPrior: TNotifyEvent read FOnPrior write FOnPrior;
end;
{: Представляет собой пользовательский набор данных. Компонент удобен для
: навигации по таким объектам, как массив, файл данных, содержимое
: TStringGrid и пр. Для навигации по такому набору надо определить
: обработчики событий OnFirst, OnNext, OnPrior, OnCheckEOF компонента. В
: большинстве случаев можно просто указать диапазон навигации с помощью
: свойств RangeBegin, RangeEnd, RangeEndCount. Текущая позиция указателя
: доступна с помощью свойства RecNo. }
TfrxUserDataSet = class(TfrxDataset);
{: Базовый объект для источников данных, подключаемых к БД. }
TfrxCustomDBDataSet = class(TfrxDataSet)
published
property CloseDataSource;
{: Список пользовательских имен (псевдонимов) для полей набора данных.
: Список имеет вид/n
: ИмяПоля1=Псевдоним1/n
: ИмяПоля2=Псевдоним2 ... }
property FieldAliases: TStrings read FAliases write SetFieldAliases;
{: Ссылка на набор данных, являющийся главным по отношению к данному
: набору (для связей типа master-detail). Связанные поля необходимо
: задать в свойстве MasterFields. }
property Master: TfrxCustomDBDataSet read FMaster write FMaster;
{: Список связанных полей (для связей типа master-detail).
: Список имеет вид ИмяПодчиненногоПоля=ИмяГлавногоПоля;... }
property MasterFields: String read FMasterFields write FMasterFields;
property OpenDataSource;
property OnClose;
property OnOpen;
end;
{: Компонент предназначен для навигации по набору данных, основанному
: на таблице БД. Для связи с таблицей служит свойство DataSource, которое
: подключается к связке TDataSource -> TDataSet, либо аналогичное свойство
: DataSet. В качестве набора данных можно использовать любой потомок
: TDataSet (TTable, TQuery и пр). }
TfrxDBDataset = class(TfrxCustomDBDataset)
published
{: Источник данных - TDataSet. }
property DataSet: TDataSet read FDataSet write SetDataSet;
{: Источник данных - связка TDataSource -> TDataSet. }
property DataSource: TDataSource read FDataSource write SetDataSource;
end;
2) Если переменная объявлена в словаре (т.е. это не совсем переменная - а скорее вычисляемая ф-я), то установить ее значение из скрипта можно только методом Set(varname, varvalue). Если переменная скриптовая - менять значение можно обычным способом.
1) ==================================
За интерфейс компонента спасибо, но если бы еще строчку-другую примеров...
Например вот такие строчки вызывают ошибки в скрипте:
<frxDBDataset1>.close;
<frxDBDataset1.close>;
Причем ошибки "; expected"...
а на строчку
frxDBDataset1.close;
ругается "undeclared identifier 'frxDBDataset1'"
2) ==================================
У меня в словаре заведена переменная <StringParam_ParamTwo> со значением 'aaaaaaaaa'
Есть на бэнде обьект Memo1 со значением [StringParam_ParamTwo]
В его событии OnBeforePrint я пишу:
procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
set(<StringParam_ParamTwo>, 'zzzzzzzzzzzzzz');
end;
1) По поводу угловых скобок разъяснения будут даны в документации. Коротко - они нужны для обращения к переменным из словаря, специальным переменным типа Page#, и полям БД.
К датасету frxDBDataset1 можно обратиться так:
var frxDBDataset1: TfrxDataSet;
frxDBDataset1 := Report.GetDataset('frxDBDataset1');
frxDBDataset1.close
Огромное спасибо! Заработало!
Единственно, о чем стоит помнить, при задании строковых значений в переменных словаря, - нужно явно указывать кавычки.
Выражение
set('StringParam_ParamTwo', 'zzzzzzzzzzzzzz');
не прошло - при выполнении ругалось, на неизвестный обьект с именем zzzzzzzzzzz
Не ругается, если написать так:
set('StringParam_ParamTwo', '''zzzzzzzzzzzzzz''');
И будет ругаться даже если написать так:
var
s:string;
begin
s := 'qwe';
set('StringParam_ParamTwo', s); // ошибка - неизвестный обьект qwe
end;
зато не ругается, если написать
s1 := 'qwe';
s2 := '''' + s1 + '''';
set('StringParam_ParamTwo', s2);
Итак, после двух часов испытаний становится ясно, что программирование в скриптах ограничено теми классами и их свойствами/методами, которые явно прописаны в скриптовом движке.
Как пример - в скрипте можно завести переменную типа TAdoQuery и TADOTable, но нельзя TADODataSet - не знает скриптовый движок такого...
Однако, то, что есть - уже неплохо! Например можно писать так:
var
fds:TfrxDBDataSet;
aq:TADOQuery;
begin
//цепляемся к внешнему TfrxDBDataSet
fds := TfrxDBDataSet(Report.GetDataSet('frxDBDataset1'));
// вытаскиваем из него реальный внешний датасет
aq := TADOQuery(fds.DataSet);
// у внешнего датасета изменяем те свойства и выполняем те методы, о которых знает скриптовый движок
aq.sql.text := 'select top 10 * from dat_countries';
aq.open;
end. // дальше пойдет прокрутка отчета...
=============================================================================
Собственно мои проблемы достаточно просты - я хочу конечному пользователю дать возможность
строить себе отчеты в дизайнере, предварительно создав в памяти нужное ему количество датасетов.
(он описывает нужные ему датасеты в специальном конструкторе, откуда затем вызывает дизайнер отчетов)
Сами датасеты являются наследниками от TClientDataSet, поскольку мой конечный пользователь может находиться
далеко от сервера БД и общаться с ним по HTTP посредством всем известного MIDAS (DataSnap).
Далее, уже в скрипте, в дизайнере, перед прокруткой отчета, пользователь может поместить в датасеты
нужные запросы, задать между ними отношения master-detail и открыть датасеты
И вот тут нужен доступ к свойству 'CommandText' компонента TClientDataSet, который пока фастрепорту
неизвестен.
Как вариант, можно в наследнике TClientDataSet'a реализовать свойство SQL, как в TQuery, и затем уже в
скрипте обращаться к этому датасету, как к TQuery, чтобы иметь доступ к тексту запроса, но это
как-то кривовато на мой взгляд...
Я вообще считаю, что компонент TClientDataSet годится на все случаи жизни, может работать
как локально так и удаленно, причем с любыми реальными датасетами (BDE, ADO и т.д.)
Поэтому грустно осознавать отсутствие поддержки этого компонента в FastReport
=============================================================================
Но - ничего страшного...
ФастРепорт - система открытая и позволяет подключать новые компоненты (Огромное спасибо автору!)
Отсюда вопрос: можно ли надеяться на появление в ФастРепорте компонента TClientDataSet
(пусть даже не на палитре внутренних компонентов, а просто как известный внутри скриптового движка класс)
Поскольку мне это нужно в первую очередь (устройство моего конструктора будет зависеть от наличия TClientDataSet в ФастРепорте), я был бы очень рад, если бы Вы позволили мне самому написать подключаемый компонент TClientDataSet на примере скажем исходников подключения TADOQuery.
Надеюсь, принципы остались в целом похожие на те, которые существовали в fr 2.x (хотя отличия наверняка есть)
========================================
Добава от 29 июня 2004г.
========================================
Решил просмотреть англоязычный форум и вот, что увидел:
Оказывается скриптовый движок готов работать ДЕЙСТВИТЕЛЬНО ПРАКТИЧЕСКИ С ЛЮБЫМИ КЛАССАМИ!
Все, что нужно сделать в коде программы на Дельфи, перед запуском отчета - написать примерно следующее:
frxReport1.Script.Parent.AddClass(TMyClass, 'TMyClass')
После этого в коде скрипта я уже могу заводить переменные класса TMyClass
Причем frxReport1.Script - это скрипт конкретно репорта frxReport1
а frxReport1.Script.Parent - это глобальный скрипт для всех репортов Вашего приложения и лучше классы добавлять туда, так как например сколько я не добавлял класс TfrxReportOptions в конкретный репорт - не работало...
Так же у скриптового движка существует много других интересных методов (где ты, документация!!!!), которые впрочем можно увидеть и в Дельфи, набирая точку после frxReport1.Script
- например AddForm или AddComponent...
Так что дерзайте...
Ну и мои проблемы с обработкой в скрипте наследников TClientDataSet теперь вроде решены...
Еще одна мелочь - я занимаюсь правкой скрипта в дизайнере и периодически запускаю отчет на превью.
После закрытия превью я ожидаю снова увидеть свой скрипт, чтобы продолжить его исправлять - ан нет... Вижу макет страницы - и снова тащу мышь через весь экран, переключаюсь на страницу скрипта.
Рука уже болит (особенно правая...)
1) fs6.dpk(70) Fatal: Unit fs_iibxrtti was compiled with a different version of
IBDatabase.TIBDatabase (IBX 6.08 with IB7 support). Также если уж дистрибутив
включает скомпилированные BPL (спасибо за разделение на Design/Runtime!), то
надо бы еще и DCP (для Delphi).
2) Кажется это дельфийский глюк, но все же неприятно, когда подсказки
инспектора остаются поверх любых окон (даже поверх окон других программ) когда
мышка уходит из дизайнера.
3) при изменении размера области страницы в дизайнере не обновляется значение
масштаба. Например, выставляем масштаб "По ширине" (страница "вписывается" в
область). Теперь растягиваем в ширину инспектор. Страница не помещается в
отведенную ей область, но значение списка "масштаб" по прежнему с гордостью
гласит о том, что установлен масштаб "по ширине". При этом для того, чтобы
вписаться в отведенную область нужно выбрать любой другой масштаб, а потом
вернуться на "По ширине".
4) В дизайнере, который открывается при нажатии кнопки "Edit page" в Preview, в
отличие от версий 2.x есть кнопка "Предварительный просмотр", при нажантии на
которую ничего не происходит.
5) В стандартном окне предварительного просмотра не работает клавиши Esc.
Понятно, что закрыть можно и по Alt+F4, но в 2.х работала и Esc.
6) Мне кажется, что процедура создания dot-matrix отчета слишком хорошо
спрятана . Во всяком случае когда ко мне попала восьмая альфа-версия для меня
оказалось более простым изменить в XML значение DotMatrixReport="False" на
DotMatrixReport="True" чем догадаться создать новый отчет через меню "Файл".
7) Идем на закладку "Code" и меняем язык, скажем, на C++Script, соглашаемся с
предупреждением. Теперь жмем кнопку "Новый отчет", опять идем на закладку Code
и наслаждаемся текстом "begin ... end" на языке C++Script. Кстати, после замены
всего текста на пустышку для выбранного языка вначале появляется пустая строка.
8) Опять же как и в пункте 3 в Preview при изменении масштаба текущей номер
сраницы не обновляется. Хотя вообще-то он и не должен меняться, т.к. при
изменении масштаба в Preview я бы хотел остаться на той странице, на которой и
был (например ZoomIn на _заинтеремовавшей_ меня странице)
9) Хорошая вещь алиасы имен полей. Однако, IMHO, поиск поля должен
производиться как по алиасам, так и по оригинальному имени (особенно если
учесть следующий пункт).
10) Если перетянуть имя поля на страницу отчета, то изменить текст
получившегося Memo НЕВОЗМОЖНО! Не работает ни поиск и замена,
ни _ЛЮБОЙ_ другой способ изменить текст поля (включая двойной щелчок/правка/ОК),
кроме выбора нового имени из выпадающего списка, который появляется при
наведении мышки на Memo.
11) При повторном вызове диалога "Заменить" строка поиска содержит
предыдущее значение, а строка замены очищается...
12) В диалоге сохранения скрипта, который появляется при нажатии на дискетку в
окне кода, список типов включает ТОЛЬКО "*.pas" и "*.js" (не считая "All
files").
13) Может что-то неправильно делал, но в тестовом приложении (см. ниже) при
нажатии на кнопку Export в Preview ничего не происходит.
14) НЕ РАБОТАЕТ КОМПРЕССИЯ. Галочку Compressed в инспекторе выставляю, но
результат нулевой. Если переключиться на другой объект, а потом вернуться на
Report, то галочка будет снята (Compressed=false)
15) Если удалить страницу, на которую ссылался SubReport, а потом сделать Undo
(вернуть удаленное), то при формировании отчета получим Access violation
16) Желательно вторичные формы дизайнера по умолчанию выводить по центру
главного дизайнерского окна (сейчас большинство выходят за пределы экрана).
17) В SyntaxMemo нажатие Ctrl+BackSpace приводит к замене символа слева от
курсора на какой-то символ (отображается в виде квадрата)
18) Lookup поля не поддерживаются??? :-\
19) У DBLookupComboBox нет свойства ListSource, так что ListField выбирается из
того же DataSet-а, что и KeyField.
20) Неправильно отрабатывает сдвиг ниже расположенных объектов при растягивании
бендов, если этот объект не привязан ни к одному бенду.
21) Рисование и позиционирование кнопки, которая появляется при наведении мышки
на поле бенда XXXXXData долдно учитывать масштаб (например при масштабе 25%
кнопку даже нажать невозможно, т.к. она исчезает при выходе за пределы Memo).
22) ParagraphGap допускает отрицательное значение. Первая строка при этом,
есно, уходит за пределы Memo. IMHO, более правильно было бы оставить первую
строку на нулевой позиции, а к левому краю всех последующих прибывить
ABS(ParagraphGap). Это дало бы возможность делать абзацы, в которых первая
строка не имеет отступа, а все последующие имеют.
23) А куда делся MasterHeader?
24) Когда мышка уходит за границы области печати страницы вставляемый в данный
момент объект (его рамка) исчезает. Это составляет определенные трудности,
особенно если учесть выравнивание по сетке. IMHO, нужно оставлять вставляемый
объект прижатым к границе области печати.
25) Когда для бенда установлено кол-во столбцов отличное от одного а для Memo
стоит Align=baWidth, то текст разных столбцов накладывается друг на друга. По
идее Align должен работать в пределах столбца. Также неплохо было бы автоматом
расчитывать ширину столбца, если пользователь не ввел _свое_ значение.
26) Надо бы сделать контроль вводимых значений в инспекторе. Например при вводе
PageHeight=9999999999999999999999999999999999 получил "Invalid floating point
operation" а в инспекторе PageHeight=1E34. После этого указанный эксепшн
возникал при каждой отрисовке страницы в дизайнере. Благо после беспроблемного
исправления значения в инспекторе все наладилось. Вообще не должны приниматься
абсурдные значения типа PageWidth=-21 (кстати, отрицательное значение принялось
даже без эксепшена). :-\
Еще присоединяюсь к вопросу о версии для C++Builder...
Кое-какие подробности по пункту 15:
<span style='font-family:Courier'>
Call stack of main thread
Procedure / arguments Called from
frx6.Frxclass::TfrxReportPage::IsSubReport frx6.Frxengine::TfrxEngine::RunPage+23
? frx6.Frxengine::TfrxEngine::RunPage frx6.Frxengine::TfrxEngine::CheckSubReports+13F
? frx6.Frxengine::TfrxEngine::CheckSubReports frx6.0025564E
frx6.Frxengine::TfrxEngine::DoShow frx6.Frxengine::TfrxEngine::ShowBand+23
Maybe frx6.Frxengine::TfrxEngine::ShowBand frx6.00252EE9
? frx6.00252E5C frx6.0025383B
? frx6.002537E4 frx6.Frxengine::TfrxEngine::RunPage+0C2
? frx6.Frxengine::TfrxEngine::RunPage frx6.00252467
frx6.002523EC frx6.Frxengine::TfrxEngine::RunReportPages+22
frx6.Frxengine::TfrxEngine::RunReportPages frx6.0025227E
</span>
Я, конечно, могу ошибаться, но помоему проблема в следующем:
В методе Frxdesgn::TfrxDesignerForm::DeletePageCmdExecute проверятся ссылка на SubReport и, если ссылка присутствует, то делается SubReportView.Free. Однако в методе Frx6.Frxdesgn::TfrxDesignerForm::UndoCmdExecute ссылка на SubReportView для страницы восстанавливается из буфера Undo, а не прописывается новая на вновь созданный. Как следствие в методе frx6.Frxclass::TfrxReportPage::IsSubReport одет обращение по несуществующему адресу.
Более точно сказать (пока) не могу - нет времени сидеть в отладчике. Вообще-то если бы были OBJ-файлы (версия для Builder), то информации было бы больше...
2) Попробую побороть, но не уверен, что получится - когда быстро убираешь мышу, не успевает срабатывать OnMouseLeave (кстати, такое встречается и в самой винде).
4) В 3.0 запрещенные кнопки показываются, но не срабатывают.
5) Уже сделал.
6) Все будет описано в документации (которую наш народ привык не читать
9) Если определены алиасы, то обращение к полю возможно только через алиас.
10) Это потому, что у мемо (и не только у него) есть св-ва DataSet/DataField...
13) Должен быть создан хотя бы один компонент фильтра экспорта.
14) Не надо трогать Compressed, он только для информационных целей. Достаточно в диалоге сохранения отчета выбрать тип файла - Compressed report.
16) какие формы имеются в виду?
18) Нет.
19) А как же иначе?
20) Растягивание бэндов не влияет на сдвиг объектов, лежащих под бэндом.
21) Вряд ли кто-то будет работать при масштабе 25%. Поэтому такие мелочи не учитывались.
23) Вместо него и других дата-хидеров - TfrxHeader.
24) Поведение аналогично 2.х.
25) Align не учитывает ширину столбца (и не учитывал никогда).
26) Слишком муторно - для каждого св-ва делать контроль.
>Еще присоединяюсь к вопросу о версии для C++Builder...
Скоро будет.
4) В 3.0 запрещенные кнопки показываются, но не срабатывают.
IMHO, нелогично. Хоть бы отключенными делались... Хотя тебе виднее.
написал:
9) Если определены алиасы, то обращение к полю возможно только через алиас.
<skip>
10) Это потому, что у мемо (и не только у него) есть св-ва DataSet/DataField...
Вот эти два пункта в совокупности обязывают использовать алиасы либо с самого начала либо не использовать вообще (если, конечно, не рассматривать вариант ручного исправления), что по моему мнению не есть good.
написал:
13) Должен быть создан хотя бы один компонент фильтра экспорта.
Ну так как в пункте 4 - отключить...
написал:
14) Не надо трогать Compressed, он только для информационных целей. Достаточно в диалоге сохранения отчета выбрать тип файла - Compressed report.
Это как в одном анекдоте... "А низзя!"
написал:
16) какие формы имеются в виду?
У тебя какое разрешение экрана установлено? 1024х768? Угадал? Может, конечно, и нет, но дома у меня 800х600 и формы редактирования Memo, вставки выражения (Expression Editor) и какие-то еще уходили вниз и вправо, а на работе (только-что проверил) все нормально (по центру). В связи с этим сделал предположение, что "вторичные" окошки не центрируются, а выводятся с Position=poDesigned.
написал:
18) Нет.
Гы Ну и как? Отменять нормализацию базы? Или через скрипты имитировать Lookup?
написал:
19) А как же иначе?
Кхе... Ну вообще-то у Borland-а иначе задумывалось. Есть один Dataset (в нем данные) и есть второй датасет (справочник). В поле первого хранится ключ, по которому выбираются данные из второго. При этом ключ скрыт от пользователя, а вместо него на экране юзер видит описание кода (ключа). Так к чему это я... А к тому, что в какой смысл выводить список из того же датасета, с которым сейчас работаем?
Вообще глянь на дельфийский DBLookupComboBox и обрати внимание на два свойства DataSource и ListSource, а потом стоит взглянуть на то из какого из них берутся списки KeyField и ListField...
написал:
20) Растягивание бэндов не влияет на сдвиг объектов, лежащих под бэндом.
Может я чего не понимаю, но...
Создаем новый отчет (автоматом в него помещаются ReportTitle, MasterData и PageFooter). Теперь кидаем мемку на пустое место под PageFooter-ом... А теперь пробуем растянуть MasterData вниз так, чтобы PageFooter сдвинул вниз наше мемо.
написал:
21) Вряд ли кто-то будет работать при масштабе 25%. Поэтому такие мелочи не учитывались.
23) Вместо него и других дата-хидеров - TfrxHeader.
Было такое предположение. Однако может объяснишь как этот TfrxHeader поместить перед MasterData?
написал:
24) Поведение аналогично 2.х.
Сейчас специально проверил на 2.51 - не исчезает. Может я не совсем понятно объяснил... Не за границы страницы, а за границы области печати (обведена рамкой внутри самой страницы).
PS. To be continued... (пока смог только 2 часа уделить третьей версии)
1.Может демку полноценную выложите?. А то ставить не хочется не узнав, что это такое.
2. Конвертер репортев не помешал бы. просто если у тебя отчетов 2-5 ты можешь их ручками, а если 200-700 то тут уже адсткая работа.
AnDy:
>Вот эти два пункта в совокупности обязывают использовать алиасы либо с самого начала
Именно так! Вообще, в тройке все рассчитано на то, что пользователь делает отчеты не абы как, а с толком, расстановкой
>У тебя какое разрешение экрана установлено? 1024х768? Угадал?
Не угадал. 1280х1024 Эти окошки запоминают свою позицию, поэтому выводить их по центру (poScreenCenter) низзя - иначе запомненная позиция игнорируется.
> Гы Ну и как? Отменять нормализацию базы? Или через скрипты имитировать Lookup?
Использовать запросы - это гораздо эффективнее. Да и проще - пока настроишь lookup, свихнуться можно.
> Вообще глянь на дельфийский DBLookupComboBox и обрати внимание на два свойства DataSource и ListSource, а потом стоит взглянуть на то из какого из них берутся списки KeyField и ListField...
В FR3 TfrxDBLookupComboBox.DataSet = TDBLookupComboBox.ListSource. То же самое, только называется иначе.
> А теперь пробуем растянуть MasterData вниз так, чтобы PageFooter сдвинул вниз наше мемо.
Речь не о дизайнере. В данном случае page footer смещается ниже и "задевает" мемку. После этого ее родителем становится бэнд.
>Однако ведь "проблемы" начинаются и на 75%... Хотя и не критичные.
Вот-вот. Пробовал работать на 50% - жить можно.
>Было такое предположение. Однако может объяснишь как этот TfrxHeader поместить перед MasterData?
Странно ведут себя вертикальные тулбары при изменении размеров окна дизайнера, в частности тулбар с объектами. А именно, если при уменьшении размера окна дизайнера на тулбаре перестают помещаться все кнопки, то некоторые с него исчезают, становясь вообще недоступными. Более того, исчезают не последние кнопки, как ожидается, а исчезают ЧЕТНЫЕ кнопки!
Установка PreviewOptions.ZoomMode перед ShowPreparedReport ничего не меняет - отчет высвечивается в масштабе 100%. Может не тогда ставлю?
В отличии от дизайнера, у окна предварительного просмотра параметры (размер, масштаб и т.п.) не сохраняются
Если я правильно понял, то TfrxReport.OnStartReport и TfrxReport.OnStopReport это обработчики событий типа TfrxNotifyEvent. Но TfrxNotifyEvent это String[63]. Я в недоумении.
Судя по всплывающему окну 'Unregistred version of FastScript' FastScript безусловно импортируется FastRepor`том. Означает-ли это, что теперь нужно будет обязтельно приобрести FastScript?
Правильно-ли я понял: теперь, все пользовательские функции надо регестрировать в каждом экземпляре TfrxReport с помощью AddFunction?. Если так, то это очень неудобно для тех случаев когда в программе создается (в Runtime или в DesignTime) много экземпляров TfrxReport. Раньше было удобнее, один раз в программе прописал функци(ю/и) - всем репортам она доступна.
Во время работы под Delphi, в отладочное окно (Event log) "сыпется" очень много сообщений. Можно было бы решить что это издержки бета версии, но и в v2.5 было так-же. Конечно, это не нарушает нормальную работу, но сильно мешает, когда при отладке своей программы приходится пользоваться отладочным протоколом.
И еще AlexTz пишет:
написал:
В 2.52 есть возможность сохранить отчет в формате FR3.
Однако делаю следующее:
1. Гружу свой старый репорт в дизайнер v2.5
2. Сохраняю его в формате v3 (*.fr3)
3. Гружу полученный файл в v3 и получаю "Couldn't find class TfrReport"
Может что не так делаю?
AlexTz пишет:
написал:
1) У меня стандартная версия IBX, шедшая с D6up2.
Хотелось-бы получить исходники frxIBXComponents поскольку версий IBX было много, даже официальных. Поэтому, DCU не катит . Лично у меня своя версия IBX - ошибки правил.
Именно так! Вообще, в тройке все рассчитано на то, что пользователь делает отчеты не абы как, а с толком, расстановкой
Я, конечно, слышал точку зрения «сделай программу, которой сможет пользоваться даже идиот и только идиот и захочет ею пользоваться…». Однако ведь издавна в ходу принцип «…кнутом И пряником…». IMHO приучать пользователей к порядку надо ненавязчиво! Даже MS плавно переводила юзеров на NT при помощи Win9x.
написал:
Не угадал. 1280х1024 Эти окошки запоминают свою позицию, поэтому выводить их по центру (poScreenCenter) низзя - иначе запомненная позиция игнорируется.
Ну это я знаю. Другой вопрос какая позиция выбирается при первом показе, когда в реестре еще ничего не прописано?
написал:
Использовать запросы - это гораздо эффективнее. Да и проще - пока настроишь lookup, свихнуться можно.
Что-то после прочтения такого ответа у меня аж энтузиазма поубавилось… Тебе, конечно, виднее, но ведь не все программы пишутся для SQL и Client/Server! А ведь при работе, скажем, со старым добрым DBF использование запросов местами весьма непозволительная роскошь с точки зрения быстродействия…
К тому же если что-то было, а потом этого не стало (и улучшенная замена при этом отсутствует), то начинаешь как-то по-новому смотреть на выпуск новых версий...
написал:
В FR3 TfrxDBLookupComboBox.DataSet = TDBLookupComboBox.ListSource. То же самое, только называется иначе.
ОК. Согласен, что данные в FR не редактируются, а отображаются. Однако из какого ж тогда датасета мы берем ИСХОДНОЕ значение (DataField)? Из «справочника»? Так это ж уже не DBLookup, а какой-то странный компонент получается, в котором значение одного поля для одной записи отображается в Edit-е, а несколько записей второго поля отображаются при раскрытии списка…
Только сейчас досмотрел, что свойства DatdField у этого компонента вообще нет.
написал:
Речь не о дизайнере. В данном случае page footer смещается ниже и "задевает" мемку. После этого ее родителем становится бэнд.
Вот и я о том же. В 2.х было все понятно: растянул верхний бенд вниз – все, что попало в него парентится… А в FR3 как-то не понятно. С одной стороны бенды сдвигают друг друга, но «почти» не сдвигают обычные объекты.
Почему почти? А потому, что Memo в приведенном мной примере сначала все же начинает двигаться, а уже потом в один «прекрасный» момент (помоему при скачкообразном изменении размера бенда «по сетке») его владельцем становится бенд.
написал:
Вот-вот. Пробовал работать на 50% - жить можно.
Мультик такой был… Про зайца, который черепицу помогал ложить, стул чинил и вообще был на все руки мастер… У него была любимая фраза – «…и так сойдет!»
написал:
А в чем проблема? Бэнды ведь можно двигать мышой.
Sorry! Стормозил. Меня сбило с толку то, что бенды (вроде как) в третьей версии автоматом занимают свою позицию в том порядке, в котором выводятся на печать…
1) приручаем постепенно, начиная с FR1.0...
2) поправлю, если смогу.
3) в таких монстрах, как Crystal и RB, вообще с самого начала людей к запросам приручили. И ничего...
4) в этом плане поведение не отличается от FR2.x, исходное значение присваивается св-ву KeyValue
5) в моем случае мемка не двигается до тех пор, пока на нее не попадет бэнд. В конце концов, не нравится такое поведение - есть опция View|Options|Free bands placement
6) надо соотносить усилия по исправлению бага (фичи, нестандартного поведения, чего-либо еще) к значимости этого бага в реальных условиях работы.
Я в больших затруднениях...
Уже думаю переходить обратно на FR2.52 - все же там есть исходники и можно поправить, если что не так...
Никак не пойму, как работает связка TfrxDBDataSet с TDataSet в случае Parent-Child...
Простая ситуация - вывести отчет из двух DataSet (номера заказов и список позиций под каждым заказом).
Единственная ситуация, когда все отрабатывает нормально - это когда я открываю один DataSet со списком ВСЕХ заказов, другой - со списком ВСЕХ позиций и через TDataSource создаю между ними отношение Parent-Child по полю номера заказа.
Как только в подчиненном DataSet я делаю параметризованный запрос - все летит к черту.
Схема работы параметризованного запроса проста:
- у главного DataSet есть событие AfterScroll, в котором, при смене записи, происходит закрытие и открытие подчиненного DataSet
- у подчиненного DataSet есть событие BeforeOpen в котором перед открытием он заполняет свои параметры (номер заказа) из одноименного поля главного DataSet
Если эти же два DataSet (второй с параметризованным запросом) смоделировать просто на форме с двумя TDBGrig - все работает отлично!
В ФастРепорте сразу валится куча ошибок - в основном Access Violation
Что делать?
Комментарии
На текущий момент
1. Не все отчеты из демоверсии корректно экспортируются в Excel
через ole (Особенно отчета с RichText, Диаграммой и сохраняемыми гурппами)
2. Окошко инспектора объектов не убирается как в прошлых версиях в полоску, при двойном щелчке по заголовку окна
3. После нескольких выполнений отчета "отказался" работать "Выход"
из дизайнера.
4. Куда то делись cross header, cross data, cross footer Оставленный вариант не вседа подходит.
5. Как то странно работает отладчик: отрабатывает сразу несколько строчек за раз.
6. Теперь необходимо все переменные объявлять?
7. При "вырезании" бенда с мемками на нем и последующей вставке мемки съезжали со своих мест. Пару раз поймал подобный эффект пр переключении между страницами.
8. При использовании отступа в мемо(параграфа) буквы заезжают за правую границу мемки если стоит выравнивание по ширине
Пока все
З.Ы.
Функция str уже не входит в словарь скриптового языка?
А так мне приходится открывать его снова и снова для каждого обьекта.
Тогда я попробовал выделить несколько обьектов Memo, чтобы задать для них Frame одним махом - но не тут-то было! Это свойство исчезает, если выделено более одного обьекта Memo!
То есть нужно, чтобы:
- свойства не сворачивались
- свойства не исчезали при выделении нескольких обьектов
2) При выборе курсора для обьекта неплохо сразу видеть его изображение, как в Дельфи
3) Много непонятных свойств. Нужна хоть какая-нибудь дока. Пусть сырая, на английском, в виде текстовых файлов - все равно...
Второе, будем смотреть .
Теперь вопрос:
Может чего не понял, но в демке если бросил бэнд, то переместить его выше/ниже уже не могу. Может я чего не понял, или это баг?
1) Проверил оба отчета - вполне корректно.
2) Это и не нужно - интерфейс с докингом.
3) Как повторить эффект?
4) cross bands нет и не будет - все что нужно делает объект TfrxCrossView.
5) Пример?
6) Все что используется необходимо объявлять.
7,8) да, будем лечить.
вместо ф-и Str - IntToStr, FloatToStr
Volm:
1) да, нет - но я и не старался скопировать всю функциональность делфийского инспектора.
2) делать было уже лень
3) как раз английской доки пока нет, есть русская, но в практически нечитабельном виде.
1) Я у себя в проекте в качестве DataSet использую только наследников от TClientDataSet (TVClientDataSet)
И вот значит я положил на форму такого наследника, повесил на него TfrxDBDataSet и запустил дизайнер.
Могу ли я своему компоненту TVClientDataSet из дизайнера (в модуле кода) менять свойства, открывать, закрывать и т.д.
Или мне его нужно заворачивать в FastReport-wrappers и регистрировать, как это сделано например с ADODataSet ?
2) Не смог из дизайнера изменить значение переменной (frVariables), например <var1> := '1'
Я этого просто делать не умею, или это невозможно?
(хотя я конечно могу завести глобальную переменную в модуле кода, написав
var
v1:string;
begin
v1 := '1';
end.
но все же хотелось бы знать - frVariables меняются из дизайнера (из скрипта)?
)
Volm.
2) Если переменная объявлена в словаре (т.е. это не совсем переменная - а скорее вычисляемая ф-я), то установить ее значение из скрипта можно только методом Set(varname, varvalue). Если переменная скриптовая - менять значение можно обычным способом.
За интерфейс компонента спасибо, но если бы еще строчку-другую примеров...
Например вот такие строчки вызывают ошибки в скрипте:
<frxDBDataset1>.close;
<frxDBDataset1.close>;
Причем ошибки "; expected"...
а на строчку
frxDBDataset1.close;
ругается "undeclared identifier 'frxDBDataset1'"
2) ==================================
У меня в словаре заведена переменная <StringParam_ParamTwo> со значением 'aaaaaaaaa'
Есть на бэнде обьект Memo1 со значением [StringParam_ParamTwo]
В его событии OnBeforePrint я пишу:
procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
set(<StringParam_ParamTwo>, 'zzzzzzzzzzzzzz');
end;
Запускаю отчет и вижу 'aaaaaaaaa'
Что-то не так...
К датасету frxDBDataset1 можно обратиться так:
var frxDBDataset1: TfrxDataSet;
frxDBDataset1 := Report.GetDataset('frxDBDataset1');
frxDBDataset1.close
2) правильно так:
set('StringParam_ParamTwo', 'zzzzzzzzzzzzzz');
Единственно, о чем стоит помнить, при задании строковых значений в переменных словаря, - нужно явно указывать кавычки.
Выражение
set('StringParam_ParamTwo', 'zzzzzzzzzzzzzz');
не прошло - при выполнении ругалось, на неизвестный обьект с именем zzzzzzzzzzz
Не ругается, если написать так:
set('StringParam_ParamTwo', '''zzzzzzzzzzzzzz''');
И будет ругаться даже если написать так:
var
s:string;
begin
s := 'qwe';
set('StringParam_ParamTwo', s); // ошибка - неизвестный обьект qwe
end;
зато не ругается, если написать
s1 := 'qwe';
s2 := '''' + s1 + '''';
set('StringParam_ParamTwo', s2);
С обращениями к DataSet еще разбираюсь...
Как пример - в скрипте можно завести переменную типа TAdoQuery и TADOTable, но нельзя TADODataSet - не знает скриптовый движок такого...
Однако, то, что есть - уже неплохо! Например можно писать так:
var
fds:TfrxDBDataSet;
aq:TADOQuery;
begin
//цепляемся к внешнему TfrxDBDataSet
fds := TfrxDBDataSet(Report.GetDataSet('frxDBDataset1'));
// вытаскиваем из него реальный внешний датасет
aq := TADOQuery(fds.DataSet);
// у внешнего датасета изменяем те свойства и выполняем те методы, о которых знает скриптовый движок
aq.sql.text := 'select top 10 * from dat_countries';
aq.open;
end. // дальше пойдет прокрутка отчета...
=============================================================================
Собственно мои проблемы достаточно просты - я хочу конечному пользователю дать возможность
строить себе отчеты в дизайнере, предварительно создав в памяти нужное ему количество датасетов.
(он описывает нужные ему датасеты в специальном конструкторе, откуда затем вызывает дизайнер отчетов)
Сами датасеты являются наследниками от TClientDataSet, поскольку мой конечный пользователь может находиться
далеко от сервера БД и общаться с ним по HTTP посредством всем известного MIDAS (DataSnap).
Далее, уже в скрипте, в дизайнере, перед прокруткой отчета, пользователь может поместить в датасеты
нужные запросы, задать между ними отношения master-detail и открыть датасеты
И вот тут нужен доступ к свойству 'CommandText' компонента TClientDataSet, который пока фастрепорту
неизвестен.
Как вариант, можно в наследнике TClientDataSet'a реализовать свойство SQL, как в TQuery, и затем уже в
скрипте обращаться к этому датасету, как к TQuery, чтобы иметь доступ к тексту запроса, но это
как-то кривовато на мой взгляд...
Я вообще считаю, что компонент TClientDataSet годится на все случаи жизни, может работать
как локально так и удаленно, причем с любыми реальными датасетами (BDE, ADO и т.д.)
Поэтому грустно осознавать отсутствие поддержки этого компонента в FastReport
=============================================================================
Но - ничего страшного...
ФастРепорт - система открытая и позволяет подключать новые компоненты (Огромное спасибо автору!)
Отсюда вопрос: можно ли надеяться на появление в ФастРепорте компонента TClientDataSet
(пусть даже не на палитре внутренних компонентов, а просто как известный внутри скриптового движка класс)
Volm
Надеюсь, принципы остались в целом похожие на те, которые существовали в fr 2.x (хотя отличия наверняка есть)
========================================
Добава от 29 июня 2004г.
========================================
Решил просмотреть англоязычный форум и вот, что увидел:
Оказывается скриптовый движок готов работать ДЕЙСТВИТЕЛЬНО ПРАКТИЧЕСКИ С ЛЮБЫМИ КЛАССАМИ!
Все, что нужно сделать в коде программы на Дельфи, перед запуском отчета - написать примерно следующее:
frxReport1.Script.Parent.AddClass(TMyClass, 'TMyClass')
После этого в коде скрипта я уже могу заводить переменные класса TMyClass
Причем frxReport1.Script - это скрипт конкретно репорта frxReport1
а frxReport1.Script.Parent - это глобальный скрипт для всех репортов Вашего приложения и лучше классы добавлять туда, так как например сколько я не добавлял класс TfrxReportOptions в конкретный репорт - не работало...
Так же у скриптового движка существует много других интересных методов (где ты, документация!!!!), которые впрочем можно увидеть и в Дельфи, набирая точку после frxReport1.Script
- например AddForm или AddComponent...
Так что дерзайте...
Ну и мои проблемы с обработкой в скрипте наследников TClientDataSet теперь вроде решены...
После закрытия превью я ожидаю снова увидеть свой скрипт, чтобы продолжить его исправлять - ан нет... Вижу макет страницы - и снова тащу мышь через весь экран, переключаюсь на страницу скрипта.
Рука уже болит (особенно правая...)
Попробую внести и свою лепту.
1) fs6.dpk(70) Fatal: Unit fs_iibxrtti was compiled with a different version of
IBDatabase.TIBDatabase (IBX 6.08 with IB7 support). Также если уж дистрибутив
включает скомпилированные BPL (спасибо за разделение на Design/Runtime!), то
надо бы еще и DCP (для Delphi).
2) Кажется это дельфийский глюк, но все же неприятно, когда подсказки
инспектора остаются поверх любых окон (даже поверх окон других программ) когда
мышка уходит из дизайнера.
3) при изменении размера области страницы в дизайнере не обновляется значение
масштаба. Например, выставляем масштаб "По ширине" (страница "вписывается" в
область). Теперь растягиваем в ширину инспектор. Страница не помещается в
отведенную ей область, но значение списка "масштаб" по прежнему с гордостью
гласит о том, что установлен масштаб "по ширине". При этом для того, чтобы
вписаться в отведенную область нужно выбрать любой другой масштаб, а потом
вернуться на "По ширине".
4) В дизайнере, который открывается при нажатии кнопки "Edit page" в Preview, в
отличие от версий 2.x есть кнопка "Предварительный просмотр", при нажантии на
которую ничего не происходит.
5) В стандартном окне предварительного просмотра не работает клавиши Esc.
Понятно, что закрыть можно и по Alt+F4, но в 2.х работала и Esc.
6) Мне кажется, что процедура создания dot-matrix отчета слишком хорошо
спрятана . Во всяком случае когда ко мне попала восьмая альфа-версия для меня
оказалось более простым изменить в XML значение DotMatrixReport="False" на
DotMatrixReport="True" чем догадаться создать новый отчет через меню "Файл".
7) Идем на закладку "Code" и меняем язык, скажем, на C++Script, соглашаемся с
предупреждением. Теперь жмем кнопку "Новый отчет", опять идем на закладку Code
и наслаждаемся текстом "begin ... end" на языке C++Script. Кстати, после замены
всего текста на пустышку для выбранного языка вначале появляется пустая строка.
8) Опять же как и в пункте 3 в Preview при изменении масштаба текущей номер
сраницы не обновляется. Хотя вообще-то он и не должен меняться, т.к. при
изменении масштаба в Preview я бы хотел остаться на той странице, на которой и
был (например ZoomIn на _заинтеремовавшей_ меня странице)
9) Хорошая вещь алиасы имен полей. Однако, IMHO, поиск поля должен
производиться как по алиасам, так и по оригинальному имени (особенно если
учесть следующий пункт).
10) Если перетянуть имя поля на страницу отчета, то изменить текст
получившегося Memo НЕВОЗМОЖНО! Не работает ни поиск и замена,
ни _ЛЮБОЙ_ другой способ изменить текст поля (включая двойной щелчок/правка/ОК),
кроме выбора нового имени из выпадающего списка, который появляется при
наведении мышки на Memo.
11) При повторном вызове диалога "Заменить" строка поиска содержит
предыдущее значение, а строка замены очищается...
12) В диалоге сохранения скрипта, который появляется при нажатии на дискетку в
окне кода, список типов включает ТОЛЬКО "*.pas" и "*.js" (не считая "All
files").
13) Может что-то неправильно делал, но в тестовом приложении (см. ниже) при
нажатии на кнопку Export в Preview ничего не происходит.
14) НЕ РАБОТАЕТ КОМПРЕССИЯ. Галочку Compressed в инспекторе выставляю, но
результат нулевой. Если переключиться на другой объект, а потом вернуться на
Report, то галочка будет снята (Compressed=false)
15) Если удалить страницу, на которую ссылался SubReport, а потом сделать Undo
(вернуть удаленное), то при формировании отчета получим Access violation
16) Желательно вторичные формы дизайнера по умолчанию выводить по центру
главного дизайнерского окна (сейчас большинство выходят за пределы экрана).
17) В SyntaxMemo нажатие Ctrl+BackSpace приводит к замене символа слева от
курсора на какой-то символ (отображается в виде квадрата)
18) Lookup поля не поддерживаются??? :-\
19) У DBLookupComboBox нет свойства ListSource, так что ListField выбирается из
того же DataSet-а, что и KeyField.
20) Неправильно отрабатывает сдвиг ниже расположенных объектов при растягивании
бендов, если этот объект не привязан ни к одному бенду.
21) Рисование и позиционирование кнопки, которая появляется при наведении мышки
на поле бенда XXXXXData долдно учитывать масштаб (например при масштабе 25%
кнопку даже нажать невозможно, т.к. она исчезает при выходе за пределы Memo).
22) ParagraphGap допускает отрицательное значение. Первая строка при этом,
есно, уходит за пределы Memo. IMHO, более правильно было бы оставить первую
строку на нулевой позиции, а к левому краю всех последующих прибывить
ABS(ParagraphGap). Это дало бы возможность делать абзацы, в которых первая
строка не имеет отступа, а все последующие имеют.
23) А куда делся MasterHeader?
24) Когда мышка уходит за границы области печати страницы вставляемый в данный
момент объект (его рамка) исчезает. Это составляет определенные трудности,
особенно если учесть выравнивание по сетке. IMHO, нужно оставлять вставляемый
объект прижатым к границе области печати.
25) Когда для бенда установлено кол-во столбцов отличное от одного а для Memo
стоит Align=baWidth, то текст разных столбцов накладывается друг на друга. По
идее Align должен работать в пределах столбца. Также неплохо было бы автоматом
расчитывать ширину столбца, если пользователь не ввел _свое_ значение.
26) Надо бы сделать контроль вводимых значений в инспекторе. Например при вводе
PageHeight=9999999999999999999999999999999999 получил "Invalid floating point
operation" а в инспекторе PageHeight=1E34. После этого указанный эксепшн
возникал при каждой отрисовке страницы в дизайнере. Благо после беспроблемного
исправления значения в инспекторе все наладилось. Вообще не должны приниматься
абсурдные значения типа PageWidth=-21 (кстати, отрицательное значение принялось
даже без эксепшена). :-\
Еще присоединяюсь к вопросу о версии для C++Builder...
<span style='font-family:Courier'> </span>
Я, конечно, могу ошибаться, но помоему проблема в следующем:
В методе Frxdesgn::TfrxDesignerForm::DeletePageCmdExecute проверятся ссылка на SubReport и, если ссылка присутствует, то делается SubReportView.Free. Однако в методе Frx6.Frxdesgn::TfrxDesignerForm::UndoCmdExecute ссылка на SubReportView для страницы восстанавливается из буфера Undo, а не прописывается новая на вновь созданный. Как следствие в методе frx6.Frxclass::TfrxReportPage::IsSubReport одет обращение по несуществующему адресу.
Более точно сказать (пока) не могу - нет времени сидеть в отладчике. Вообще-то если бы были OBJ-файлы (версия для Builder), то информации было бы больше...
Но меня волнует несовместимость отчетов с предыдущими версиями FastReport.
Все отчеты переделывать будем?
1) У меня стандартная версия IBX, шедшая с D6up2.
2) Попробую побороть, но не уверен, что получится - когда быстро убираешь мышу, не успевает срабатывать OnMouseLeave (кстати, такое встречается и в самой винде).
4) В 3.0 запрещенные кнопки показываются, но не срабатывают.
5) Уже сделал.
6) Все будет описано в документации (которую наш народ привык не читать
9) Если определены алиасы, то обращение к полю возможно только через алиас.
10) Это потому, что у мемо (и не только у него) есть св-ва DataSet/DataField...
13) Должен быть создан хотя бы один компонент фильтра экспорта.
14) Не надо трогать Compressed, он только для информационных целей. Достаточно в диалоге сохранения отчета выбрать тип файла - Compressed report.
16) какие формы имеются в виду?
18) Нет.
19) А как же иначе?
20) Растягивание бэндов не влияет на сдвиг объектов, лежащих под бэндом.
21) Вряд ли кто-то будет работать при масштабе 25%. Поэтому такие мелочи не учитывались.
23) Вместо него и других дата-хидеров - TfrxHeader.
24) Поведение аналогично 2.х.
25) Align не учитывает ширину столбца (и не учитывал никогда).
26) Слишком муторно - для каждого св-ва делать контроль.
>Еще присоединяюсь к вопросу о версии для C++Builder...
Скоро будет.
В 2.52 есть возможность сохранить отчет в формате FR3.
Вот эти два пункта в совокупности обязывают использовать алиасы либо с самого начала либо не использовать вообще (если, конечно, не рассматривать вариант ручного исправления), что по моему мнению не есть good.
Ну так как в пункте 4 - отключить...
Это как в одном анекдоте... "А низзя!"
У тебя какое разрешение экрана установлено? 1024х768? Угадал? Может, конечно, и нет, но дома у меня 800х600 и формы редактирования Memo, вставки выражения (Expression Editor) и какие-то еще уходили вниз и вправо, а на работе (только-что проверил) все нормально (по центру). В связи с этим сделал предположение, что "вторичные" окошки не центрируются, а выводятся с Position=poDesigned.
Гы Ну и как? Отменять нормализацию базы? Или через скрипты имитировать Lookup?
Кхе... Ну вообще-то у Borland-а иначе задумывалось. Есть один Dataset (в нем данные) и есть второй датасет (справочник). В поле первого хранится ключ, по которому выбираются данные из второго. При этом ключ скрыт от пользователя, а вместо него на экране юзер видит описание кода (ключа). Так к чему это я... А к тому, что в какой смысл выводить список из того же датасета, с которым сейчас работаем?
Вообще глянь на дельфийский DBLookupComboBox и обрати внимание на два свойства DataSource и ListSource, а потом стоит взглянуть на то из какого из них берутся списки KeyField и ListField...
Может я чего не понимаю, но...
Создаем новый отчет (автоматом в него помещаются ReportTitle, MasterData и PageFooter). Теперь кидаем мемку на пустое место под PageFooter-ом... А теперь пробуем растянуть MasterData вниз так, чтобы PageFooter сдвинул вниз наше мемо.
"Вся жизнь - цепь, а мелочи в ней звенья. Нельзя звену не придавать значенья!" © мультфильм "Вокруг света за 80 дней".
25% это уже крайность. При таком масштабе кнопка вообще не там появляется. Однако ведь "проблемы" начинаются и на 75%... Хотя и не критичные.
Было такое предположение. Однако может объяснишь как этот TfrxHeader поместить перед MasterData?
Сейчас специально проверил на 2.51 - не исчезает. Может я не совсем понятно объяснил... Не за границы страницы, а за границы области печати (обведена рамкой внутри самой страницы).
PS. To be continued... (пока смог только 2 часа уделить третьей версии)
2. Конвертер репортев не помешал бы. просто если у тебя отчетов 2-5 ты можешь их ручками, а если 200-700 то тут уже адсткая работа.
1) Демка давно уже выложена
http://www.fastreports.net/files/FR30demo.zip
2) Конвертер встроен в FR2.52.
AnDy:
>Вот эти два пункта в совокупности обязывают использовать алиасы либо с самого начала
Именно так! Вообще, в тройке все рассчитано на то, что пользователь делает отчеты не абы как, а с толком, расстановкой
>У тебя какое разрешение экрана установлено? 1024х768? Угадал?
Не угадал. 1280х1024 Эти окошки запоминают свою позицию, поэтому выводить их по центру (poScreenCenter) низзя - иначе запомненная позиция игнорируется.
> Гы Ну и как? Отменять нормализацию базы? Или через скрипты имитировать Lookup?
Использовать запросы - это гораздо эффективнее. Да и проще - пока настроишь lookup, свихнуться можно.
> Вообще глянь на дельфийский DBLookupComboBox и обрати внимание на два свойства DataSource и ListSource, а потом стоит взглянуть на то из какого из них берутся списки KeyField и ListField...
В FR3 TfrxDBLookupComboBox.DataSet = TDBLookupComboBox.ListSource. То же самое, только называется иначе.
> А теперь пробуем растянуть MasterData вниз так, чтобы PageFooter сдвинул вниз наше мемо.
Речь не о дизайнере. В данном случае page footer смещается ниже и "задевает" мемку. После этого ее родителем становится бэнд.
>Однако ведь "проблемы" начинаются и на 75%... Хотя и не критичные.
Вот-вот. Пробовал работать на 50% - жить можно.
>Было такое предположение. Однако может объяснишь как этот TfrxHeader поместить перед MasterData?
А в чем проблема? Бэнды ведь можно двигать мышой.
Установка PreviewOptions.ZoomMode перед ShowPreparedReport ничего не меняет - отчет высвечивается в масштабе 100%. Может не тогда ставлю?
В отличии от дизайнера, у окна предварительного просмотра параметры (размер, масштаб и т.п.) не сохраняются
Если я правильно понял, то TfrxReport.OnStartReport и TfrxReport.OnStopReport это обработчики событий типа TfrxNotifyEvent. Но TfrxNotifyEvent это String[63]. Я в недоумении.
Судя по всплывающему окну 'Unregistred version of FastScript' FastScript безусловно импортируется FastRepor`том. Означает-ли это, что теперь нужно будет обязтельно приобрести FastScript?
Правильно-ли я понял: теперь, все пользовательские функции надо регестрировать в каждом экземпляре TfrxReport с помощью AddFunction?. Если так, то это очень неудобно для тех случаев когда в программе создается (в Runtime или в DesignTime) много экземпляров TfrxReport. Раньше было удобнее, один раз в программе прописал функци(ю/и) - всем репортам она доступна.
Во время работы под Delphi, в отладочное окно (Event log) "сыпется" очень много сообщений. Можно было бы решить что это издержки бета версии, но и в v2.5 было так-же. Конечно, это не нарушает нормальную работу, но сильно мешает, когда при отладке своей программы приходится пользоваться отладочным протоколом.
И еще
AlexTz пишет:
Однако делаю следующее:
1. Гружу свой старый репорт в дизайнер v2.5
2. Сохраняю его в формате v3 (*.fr3)
3. Гружу полученный файл в v3 и получаю "Couldn't find class TfrReport"
Может что не так делаю?
AlexTz пишет:
Хотелось-бы получить исходники frxIBXComponents поскольку версий IBX было много, даже официальных. Поэтому, DCU не катит . Лично у меня своя версия IBX - ошибки правил.
2) будем фиксить
3) да, пока не сохраняются, доделаю позже.
4) это обработчики событий для скрипта, появляются в фр-овском OI.
5) FS будет идти в комплекте. Просто триальная версия собрана с триальным же FS.
6) Пользовательские ф-и можно регистрировать через FS (fsGlobalUnit). Подробнее - в доке на FS.
7) никогда не пользовался. Посмотрел сейчас - вроде ничего особенного не сыпет.
8) Надо FR2.52 для корректной работы.
9) Ну это же триал, в конце концов Исходники будут в полной версии.
Ну это я знаю. Другой вопрос какая позиция выбирается при первом показе, когда в реестре еще ничего не прописано?
Что-то после прочтения такого ответа у меня аж энтузиазма поубавилось… Тебе, конечно, виднее, но ведь не все программы пишутся для SQL и Client/Server! А ведь при работе, скажем, со старым добрым DBF использование запросов местами весьма непозволительная роскошь с точки зрения быстродействия…
К тому же если что-то было, а потом этого не стало (и улучшенная замена при этом отсутствует), то начинаешь как-то по-новому смотреть на выпуск новых версий...
ОК. Согласен, что данные в FR не редактируются, а отображаются. Однако из какого ж тогда датасета мы берем ИСХОДНОЕ значение (DataField)? Из «справочника»? Так это ж уже не DBLookup, а какой-то странный компонент получается, в котором значение одного поля для одной записи отображается в Edit-е, а несколько записей второго поля отображаются при раскрытии списка…
Только сейчас досмотрел, что свойства DatdField у этого компонента вообще нет.
Вот и я о том же. В 2.х было все понятно: растянул верхний бенд вниз – все, что попало в него парентится… А в FR3 как-то не понятно. С одной стороны бенды сдвигают друг друга, но «почти» не сдвигают обычные объекты.
Почему почти? А потому, что Memo в приведенном мной примере сначала все же начинает двигаться, а уже потом в один «прекрасный» момент (помоему при скачкообразном изменении размера бенда «по сетке») его владельцем становится бенд.
Мультик такой был… Про зайца, который черепицу помогал ложить, стул чинил и вообще был на все руки мастер… У него была любимая фраза – «…и так сойдет!»
Sorry! Стормозил. Меня сбило с толку то, что бенды (вроде как) в третьей версии автоматом занимают свою позицию в том порядке, в котором выводятся на печать…
2) поправлю, если смогу.
3) в таких монстрах, как Crystal и RB, вообще с самого начала людей к запросам приручили. И ничего...
4) в этом плане поведение не отличается от FR2.x, исходное значение присваивается св-ву KeyValue
5) в моем случае мемка не двигается до тех пор, пока на нее не попадет бэнд. В конце концов, не нравится такое поведение - есть опция View|Options|Free bands placement
6) надо соотносить усилия по исправлению бага (фичи, нестандартного поведения, чего-либо еще) к значимости этого бага в реальных условиях работы.
Я в больших затруднениях...
Уже думаю переходить обратно на FR2.52 - все же там есть исходники и можно поправить, если что не так...
Никак не пойму, как работает связка TfrxDBDataSet с TDataSet в случае Parent-Child...
Простая ситуация - вывести отчет из двух DataSet (номера заказов и список позиций под каждым заказом).
Единственная ситуация, когда все отрабатывает нормально - это когда я открываю один DataSet со списком ВСЕХ заказов, другой - со списком ВСЕХ позиций и через TDataSource создаю между ними отношение Parent-Child по полю номера заказа.
Как только в подчиненном DataSet я делаю параметризованный запрос - все летит к черту.
Схема работы параметризованного запроса проста:
- у главного DataSet есть событие AfterScroll, в котором, при смене записи, происходит закрытие и открытие подчиненного DataSet
- у подчиненного DataSet есть событие BeforeOpen в котором перед открытием он заполняет свои параметры (номер заказа) из одноименного поля главного DataSet
Если эти же два DataSet (второй с параметризованным запросом) смоделировать просто на форме с двумя TDBGrig - все работает отлично!
В ФастРепорте сразу валится куча ошибок - в основном Access Violation
Что делать?
картинка
Причем, там этих строк много.