5 votes

Ecrire un composant C++ Builder/Delphi et enregistrer une propriété binaire dans les fichiers DFM

J'ai écrit un composant C++ Builder pour afficher des fichiers SVG et effectuer quelques opérations sur eux.

Pour l'instant, j'ai publié une propriété nommée SvgFile (UnicodeString) qui peut être initialisée dans l'EDI avec le nom de fichier du fichier SVG. Cela fonctionne bien. Cette propriété est sauvegardée dans le fichier DFM et peut être rechargée à partir de celui-ci.

Mais je dois fournir le fichier SVG avec l'application, donc j'aimerais sauvegarder le SVG dans le fichier DFM, comme c'est le cas avec un composant TImage.

Je suppose que je dois écrire un TPropertyEditor et peut-être une classe TPersistent mais je ne sais pas quoi faire.

Est-ce que quelqu'un pourrait m'aider pour le faire ?

Éditez 17/01/2013 : voici une solution http://www.informit.com/articles/article.aspx?p=28278&seqNum=5

Merci pour votre aide.

7voto

Ken White Points 73213

Vous pouvez créer vos propres méthodes pour lire et écrire les propriétés en écrivant vos propres méthodes pour effectuer le flux des données binaires vers et depuis un flux, et les enregistrer avec le système de flux VCL/RTL en utilisant DefineProperties et DefineBinaryProperty. Il y a un exemple facile à suivre dans l'unité 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 souligne que la ligne suivante est apparemment un bug
  // dans le code JVCL, et que inherited DefineProperties devrait toujours
  // être appelé quelle que soit le type de Filer. Commenté mais non supprimé
  // car il est dans le code JVCL que j'ai mentionné.

  //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;

Le système de flux Delphi appellera automatiquement les méthodes appropriées pour la propriété définie (dans l'exemple ci-dessus, la propriété UserImages) au besoin pour sauvegarder ou lire automatiquement depuis le fichier DFM ; vous n'avez jamais besoin de les appeler vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X