Написание компонента C++ Builder/Delphi и сохранение двоичного свойства в файлах DFM

Я написал компонент C++ builder для отображения SVG-файлов, выполняющих над ними некоторые вещи.

На данный момент я опубликовал свойство с именем SvgFile (UnicodeString), которое можно инициализировать в IDE с помощью имени файла SVG-файла. Это отлично работает. Это свойство сохраняется в файле DFM и может быть загружено из него.

Но я должен предоставить файл SVG вместе с приложением, поэтому я хотел бы сохранить SVG в файл DFM, как это делается с компонентом TImage.

Я думаю, что мне нужно написать TPropertyEditor и, возможно, класс TPersistent, но я не знаю, что делать.

Кто-нибудь может помочь мне сделать это?

Изменить 2013/01/17: вот решение http://www.informit.com/articles/article.aspx?p=28278&seqNum=5

Спасибо за вашу помощь.

1 ответ

Решение

Вы можете создавать свои собственные методы для чтения и записи свойств, написав свои собственные методы для выполнения потоковой передачи двоичных данных в поток и из потока, и зарегистрировать их в потоковой системе VCL/RTL, используя DefineProperties а также DefineBinaryProperty, В блоке JEDI JVCL JVXSlider.pas есть простой пример:

// interface
type
  TJvCustomSlider=class(TJvCustomControl)
  private
    procedure ReadUserImages(Stream: TStream);
    procedure WriteUserImages(Stream: TStream);
    ...
  protected
    procedure DefineProperties(Filer: TFiler); override;


// implementation
procedure TJvCustomSlider.DefineProperties(Filer: TFiler);

  function DoWrite: Boolean;
  begin
    if Assigned(Filer.Ancestor) then
      Result := FUserImages <> TJvCustomSlider(Filer.Ancestor).FUserImages
    else
      Result := FUserImages <> [];
  end;

begin
  // @RemyLebeau points out that the next line is apparently a bug
  // in the JVCL code, and that inherited DefineProperties should always
  // be called regardless of the type of Filer. Commented it out, but
  // didn't delete it because it *is* in the JVCL code I cited.

  //if Filer is TReader then
    inherited DefineProperties(Filer);
  Filer.DefineBinaryProperty('UserImages', ReadUserImages, WriteUserImages, DoWrite);
end;

procedure TJvCustomSlider.ReadUserImages(Stream: TStream);
begin
  Stream.ReadBuffer(FUserImages, SizeOf(FUserImages));
end;

procedure TJvCustomSlider.WriteUserImages(Stream: TStream);
begin
  Stream.WriteBuffer(FUserImages, SizeOf(FUserImages));
end;

Потоковая система Delphi автоматически вызывает соответствующие методы для определенного свойства (в приведенном выше примере свойство UserImages) при необходимости для автоматического сохранения или чтения из файла dfm; Вам никогда не нужно звонить им самим.

Другие вопросы по тегам