Published record

Résolu
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 1 mars 2007 à 16:50
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 2 mars 2007 à 18:46
salut a tous, cette question me semblait simple, et pourtant, je n'arrive pas a editer un record dans l'inspecteur d'objet d'un composant que j'ai créé.

voici a quoi ressemble en gros mon composant :

type
    TAffVect = record
       X, Y, Z: Extended;
    end;

    TMonComposant = class(TImage)
    private
       FVect: TAffVect;
    published
       property Vect: TAffVect read FAffVect write FAffVect;
    end;
...

et quand je pose ce composant, la propriete Vect n'apparait pas dans l'inspecteur d'objet !!!

Dans le cas ou ce ne soit pas possible, peut etre qu'en implementant un editeur de propriete (comme celui de la TStringList par exemple), cela fonctionnerai???

merci de votre aide

3 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
1 mars 2007 à 22:30
c'est la ou avoir lu le guide du concepteur de composants est utile.

les type structuré ou tableau ne sont pas visible dans l'inspecteur d'objet, il faut pour cela developper un editeur de propriété (TPropertyEditor) qui permet a l'inspecteur d'objet d'editer les propriétés de ce type.

donc tu as bien repondus toi meme a la question :)

sinon il y'a egalement une autre possibilitée c'est celle de créer une classe TPersistent qui ressemblerais a un TRect

<hr size="2" width="100%" />Croc (click me)
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
1 mars 2007 à 23:06
j'ai effectivement lu le guide du concepteur de composant il y a quelques temps, mais je ne l'avais pas sous la main, et ne me rappelais pas qu'il y etait dit que l'on ne pouvait pas faire de record published.
je vais donc me pencher sur le probleme des property editors, et aller voir a quoi ressemble le TRect.

merci pour la reponse claire et precise foxi.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
2 mars 2007 à 18:46
en fait, ça vient que l'inspecteur d'objet ne peu pas deviner ce qu'il y a dans un record, object ou tableau, normal puisqu'aucun des trois de possede d'enumerateur de propriété ou de donnée...
il faut donc le developper soit meme.

pour ta classe tu peu faire ça :

TEVector = class(TPersistent)
private
  fX : extended;
  fY : extended;
  fZ : extended;
  fOnChange: TNotifyEvent;
  fControl : TControl;
  procedure SetExtended(index : integer; val : extended);
protected
  procedure Change; virtual;
  property Control  : TControl     read FControl;
  property OnChange : TNotifyEvent read fOnChange write fOnChange;
public
  constructor Create(Control : TControl); virtual;
  procedure AssignTo(Dest : TPersistent); override;
  procedure Assign(Source : TPersistent); override;
published
  property X : extended index 0 read fX write SetExtended;
  property Y : extended index 1 read fY write SetExtended;
  property Z : extended index 2 read fZ write SetExtended;
end;

constructor TEVector.Create(Control: TControl);
begin
  inherited Create;
  fControl := Control;
  fX := 0;
  fY := 0;
  fZ := 0;
end;

procedure TEVector.Change;
begin
  if Assigned(fOnChange) then
     fOnChange(Self);
end;

procedure TEVector.AssignTo(Dest: TPersistent);
begin
  if Dest is TEVector then
  begin
    with TEVector(Dest) do
    begin
      fX := Self.fZ;
      fY := Self.fY;
      fZ := Self.fX;
      Change;
    end;
  end
  else
    inherited AssignTo(Dest);
end;

procedure TCustomBarSettings.Assign(Source : TPersistent);
begin
  if Source is TEVector then
  begin
    with TEVector(Source) do
    begin
      AssignTo(Self);
    end;
  end
  else
    inherited Assign(Source);
end;

procedure TEVector.SetExtended(index : integer; val : extended);
begin
  case index of
   0: if fX <> Val then
      begin
        fX := Val;
        Change;
      end;
   1: if fY <> Val then
      begin
        fY := Val;
        Change;
      end;
   2: if fZ <> Val then
      begin
        fZ := Val;
        Change;
      end;
  end;
end;

<hr size="2" width="100%" />Croc (click me)
0
Rejoignez-nous