Тут нарвался еще на непонятный косяк. В официальном вики-учебнике есть вот такой пример передачи значения в переменную:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender:TObject);
begin
frReport1.Values.FindVariable('test').Field := QuotedStr('test1');
frReport1.ShowReport;
end;
У меня такой метод почему-то не работает. Вместо значения переменной - пустота на месте, где оно должно быть. Имена переменных - английские; их названия прописывал через мемо записи категорий и переменных в дизайнере. Строки задания значений я записал после загрузки отчета из файла и назначения датасета компоненту TfrDBDataset. В качестве значений пробовал и английский, и русский текст - не идёт. Что касается OnGetValue - его хотелось бы использовать лишь в крайнем случае, если этот способ не заведется, ибо многомодульная структура проекта мешает такому использованию.
Добавлено спустя 4 часа 21 минуту 1 секунду:
Полез по этой проблеме в сорцы с отладчиком. Привожу код с моими комментами.
Модуль LRClass.pas
- Код: Выделить всё
procedure TfrReport.GetVariableValue(const s: String; var aValue: Variant);
...
begin
TVarData(aValue).VType := varEmpty;
DoGetValue(s,aValue); //по исполнении aValue=UnAssigned
if TVarData(aValue).VType = varEmpty then
begin
Value := Values.FindVariable(s); //заданное значение видно в отладчике
if Assigned(Value) then
begin
with Value do
begin
case Typ of
vtNotAssigned: aValue := ''; //а вот здесь значение обнуляется
vtDBField : begin
F := TfrTField(DSet.FindField(Field));
if not F.DataSet.Active then
F.DataSet.Open;
if Assigned(F.OnGetText) then
aValue:=F.DisplayText
else
aValue:=lrGetFieldValue(F);//F.AsVariant;
end;
vtFRVar : aValue := frParser.Calc(Field);
vtOther : begin
if OtherKind = 1 then
aValue:=frParser.Calc(Field)
else
aValue:=frParser.Calc(frSpecFuncs[OtherKind]);
end;
end;
end;
Похоже, этим переменным нужно задавать еще какой-то тип. Но как это делать в дизайнере - непонятно.
Добавлено спустя 27 минут 54 секунды:
Заменил строчку 8897 в LR_Class.pas
- Код: Выделить всё
vtNotAssigned: aValue := '';
на
- Код: Выделить всё
vtNotAssigned: aValue := Field;
Заработало. Но могу лишь понадеяться, что я не сломал другого функционала такой заменой.
Добавлено спустя 3 часа 23 минуты 25 секунд:
Кто-нибудь может загнать последнюю проблему в багтрекер? Я там зарегился, но подтверждение мне на мыло не пришло.