Возможно ли передать в отчёт список объектов?
Здравствуйте,
есть необходимость сделать отчёт (таблицу) на основе списка объектов. Например, есть класс пользователя:
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 }