Creare un form dinamicamente partendo dal nome

di il
1 risposte

Creare un form dinamicamente partendo dal nome

Ciao a tutti, vi chiedo un aiuto per una cosa :
Ho una classe ereditata da Tform che si chiama TMyForm e un bottone ereditato TmyButton.

quello che vorrei riuscire a fare è:
aggiungere una proprietà a tmybutton -> Formname di tipo TmyForm

in modo che a runtime si possa creare la pagina Tmyform (che sarà stata creata precedentemente e che si chiama per esempio "pippo"),

la proprietà formname al button l ho messa ma a design non fa impostare "pippo", non "vede" le TMyform del progetto diciamo.

- un altra soluzione sarebbe dare una proprieta formname al bottone di tipo stringa e poi dalla stringa "pippo" dovrei risalire al tmyform "tpippo", ma anche qui non riesco a trovare la tmyform partendo dal nome.

Ho provato coi vari findclass, getclass ma nulla.
qualche suggerimento?

1 Risposte

  • Re: Creare un form dinamicamente partendo dal nome

    yarendil ha scritto:


    aggiungere una proprietà a tmybutton -> Formname di tipo TmyForm
    in modo che a runtime si possa creare la pagina Tmyform (che sarà stata creata precedentemente e che si chiama per esempio "pippo")
    L'obiettivo è abbastanza chiaro, ma c'è un po' di confusione: se hai una finestra TMyForm, non può chiamarsi "pippo", sempre se stiamo parlando della proprietà Name, che è direttamente collegata appunto al nome della classe.

    yarendil ha scritto:


    la proprietà formname al button l ho messa ma a design non fa impostare "pippo", non "vede" le TMyform del progetto diciamo.
    Mi sarei stupito del contrario: come fa l'IDE di Delphi a "indovinare" che tu vuoi valorizzare quella proprietà con il nome di un Form?

    Una associazione di questo tipo è possibile solo : a livello basilare non è difficile da implementare, ma per la tua specifica esigenza vi sono parecchie problematiche legate al fatto che dovresti risalire all'elenco dei Form assegnabili, e inoltre non devi assegnare una istanza ma il riferimento alla classe da creare.

    yarendil ha scritto:


    - un altra soluzione sarebbe dare una proprieta formname al bottone di tipo stringa e poi dalla stringa "pippo" dovrei risalire al tmyform "tpippo", ma anche qui non riesco a trovare la tmyform partendo dal nome.
    Al netto che si possa scrivere il nome di un Form errato rispetto alla soluzione precedentemente adottata (ma è anche vero che è sempre possibile cambiare il nome di un Form), questa scelta mi sembra quella più facile e immediata da realizzare, posto che tu debba ovviamente supportarla con del codice specifico (introdotto nel pulsante o altrove) per ricercare il Form, crearlo e visualizzarlo, o comunque renderlo funzionante secondo le tue esigenze.

    yarendil ha scritto:


    Ho provato coi vari findclass, getclass ma nulla.
    qualche suggerimento?
    Le funzioni che hai usato sono corrette, ma probabilmente hai dimenticato di registrare prima la classe.

    Come riportato nella , la classe deve essere "registrata" ovvero resa nota al sistema di streaming di Delphi usando la funzione .

    Idealmente, a ogni Unit del tuo progetto che contiene la definizione di un TForm personalizzato da richiamare in questo modo, dovresti aggiungere una sezione initialization in cui vai a richiamare la funzione RegisterClass passando il tipo del Form come parametro: in questo modo, quando la Unit del Form viene referenziata (direi sempre, facendo parte dell'elenco delle uses del progetto), il Form stesso si "registra" per poter essere successivamente ricercato.

    Ecco un esempio dello scheletro di una Unit che contiene un Form registrato da ricercare.
    [code=php] unit Forms.Sample; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TSampleForm = class(TForm) end; implementation {$R *.dfm} initialization RegisterClass(TSampleForm); end. Fai qualche esperimento dopo aver letto la documentazione per vedere qual è la soluzione che costituisce il miglior bilanciamento (per te) tra complessità e flessibilità.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
1 risposte