Newsgroup: it.comp.lang.delphi
Titolo: Classe o puntatore

Salve a tutti,
devo creare un discendente di TList e vorrei sapere se il Tipo degli
"Items" al suo interno sono puntatori o classi:
qualcuno saprebbe come riuscire a fare la cosa? 
ogni suggerimento sarŕ apprezzato grazie in anticipo.
Alfio
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Alfio
se ci spiegassi meglio cosa vorresti farci con la classe ereditata
magari ti potremmo dire come fare :P
	Ciao
	MassimoB
 

nel frattampo grazie per l'interessamento,
il problema non è nelò typecasting e non mi serve sapere 
il tipo di item che la lista "colleziona" 
ma solo se questo è un puntatore(Generico o Tipizzato)
o una classe(TPersistent o TComponent) 
(..di seguito la classe derivata)
TAutoEmptyList = class(TList)
  private
    { Private declarations }
    FItemIsPointer: Boolean;
    FItemIsObject: Boolean;
  public
    { Public declarations }
    constructor Create;
    destructor Destroy; override;
    {*************************************************}
    {* Dove vorrei effettuare il controllo           *}
    function Add(Item: Pointer): Integer;
    {*************************************************}
    procedure DisposePointers;
    procedure FreeObjects;
    property ItemIsPointer: Boolean read FItemIsPointer;
    property ItemIsObject: Boolean read FItemIsObject;
  end;
[...]
function TAutoEmptyList.Add(Item: Pointer): Integer;
begin
  {*********************************************************}
  //controllo se Item è un derivato di TPersistent/TComponent
  if (Item is TPersistent) or (Item is TComponent) then
    FItemIsObject:= True;
  {**************************ERRORE*************************}
  {**********************************************************}
  //visto che Item è già di default un puntatore 
  FItemIsPointer:= not FItemIsObject;
  {**********************************************************}
  //Add è una funzione statica quindi non faccio l'override;
  Result := inherited Add(Item);
end;
constructor TAutoEmptyList.Create;
begin
  inherited Create;
  FItemIsPointer:= False;
  FItemIsObject:= False;
end;
destructor TAutoEmptyList.Destroy;
begin
  if FItemIsPointer then
    DisposePointers;
  if FItemIsObject then
    FreeObjects;
  inherited;
end;
procedure TAutoEmptyList.DisposePointers;
var I: Integer;
    P: Pointer;
begin
  if Count > 0 then
    for I := ItemCount - 1 downto 0 do
    begin
      P := Pointer(Items[I]);
      Items[I] := nil;
      Dispose(P);
    end;
end;
procedure TAutoEmptyList.FreeObjects;
var I: Integer;
    O: TObject;
begin
  if Count > 0 then
    for I := ItemCount - 1 downto 0 do
    begin
      O := TObject(Items[I]);
      Items[I] := nil;
      FreeAndNil(O);
    end;
end;
spero di essere stato ababstanza chiaro!!!


Alfio
	Ciao
	MassimoB
 

Allora ho letto questa cosa nel codice sorgente ma semplicemente volevo
poterlo fare in base alle variabili di esistenza
( FItemIsObject o FItemIsPointer) e la funzione count 
per risparmiare cicli qualora la lista fosse stata vuota(stupido ma  
se la macchina su cui gira l'applicazione avesse una memoria 
di lavoro limitata? Pensai???)
Sicuramente la tue ragioni sono fondate ma nonostante avessi cercato 
qualcosa nell'help che estendesse la TList per lavorare con i 
discendenti di TObject non avevo trovato nulla, 
quindi grazie per la dritta!
Nello scrivere avevo cercato di trovare le parole che piů si
avvicinassero
alla mia idea, cercherň la prossima volta di essere piů attento con le
mie
parole: grazie ancora.
