4

私は、SVGファイルがそれらに対していくつかのことを実行することを表示するためにC++ビルダーコンポーネントを作成しました。

今のところ、SVGファイルのファイル名でIDEで初期化できるSvgFile(UnicodeString)という名前のプロパティを公開しました。これは正常に機能します。このプロパティはDFMファイルに保存され、そこから再ロードできます。

ただし、アプリケーションにSVGファイルを提供する必要があるため、TImageコンポーネントで行われるように、SVGをDFMファイルに保存したいと思います。

TPropertyEditorとおそらくTPersistentクラスを作成する必要があると思いますが、どうすればよいかわかりません。

誰かが私がそうするのを手伝ってくれるでしょうか?

2013/01/17を編集:ここに解決策がありますhttp://www.informit.com/articles/article.aspx?p=28278&seqNum=5

ご協力いただきありがとうございます。

4

1 に答える 1

6

DefinePropertiesストリームとの間でバイナリデータのストリーミングを実行する独自のメソッドを記述し、およびを使用してそれらをVCL / RTLストリーミングシステムに登録することにより、プロパティを読み書きする独自のメソッドを作成できます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ストリーミングシステムは、必要に応じて、定義されたプロパティ(上記の例ではproperty UserImages)に適切なメソッドを自動的に呼び出して、dfmファイルに自動的に保存したりdfmファイルから読み取ったりします。自分で呼び出す必要はありません。

于 2013-01-16T15:23:54.503 に答える