Разработка собственного компонента

отредактировано 10:07 Раздел: FastReport 3.0
Необходимо сделать собственный компонент, который бы отображал данные массива сохраненного в blob-поле.

Все хорошо, до тех пор пока не приходится добавлять переменные в компонент.
Если переменная объявлена в Published, есть у нее Read-Write и она стандартного типа (а стандартных типов в FastReport кот наплакал), то всё ок, в любом другом случае - значения переменных теряются.

Например:

TfrxMyView = class(TfrxView)
private
FSignalLen: Int64;
protected
public
constructor Create(AOwner: TComponent); override;
procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); override;
procedure GetData; override;
class function GetDescription: String; override;
published
property BrushStyle;
property Color;
property DataField;
property DataSet;
property DataSetName;
property Frame;
property SignalLen: Int64 read FSignalLen write FSignalLen default 0;
end;

implementation

{ TfrxMyoSignalView }

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

class function TfrxMyView.GetDescription: String;
begin
Result := 'Мой пример';
end;

procedure TfrxMyView.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended);
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(FSignalLen)));
end;

DrawFrame;
end;

procedure TfrxMyView.GetData;
var
DataStream: TMemoryStream;
begin
inherited;
if IsDataField then
begin
DataStream := TMemoryStream.Create;
DataSet.AssignBlobTo(DataField, DataStream);
FSignalLen := DataStream.Size shr 2;
DataStream.Free;
end;
end;

initialization

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

end.


В GetData FSignalLen попадает и ему присваивается какое-то значение

При прорисовки же FSignalLen всегда = 0

Если поменять тип Int64 на Integer, то всё в порядке
Тоже самое происходит, если свойство просто read, или свойство вовсе не объявлено, а есть только переменная или свойство находится не в Published

Что делать? У меня гора своих типов и многие из них в Published никак не засунуть, да и не всегда мне нужно, чтобы внутренние переменные объекта были на виду.

Комментарии

  • отредактировано 10:07
    Под отладчиком выяснилось, что сначало создаются компоненты и вызывается метод GetData, потом они уничтожаются, потом заново создаются и зачем-то многократно вызывается метод Draw. Как туда передаются данные из ранее уничтоженного компонента - для меня пока загадка.

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

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