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!