Написание компонента 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; Вам никогда не нужно звонить им самим.