При работе с отчетами в Delphi с помощью библиотеки FastReport может возникнуть необходимость добавлять объекты TLineView в отчет динамически, в зависимости от данных, полученных из источника данных отчета. В этой статье мы рассмотрим проблему, связанную с добавлением TLineView в отчет, и предложим решение, основанное на материале из контекста.
Описание проблемы
При попытке добавить объекты TLineView в отчет, количество линий зависит от определенного числа, полученного из источника данных отчета. Однако, вместо получения двух линий, расположенных друг возле друга с промежутком между ними, получается всего одна короткая линия длиной около 3-4 мм.
В контексте приведен пример кода, который был размещен в части инициализации скрипта отчета:
После изучения материала из контекста и альтернативного ответа было выявлено, что для корректного добавления TLineView в отчет необходимо учитывать несколько моментов:
Создаваемые объекты TLineView должны иметь уникальные имена. В примере кода, приведенном в контексте, используется метод CreateUniqueName, но он не может быть использован в скрипте отчета. В качестве альтернативы можно генерировать уникальные имена вручную, как показано в окончательном решении.
Координаты и размеры объектов устанавливаются в пикселях, поэтому необходимо проводить дополнительные вычисления для перевода единиц измерения.
В окончательном решении предложен следующий код:
procedure Child8OnBeforePrint(Sender: TfrxComponent);
var
nol, i: integer;
left1, left2: extended;
child, newChild: TfrxChild;
noteLine1, noteLine2, line: TfrxLineView;
page: TfrxPage;
band: TfrxChild;
begin
nol := <DS_MAIN."VOLUME"> /2;
nol := nol + <DS_MAIN."VOLUME"> mod 2;
band := TfrxChild(TRP_ORDER_NOTE.FindObject('Child9'));
// Lines generation
left1 := 3 * fr1cm;
left2 := 11.2 * fr1cm;
for i := 1 to nol do begin
line := TfrxLineView.Create(band);
line.Name := 'noteLine' + intToStr(1 + 2 * (i - 1 + trunc(random * 1000000))); // Panic solution
line.Top := fr1cm * (0.73 + (i - 1) * 0.75);
line.Width := 7.5 * fr1cm;
line.Left := left1;
if (<DS_MAIN."VOLUME"> mod 2 > 0) and (i = nol) then
exit
else begin
line := TfrxLineView.Create(band);
line.Name := 'noteLine' + intToStr(2 * i + trunc(random * 1000000));
line.Top := fr1cm * (0.73 + (i - 1) * 0.75);
line.Width := 7.5 * fr1cm;
line.Left := left2;
end;
end;
end;
Вывод
При динамическом добавлении объектов TLineView в отчет под Delphi необходимо учитывать несколько моментов, таких как уникальные имена объектов и дополнительные вычисления для перевода единиц измерения. В данной статье мы рассмотрели проблему, связанную с добавлением TLineView в отчет, и предложили решение, основанное на материале из контекста. Используя предоставленный окончательный код, вы сможете корректно добавлять объекты TLineView в отчет в зависимости от данных, полученных из источника данных отчета.
В контексте рассматривается проблема с динамическим добавлением объектов TLineView в отчет под Delphi с помощью библиотеки FastReport, когда вместо двух линий получается всего одна короткая линия.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS