Newsgroup: it.comp.lang.delphi
Titolo: PropertyEditor

Stò costruendo un componente ma non riesco ad attribuirgli
una Property personalizzata che consiste in un array di controlli
appartenenti al form in cui si trova il componente stesso..
Qualcuno sà darmi una dritta?
Ciao..RAF.


ABLS Team - 
www.abls.it
SINTESI S.r.l. - 
www.sintesi.com

 wrote in message
lWP38.18461$hi.4...@news1.tin.it...



Non sono ancora riuscito a capire cosa stai cercando di fare esattamente.
L'approccio corretto (per il momento teorico, poi pratico se mi confermerai
che è ciò che vuoi ottenere) è creare due package, uno di tipo "runtime" e
uno "designtime". Un package runtime contiene la dichiarazione di classi e
componenti che possono essere creati dall'applicazione (a runtime, appunto).
Il package designtime può fare uso del package runtime per avere accesso ai
tipi contenuti, e fornire strumenti da rendere disponibili nell'IDE di
Delphi: registrare i componenti all'interno di una pagina specifica della
palette, fornire editor di componente e (come volevi ottenere tu) editor di
proprietà, anch'essi da registrare.
Tuttavia, ti suggerisco di non utilizzare array dinamici come hai fatto tu,
ma bensì di creare una lista (TList) all'interno della classe che stai
progettando.
La creazione di Property Editor è una problematica relativamente complessa.
Se riesci a spiegare cosa stai cercando di ottenere, magari qualcun altro
può subentrare nel thread e darti qualche indicazione in più.
Per una trattazione abbastanza esauriente sullo sviluppo di componenti e di
Component e Property Editor, ti suggerisco la lettura del libro di
Xavier/Pacheco (io ho quello relativo alla versione 4 di Delphi).


 ha scritto nel messaggio
news:wdX38.20954$Rv3.7...@news2.tin.it...



Potresti provare ad utilizzare le classi TCollection e TCollectionItem.
Questo tipo di classi possiedono un editor di proprietà già pronto (è quello
che vedi configurando i pannelli della TStatusBar). Crea un discendente di
TCollectionItem che rappresenta un singolo elemento della tua collezione di
controlli linkati; il discendente di TCollectionItem possiede una proprietà
di TControl che conterrà il riferimento al controllo; puoi aggiungere alla
classe altre proprietà, se serve. Successivamente, dovrai creare un
discendente di TCollection che possa gestire la tua collezione di controlli
linkati; questa sarà la classe che dovrai creare all'interno del tuo
componente rendendola accessibile tramite una proprietà 'published'. Ti
riporto un esempio di dichiarazione delle classi:
=== CODE ===
{ TRAFControlItem }
  TRAFControlItem = class(TCollectionItem)
  private
    { Private declarations }
    FControl: TControl;
    procedure SetControl(Value: TControl);
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure Assign(Source: TPersistent); override;
  published
    { Published declarations }
    property Control: TControl read FControl write SetControl;
  end;
{ TRAFControls }
  TRAFControls = class(TCollection)
  private
    { Private declarations }
    FOwner: TPersistent;
    function GetItem(Index: Integer): TRAFControlItem;
    procedure SetItem(Index: Integer; Value: TRAFControlItem);
  protected
    { Protected declarations }
    function GetOwner: TPersistent; override;
  public
    { Public declarations }
    constructor Create(AOwner: TPersistent);
    function Add: TRAFControlItem;
    property Items[Index: Integer]: TRAFControlItem read GetItem write
SetItem; default;
  end;
{ TRAFComponent }
  TRAFComponent = class(TComponent)
  private
    { Private declarations }
    FLinkedControls: TRAFControls;
    procedure SetLinkedControls(Value: TRAFControls);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Public declarations }
    property LinkedControls: TRAFControls read FLinkedControls write
SetLinkedControls;
  end;
=== CODE ===
Se vuoi avere esempi concreti di implementazione, sbircia tra i sorgenti di
Delphi. Trovi un elenco delle classi osservabili consultando la Guida in
linea di Delphi per la classe TCollection.


 componente rendendola accessibile tramite una proprietą 'published'. Ti


 componente rendendola accessibile tramite una proprietą 'published'. Ti



No, Delphi dovrebbe visualizzarti automaticamente l'editor di proprietà
previsto per l'elemento TCollection. Un'avvertenza: a causa di un bug (?) di
Delphi, se il tuo oggetto di classe discendente da TCollection è una
proprietà di un oggetto TPersistent, che a sua volta è una proprietà del
componente, non viene visualizzato l'editor. L'editor viene visualizzato
solamente se si tratta di una proprietà del componente stesso (che comunque
mi sembra il tuo caso, ma non si sa mai).
Non so se te l'ho già chiesto, ma quale versione di Delphi hai? Negli esempi
ho fatto sempre riferimento alla mia esperienza con la versione 5, magari
con le versioni precedenti o successive si deve seguire un approccio
diverso.
Un'altra indicazione: il costruttore Create() della classe discendente da
TCollection accetta un parametro Owner di tipo TPersistent, a cui io passo
l'istanza del componente che la crea. Memorizzo quel riferimento in un campo
della classe TCollection per restituirlo come valore del metodo GetOwner
della Collection.
=== CODE ===
{ Collection }
constructor TRafControls.Create(AOwner: TPersistent);
begin
    inherited Create(TRafControlItem);
    FOwner := AOwner;
end;
function TRafControls.GetOwner: TPersistent;
begin
  Result := FOwner;
end;
{ Component }
constructor TRafComponent.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    FRafControls := TRafControls.Create(Self);
end;
=== CODE ===
Prova a controllare che ci sia questa implementazione. Senza questo
accorgimento, Delphi si rifiutava di visualizzarmi l'editor e presentava
spesso messaggi di errore.
Ciao!
