Newsgroup: it.comp.lang.delphi
Titolo: Creazione form dinamicamente

E' possibile creare delle form dinamicamente scrivendo una procedura sola.
Ad esempio fate finta di avere 3 bottoni denominati Pippo, Pluto e Paperino.
Ora pensate di aver progettato già 3 form TPippo, TPluto e TPaperino.
 E' possibile realizzare una procedura che dato il nome della classe TPIPPO,
TPLUTO o TPAPERINO mi riesca a creare la form che gli passo?
Grazie

 TPLUTO o TPAPERINO mi riesca a creare la form che gli passo?
A mio avviso, il metodo più "pulito" per ottenere una funzionalità di 
questo tipo è derivare tutte le form da una classe base comune
   TMyBaseForm = class(TForm)
e creare in seguito un tipo simile al seguente
   TMyBaseFormClass = class of TMyBaseForm;
In questo modo, sarà possibile creare un metodo che abbia un parametro 
del tipo citato il quale identifica la classe di appartenenza del form 
che deve essere creato:
   procedure TMainForm.CreateAnotherForm(
     BaseFormClass: TMyBaseFormClass );
   var
     BaseFormInst: TMyBaseForm;
   begin
     BaseFormInst := BaseFormClass.Create(nil);
     try
       BaseFormInst.ShowModal;
     finally
       BaseFormInst.Free;
     end;
   end;
Supponendo che, sfruttando la Visual Form Inheritance, siano state 
create le form TMickeyForm, TGoofyForm e TDonaldForm
   TMickeyForm = class(TMyBaseForm);
   TGoofyForm = class(TMyBaseForm);
   TDonaldForm = class(TMyBaseForm);
E' possibile creare un'istanza di queste classi richiamando il metodo 
CreateAnotherForm e passando come parametro il tipo corrispondente:
   CreateAnotherForm(TMickeyForm);
   CreateAnotherForm(TGoofyForm);
   CreateAnotherForm(TDonaldForm);
Cerca di approfondire il concetto, piuttosto che soffermarti 
sull'esempio pratico in se...credo possa esserti utile per risolvere il 
tuo problema.
P.S.: non ho verificato il codice a livello di compilazione, ma dovrebbe 
essere formalmente corretto.
Ciao! :-)
-- 
Marco «Alka» Breveglieri
  ABLS Team S.n.c. - Software & Web
  Via De Gasperi, 14
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

   TDonaldForm = class(TMyBaseForm);
Dato che ai Class reference, in Delphi, si applica la stessa regola di 
compatibilità che si applica ai tipi di classe, ad una variabile di questo 
tipo si potrebbe assegnare la specifica classe *rappresentata* oppure una 
sottoclasse.
In questo caso basterebbe utilizzare una procedura come la seguente:
procedure CreateAnotherForm(AFormClass: TFormClass);
   var
     BaseFormInst: TForm;
   begin
     BaseFormInst := AFormClass.Create(nil);
     try
       BaseFormInst.ShowModal;
     finally
       BaseFormInst.Free;
     end;
   end;
Acqua 

 sottoclasse.
Giusto, forse potevo evitare il passaggio della creazione di un nuovo 
tipo Class Reference per semplificare ulteriormente l'esempio...ma la 
mia indole object oriented č indomabile. :-)


 ha scritto nel messaggio
news:Duz5d.475$35.5...@news4.tin.it...

Giusto una curiosità... l'uso di una cosa del genere potrebbe risultare
sicuramente comodo ma nel caso in cui dovessi fare delle operazioni sulla
form che ho creato dinamicamente prima dello show ?
e se le dovessi fare dopo lo show prima della free ?

      BaseFormInst := AFormClass.Create(nil);
Per usi semplici, ok.
Ma se devi referenziare qualcosa esposto da TFormClass, occorre un cast 
da BaseFormInst a TFormClass.
AS


Ciao a tutti ...
Non so se questa è la soluzione che cerchi
type
  TFormClass = class of TForm;
....
uses U_Pippo;  // pas della form
......
procedure TForm1.Button1Click(Sender: TObject);
Var oForm: TFormClass;  // variabile di tipo form
     oForm1: TForm;  // appoggio
begin
   oForm := TFormClass(FindClass('TPippo'));  // mi dovrebbe ritornare
l'istanza
   oForm1 := oForm.Create(Self);
   oForm1.ShowModal;
end;
......
Initialization
  RegisterClasses([TPippo]);
Saluti
^_Goblin_^

 Grazie
Ciao,
Andrea