Возможно ли передать в отчёт список объектов?

отредактировано April 2021 Раздел: FastReport VCL

Здравствуйте,

есть необходимость сделать отчёт (таблицу) на основе списка объектов. Например, есть класс пользователя:

TUser = class(TObject)

private

...

public

property Name: String read GetName;

property Age: Integer read GetAge;

end;

И я хочу построить отчёт со списком пользователей.

Как возможно это сделать? Передать напрямую? Или предварительно как-то отформатировать данные (в record) или экспортировать в файл?

Благодарю.

Комментарии

  • Можно.


    Рекомендую почитать документацию по FastScript https://www.fastreport.ru/ru/product/fast-script/documentation/

    и руководства разработчика и программиста по FastReport VCL https://www.fastreport.ru/ru/product/fast-report-vcl/documentation/


    Вот кусок кода для размышления


     // Добавляем в FR3 необходимые классы и их методы и свойства для

     // работы с классами TAttributesCacheItem, TAttributesCache

     frxReport.Script.AddEnum('TAttrPos','apBasic,apAdditional,apSpecial');

     frxReport.Script.AddClass(TAttributesCacheItem, 'TCollectionItem');

     with frxReport.Script.AddClass(TAttributesCache, 'TCollection') do begin

      AddConstructor('constructor Create', CallMethod);

      AddDefaultProperty('Items', 'Integer', 'TAttributesCacheItem', CallMethod);

      AddIndexProperty('ItemsOfName','String','TAttributesCacheItem', CallMethod, True);

      AddMethod('function Add :TAttributesCacheItem', CallMethod);

     end; { with }


     with frxReport.Script.FindClass('TMemIniFile') do begin

      AddMethod('function ReadColor(const Section, Ident: String; Default: TColor): TColor', CallMethod);

      AddMethod('procedure WriteColor(const Section, Ident: String; Value: TColor)', CallMethod);

      AddMethod('function ReadFont(const Section, Ident: String; Font: TFont): TFont', CallMethod);

      AddMethod('procedure WriteFont(const Section, Ident: String; Font: TFont)', CallMethod);

     end; { with }


     with frxReport.Script.FindClass('TfrxComponent') do

      AddMethod('procedure CreateUniqueName()', CallMethod);


     frxReport.AddFunction('function GetReportField(cCompName: String): String');

     frxReport.AddFunction('function GoColorDialog(Color :TColor): TColor');

     frxReport.AddFunction('function GoFontDialog(oFont :TFont): TFont');


     frxReport.Script.AddVariable('oAttributesCache', 'TAttributesCache', Integer(FAttributesCache));

     frxReport.Script.AddVariable('oGroupAttributesCache', 'TAttributesCache', Integer(FGroupAttributesCache));


    {--------------------------------------------------------------------}

    { Обработка вызовов некоторых методов доп. классов                  }

    {--------------------------------------------------------------------}

    function TRepDataModule.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; Caller: TfsMethodHelper): Variant;

    begin


     if ClassType = TAttributesCache then begin


      if MethodName = 'CREATE' then

        Result := Integer(TAttributesCache.Create)

      else

      if MethodName = 'ITEMS.GET' then

        Result := Integer(TAttributesCache(Instance).Items[Caller.Params[0]])

      else

      if MethodName = 'ITEMS.SET' then

        TAttributesCache(Instance).Items[Caller.Params[0]] := TAttributesCacheItem(Integer(Caller.Params[1]))

      else

      if MethodName = 'ADD' then

        Result := Integer(TAttributesCache(Instance).Add)

      else

      if MethodName = 'ITEMSOFNAME.GET' then

        Result := Integer(TAttributesCache(Instance).ItemsOfName[Caller.Params[0]])


     end else

     if ClassType = TMemIniFile then begin


      if MethodName = 'READCOLOR' then begin


        try

          Result := StringToColor(TMemIniFile(Instance).ReadString(Caller.Params[0], Caller.Params[1], ColorToString(Caller.Params[2])));

        except

          Result := TColor(Caller.Params[2]);

        end; { try }


      end else

      if MethodName = 'WRITECOLOR' then

        TMemIniFile(Instance).WriteString(Caller.Params[0], Caller.Params[1], ColorToString(Caller.Params[2]))

      else

      if MethodName = 'READFONT' then begin


        Result := Integer(Caller.Params[2]);

        try

          StringToFont(TMemIniFile(Instance).ReadString(Caller.Params[0], Caller.Params[1],

                         FontToString(TFont(Integer(Caller.Params[2])))), TFont(Integer(Result)));

        except

        end; { try }


      end else

      if MethodName = 'WRITEFONT' then

        TMemIniFile(Instance).WriteString(Caller.Params[0], Caller.Params[1], FontToString(TFont(Integer(Caller.Params[2]))));


     end else

     if ClassType = TfrxComponent then begin


      if MethodName = 'CREATEUNIQUENAME' then

        TfrxComponent(Instance).CreateUniqueName();


     end;


    end; { CallMethod }

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.