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

ciao a tutti, 
sapete dirmi in cosa sbaglio : 
 TFieldWhere = class(TCollectionItem)
  strict private
    FNameField : String;
    FTypeField : TFieldType;
  protected
    function GetDisplayName : String; override;
  public
    procedure Assign(Source: TPersistent); override;
  published
    property NameField : String read FNameField write FNameField;
    property TypeField : TFieldType read FTypeField write FTypeField;
  end;
 TListFieldWhere = class(TCollection)
  strict private
    FOwner : TComponent;
  protected
    function GetOwner : TPersistent; override;
    function GetItem(Index: Integer): TFieldWhere;
    procedure SetItem(Index: Integer; Value: TFieldWhere);
    procedure Update(Item: TFieldWhere);
  public
    constructor Create(AOwner : TComponent);
    function Add : TFieldWhere;
    function Insert(Index: Integer): TFieldWhere;
    property Items[Index: Integer]: TFieldWhere read GetItem write SetItem;
  end;
Rino.

Rino.
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

 
ecco il problema....:
[Warning] ListField.pas(27): W1010 Method 'Update' hides virtual method of
base type 'TCollection'
[Warning] ListField.pas(56): W1010 Method 'Update' hides virtual method of
base type 'TCollection'
[Warning] ListField.pas(84): W1010 Method 'Update' hides virtual method of
base type 'TCollection'
[Warning] ListField.pas(115): W1010 Method 'Update' hides virtual method
of base type 'TCollection'
[Warning] ListField.pas(148): W1010 Method 'Update' hides virtual method
of base type 'TCollection'
Ciao 
Rino.

 [...]
La classe base *TCollection* introduce un metodo /Update/ dichiarato 
come *virtual*. Il warning ti segnala che, non ridefinendo il metodo 
ereditato con la direttiva *override*, il tuo nuovo metodo introdotto 
nella classe discendente con lo stesso nome nasconde quello ereditato, 
interrompendo la "catena".
Dichiara il metodo con la direttiva *override*, usando ovviamente un 
parametro compatibile con quello richiesto dalla versione 
ereditata...oppure, se è proprio tua intenzione ridefinire tale metodo e 
nascondere quello ereditato, usa la direttiva *reintroduce* per 
disabilitare il warning segnalando al compilatore che hai preso atto dei 
possibili effetti collaterali. :-)
Ciao,
   Marco.


ok, grazie mille.
Però quello era solo uno dei problemi riscontrati.
Quando in una classe ho una property del genere :
    property ListFieldWhere : TListFieldWhere read FListFieldWhere write
FListFieldWhere;
e nella sezione private ho :  
    FListFieldWhere : TListFieldWhere;
    procedure SetListFieldWhere(const Value: TListFieldWhere);
 
questo è l'hint restituito : 
[Hint] CLNInsUpDel.pas(47): H2219 Private symbol 'SetListFieldWhere' declared
but never used
Non mi meraviglio, poichè effettivamente io non lo richiamo mai.
Ma, poichè l'esempio di come creare una property collection l'ho preso 
da un libro, e sul libro così faceva, come posso risolvere il problema?
Ciao
Rino

 da un libro, e sul libro così faceva, come posso risolvere il problema?
Utilizza il metodo /SetXXX/ per l'assegnazione del valore della 
proprietà nella dichiarazione al posto del riferimento diretto al campo 
privato che ne contiene il valore.


 
Ciao 
RIno

 property myList : TmyList read FmyList write SetmyList;
Sì, anche se l'assegnazione di una lista fatta in quel modo mi 
preoccupa: dipende da come è implementato il metodo /SetMyList/.
Comunque, cerca di capire il meccanismo, poi il codice dovrebbe servire 
solo per chiarire: non limitarti a copiarlo senza dare comunque il 
giusto peso alla "teoria" che vi gira attorno.


 
Ciao 
Rino

 è questo che sto cercando di fare..... con il tuo, ed il vostro aiuto!
Ok... ;-)
