PDA

Visualizza la versione completa : [DELPHI] Aprire una form dal suo nome


Nettuno95
18-07-2012, 09:58
Come dal titolo,
In una variabile di tipo stringa ho il nome della form:
sNome := 'Form1';
come faccio a creare 'al volo' la form?
qualcosa del tipo

var oForm:TForm
begin
oForm := <snome>.create(self);
oForm.show;
end;
N.

Nettuno95
18-07-2012, 11:14
Mi rispondo da solo, ad uso di chi ne avrÓ (??) bisogno... spulciando la VCL e l'help di delphi, il quale recita:
Call GetClass to obtain a class from a class name. This class can be used as a parameter to routines that require a class.
The Class must be registered before GetClass can find it.

Dunque da queste 2 righe sono risalito a questo codice:


Procedure ApriForm(sNome: String);
Var oForm: TForm;
oClass:TFormClass;
begin
oClass := TFormClass(GetClass('T'+sNome));
if Assigned(oClass) then
begin
oForm := oClass.Create(Self);
oForm.Show;
end;
end;


la chiamata:


ApriForm('Form1');


Ovviamente nella form l'ultima riga dovrÓ essere il register della classe 'form'



Initialization
RegisterClass(TForm1)
Finalization
UnregisterClass(TForm1)

alka
18-07-2012, 15:53
Innanzitutto, ottima ricerca: la risposta che hai ottenuto Ŕ quella corretta. :)

Volendo approfondire la problematica, come mai hai bisogno di risalire a un Form mediante il nome?

Te lo chiedo per capire se la tua esigenza pu˛ essere risolta in altro modo, visto che in tanti anni non mi Ŕ mai capitato di doverlo fare (o meglio, ho adottato architetture che presupponevano altre operazioni pi¨ complesse, ma gestite in ogni caso dal framework).

Nettuno95
18-07-2012, 18:19
Volendo approfondire la problematica, come mai hai bisogno di risalire a un Form mediante il nome?


Il tutto Ŕ nato dal voler costruire un menu partendo da una tabella di un DB per poi caricarlo a run time in modo da avere un men¨ dinamico, senza ricompilare l'eseguibile, e in base a vari utenti o diritti o qualsiasi altra cosa mi possa venire in mente.
L'idea mi Ŕ sembrata abbastanza buona, ma ovviamente quando seleziono una voce che implica l'apertura di una form non ho niente di tangibile, ma solo il nome della form scritta dentro un campo della tabella e da qui l'esigenza di estrarre la classe e aprire la form.

Il prossimo passo che sto cercando di risolvere, ma non volevo postarlo qui sul forum evitando una seconda figura da 'Pinguino' Ŕ eseguire un metodo/funzione partendo sempre da una stringa, il tutto ovviamente si ricollega sempre a voci di men¨ in quanto a volte ho bisogno di aprire una form, ma altre volte posso aver bisogno semplicemente di lanciare una funzione...

N.

alka
18-07-2012, 19:01
Originariamente inviato da Nettuno95
Il tutto Ŕ nato dal voler costruire un menu partendo da una tabella di un DB per poi caricarlo a run time in modo da avere un men¨ dinamico, senza ricompilare l'eseguibile, e in base a vari utenti o diritti o qualsiasi altra cosa mi possa venire in mente.

Ok, allora direi che hai scelto la strada pi¨ semplice e immediata per i requisiti che hai esposto sino ad ora. :)

Nettuno95
18-07-2012, 21:32
Originariamente inviato da alka
Ok, allora direi che hai scelto la strada pi¨ semplice e immediata per i requisiti che hai esposto sino ad ora. :)

Bene detto da una persona che delphi praticamente inizia ad usarlo a colazione ... spero sia un complimento :)

N.

Loading