Newsgroup: it.comp.lang.delphi
Titolo: Eredità di procedure

Il problema in cui mi sono imbattuto è ereditare "n" funzioni da una classe
esterna, ossia: ho una MDIForm che gestisce una quindicina di MDIChild che
utilizzano le stesse funzioni (sono tutte form di configurazioni).
Ciò di cui necessito è controllare il child aperto tramite il FormMain,
richiamandone la funzione.
es. 
Procedure TMDIFormMain.TastoInserimentoClick;
Var MyChildForm : TForm;
Begin
  MyChildForm := ActiveMDICHild; // in questo modo MyChildForm diventa il mio
child attivo
  MyChildForm.Inserisci; // e qui nasce il problema... non mi vede la funzione
inserisci che ho immesso tra le public del form child
End;
Grazie a tutti, 
Dario
-- 
Posted from  [217.57.169.196] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Il problema è che cerchi di richiamare TForm.Inserisci che non esiste.
Quindi, o dichiari MyChildForm del tipo delle form Child per cui hai
definito Inserisci oppure fau un cast esplicito del tipo:
TMiaFormChild(MyChildForm).Inserisci.
Sempre che tu abbia definito un gerarchia "furba" ossia.
TForm<--TMiaFormChild<----"tutte le child"
La strada giusta sarebbe stata quella di definire in TMiaFormChild il metodo
inserisci, che potrebbe anche essere abstract, tanto lo implementi poi nei
figli.
Rileggendo mi rendo conto di non essere stato chiarissimo, anzi! ;o)
Spero di averti almeno messo una pulce nell'orecchio.
Ciao,
G.

 G.
ho capito più o meno... più meno che più... insomma, tutte le mie child
derivano
da una Form dalla quale ereditano alcune procedure. Ok, il problema di fondo è
che sul MDIForm io non posso vedere le procedure "inesistenti" che ho
dichiarato
sui child... ma ci sarà pur un metodo per farle visualizzare! Come si
utilizzano
i metodi abstract?
grazie 


 grazie
Consiglio:
type TMieFormChild =class(Tform)
public
  procedure Inserisci(var MieiParametri: Variant); virtual; abstract;  //
Non effettivamente implementato
end;
e poi definisci le tue Child come
type TMiaParticolareChild=Class(TMieFormChild)
....
public
    procedure Inserisci(var MieiParametri: Variant); override;  // Definisci
effettivamente il metodo
end;
Alla fine la tua procedura diventa:
Procedure TMDIFormMain.TastoInserimentoClick;
 Var MyChildForm : TMieFormChild ;
Begin
  MyChildForm := ActiveMDICHild;
  MyChildForm.Inserisci; // Chiama l'Inserisci del tuo particolare Child
 End;
G.

Consiglio:
 
type TMieFormChild =class(Tform)
public
  procedure Inserisci(var MieiParametri: Variant); virtual; abstract; 
end;
 
e poi definisci le tue Child come
type TMiaParticolareChild=Class(TMieFormChild)
 ....
 public
   procedure Inserisci(var MieiParametri: Variant); override; 
 end;
 
Alla fine la tua procedura diventa:
 
Procedure TMDIFormMain.TastoInserimentoClick;
Var MyChildForm : TMieFormChild ;
Begin
  MyChildForm := ActiveMDICHild;
  MyChildForm.Inserisci; // Chiama l'Inserisci del tuo particolare Child
End;
G.
Grazie mille.... ma ho ancora un problema! ;) 
ActiveMDICHild restituisce un TForm, non un TMieFormChild... e non posso 
dichiarare MyChildForm : TForm perchč ovviamente non mi riconosce piů la
procedura Inserimento. Stessa cosa se io dichiaro MyChildForm := ActiveMDICHild
As TFrmAmbienteGenerico;
In questo caso non riconosce la chiamata alla funzione Override del figlio...
So di essere un rompi ma non č colpa mia se sono scarso!!! :(
Cmq grazie per gli aiuti!



...allora facciamo un cast. La seguente divrebbe funzionare.
Procedure TMDIFormMain.TastoInserimentoClick;
 Var MyChildForm : TForm ;
 Begin
   MyChildForm := ActiveMDICHild;
   (MyChildForm as TMieFormChild).Inserisci; // Chiama l'Inserisci del tuo
particolare Child
 End;
Non preoccuparti. Fai domande finchè vuoi, siamo tutti sulla stessa barca...
;o)