Написание собственного компонента

отредактировано 09:15 Раздел: FastReport 3.0
Как добавить переменную или массив в компонент собственного производства, что бы при этом значение этой переменной можно было вывести на печать. Что-то вроде
TfrxMyView = class(TfrxView)
private
  FValue: Int64;
  FArray: array [0..9] of Int64;
public
  constructor Create(AOwner: TComponent); override;
  procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); override;
  procedure GetData; override;
published
  property BrushStyle;
  property Color;
  property DataField;
  property DataSet;
  property DataSetName;
  property Frame;
end;

implementation

{ TfrxMyoSignalView }

constructor TfrxMyView.Create(AOwner: TComponent);
begin
  inherited;
end;

procedure TfrxMyView.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended);
var
  i: integer;
begin
  BeginDraw(Canvas, ScaleX, ScaleY, OffsetX, OffsetY);
  DrawBackground;
  with Canvas do
  begin 
     Draw(FX + 1, FY + 2, Bmp);
     TextOut(FX + 1, FY + 2, PChar(IntToStr(FValue)));
     for i:=0 to 9 do
     begin
       FY := FY + 20;
       TextOut(FX + 1, FY + 2, PChar(IntToStr(FArray[i])));
     end;
  end;
  DrawFrame;
end;

procedure TfrxMyView.GetData;
var
  i: integer;
begin
  inherited;
  FValue := Random(100);
  for i := 0 to 9 do
    FArray[i] := Random(100);
end;

initialization

frxObjects.RegisterObject1(TfrxMyView, nil, '', 'Other', 0, 22);

end.

При предварительном просмотре в FValue и в элементах массива FArray всегда 0, хотя при формировании отчета там другие числа.

Комментарии

  • gpigpi
    отредактировано 09:15
    Предварительный просмотр в IDE или run-time?
  • отредактировано 09:15
    В Runtime конечно - имеется ввиду предварительный просмотр отчета перед печатью
  • gpigpi
    отредактировано 09:15
    Попробуйте так:
    constructor TfrxMyView.Create(AOwner: TComponent);
    begin
     inherited;
     GetData;
    end;
    
  • отредактировано 09:15
    Я извиняюсь - слишком упростил возникшую у меня ситуацию.
    Переменные я заполняю из базы данных.
    Так как Вы предложили я пробовал, свойство IsDataField в этот момент False и DataField = "", я даже на прорисовку ставил - эти поля не сохраняются
  • отредактировано 09:15
    точнее DataField в какой-то момент становится верным, но далеко не при первой прорисовке, а вот DataSet всегда при предосмотре = nil, хотя в дизайнере FastReport - всё ок.
    Да и сами этапы прорисовки непонятны. FastReport метод Draw вызывает несколько раз на один и тот же объект, причем он зачем-то его постоянно пересоздает.
  • отредактировано 09:15
    Судя по debug-у FastReport сначало создает объект, делает GetData, после чего его уничтожает, потом опять создает объект и только при этом вызывает метод Draw. Какой смысл тогда в GetData? да и с полями проблема - я так и не понял как их создавать так, что бы они запоминали заданные в дизайнере FastReport или в методах компонента данные. При таком подходе (постоянное пересоздание объекта), они должны хранится где-то в буфере. В документации про такой буфер я ничего не нашел, да и вообще ничего нет про создание собственных переменных объекта. Ихний пример с полями работает, но почему - х.з. Делаю всё тоже самое, но тип объекта допустим Int64 - всё, уже не пашет. Или если переменная просто переменная, а не поле объекта в разделе Published.
  • gpigpi
    отредактировано 09:15
    написал:
    Судя по debug-у FastReport сначало создает объект, делает GetData, после чего его уничтожает, потом опять создает объект и только при этом вызывает метод Draw.
    Да, что-то такое есть. Нужно обратиться к разработчикам за разъяснениями.
  • отредактировано 09:15
    Я сразу так и сделал - да только максимум что они предложили, это не писать компонент, а решить проблему с помощью самого FastReport-а. В моем случае это категорически не подходит - мне нужно отображать обработанный сигнал в нужном мне виде. Это большой объем данных, а рисовать всё это с помощью FastReport - это мягко выражаясь - уродство.

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

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