Newsgroup: it.comp.lang.delphi
Titolo: [Kylix] [newbie] [lungo] Cancellare un oggetto che eredita da un'interfaccia

Ciao,
sto giocando con il Kylix 2 Open Edition e devo dire che mi diverto un 
sacco...
Volevo sperimentare un po' con classi, oggetti ed ereditarietà e così ho 
creato un form che ha tre pulsanti ("Su", "Giù" e "Azione") e poi ho 
scritto questa roba:
(* Interfaccia per la definizione della modalità di funzionamento del form.
   Deve essere un qualche tipo di Design Pattern, di tipo obj-behav, di cui
   non ricordo il nome... :-) Cmq è la classica situazione in cui delego un
   particolare comportamento ad una classe aggregata della classe che
   invoco direttamente.
*)
type Modalita = interface (IInterface)
    (* Restituisce il nome della modalità, per sapere in che
       modalità sta funzionando il form*)
    function nomeModalita:string;
    (* Il caption del pulsante che esegue l'azione *)
    function CaptionAzione:string;
    (* Quello che succede quando si preme il pulsante principale del form *)
    procedure Azione;
    (* Quello che succede alla pressione del tasto Su *)
    procedure TastoSu;
    (* e quello che succede quando premo il tasto Giù *)
    procedure TastoGiu;
end;
(* Userò questa classe per far comportare il mio form doppio come
   un form per il riordinamento delle immagini.
*)
type ModalitaSpostamento = class (TInterfacedObject, Modalita)
    function nomeModalita:string;
    function CaptionAzione:string;
    procedure Azione;
    procedure TastoSu;
    procedure TastoGiu;
end;
Infine ho messo come attributo della classe del form la variabile:
    modalitaFunzionamento: Modalita;
L'idea è quella di creare diverse classi simili a ModalitaSpostamento, una 
per ogni diverso comportamento che voglio dare al form; poi quando faccio 
aprire il form utilizzo una procedura per instanziare un oggetto di una di 
queste classi e la assegno a modalitaFunzionamento, in questo modo:
modalitaFunzionamento:=ModalitaSpostamento.Create;
Infine per ogni pulsante del form metto una procedura simile a questa:
procedure TFormDoppio.BitBtnSuClick(Sender: TObject);
begin
    modalitaFunzionamento.TastoSu;
end;
In questo modo realizzo il mio comportamento multiplo.
La cosa strana è che funziona! :-) Quando premo i pulsanti il form esegue 
le procedure contenute nella classe ModalitaSpostamento (è l'unica che ho 
fatto fin'ora...).
Ho solo un problema: alla chiusura del form vorrei cancellare l'oggetto che 
ho instanziato all'apertura del form e che ho assegnato a 
modalitaFunzionamento.
modalitaFunzionamento.Destroy non funziona perchè Destroy non appartiene 
alla classe Modalita. Allora ho provato a mettere in Modalita una procedura 
Distruggi, ed a implementarla nella mia classe ModalitaSpostamento in 
questo modo: 
procedure ModalitaSpostamento.Distruggi;
begin
    Self.Destroy;
end;
Non funziona nemmeno così, mi viene restituito il seguente errore: "Project 
Renamer raised exception class EInvalidPointer with message 'Invalid 
pointer operation'".
Ho cercato in lungo e in largo nella documentazione un esempio su una 
situazione simile alla mia ma non sono riuscito a trovare niente.
Mi spiegate come posso fare a cancellare questo oggetto?
Grazie.
Ciao.
-- 
MacMan

 situazione simile alla mia ma non sono riuscito a trovare niente.
Ho idea che ci pensi qualcun altro a chiamare Destroy sulla tua classe.
modalitaFunzionamento è un campo di un TForm, che discende da TComponent,
come tutto ciò che si inserisce a design-time; quando viene distrutto il
tcomponent(se fa parte dell'interfaccia creata a design-time ci pensa
Delphi), vengono distrutti tutti gli oggetti presenti nei suoi campi,
compreso il tuo; semplicemente, non chiamare destroy, ci pensa Kylix! Prova
se funziona; per controllare se hai memory leak(perdite di memoria),
aggiungi alla classe modalitaspostamento un array che occupi svariate decine
di mega, e avvia il programma più volte; se il sistema rallenta, allora hai
un memory leak, se no tutto Ok. Se vuoi chiamare comunque il distruttore,
allora la variabile oggetto non deve essere un campo del form come nel tuo
caso, ma una variabile, ad esempio, globale alla unit, cioè dichiarata
insieme alla variabile del form nella sezione interface della unit.
COmunque, ti consiglio di lasciar fare a Kylix. Ciao e grazie(ho imparato
qualcosa anch'io).
--
Paolo Giarrusso
Per rispondere togliere solo "TOGLIMI" dall'indirizzo, non _spam.

 imparato qualcosa anch'io).
Grazie a te.
Ciao.
-- 
MacMan