Newsgroup: it.comp.lang.delphi
Titolo: Domandone sulla creazione di form a run-time

Ciao a tutti. Nella mia applicazione ho creato un form che non viene
caricato subito quando eseguo il programma bensi solo quando scelgo io di
attivarlo, in sostanza un form che viene creato a run-time.
Quando scelgo l'opzione del programma che mi fa caricare questo form, io
devo andare a settare una etichetta con un certo valore. il fatto č che
quando compilo il seguente codice mi viene dato errore:
form1:=Tform1.create(nil);        //tutto bene
form1.edit1.caption:='valore da settare';    //qui mi dice che edit1 non č
dichiarato anche se il form che ho creato contiene quest'oggetto
form1.showmodal;
form1.free;
Domanda:
Come posso inserire il valore in quella edit all'interno del form che vado a
creare a run-time?
Grazie
Davide

 ha scritto nel messaggio
news:b8rtqo$g5d$1...@le1.cs.unibo.it...


 dichiarato anche se il form che ho creato contiene quest'oggetto
Caption non è una prop di TEdit ma di TLabel........
A.


    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)

 dichiarato anche se il form che ho creato contiene quest'oggetto
Form1.Edit1.Text:= 'Valore da settare';
Ciao.

 classe di TForm1.
Dunque, ti spiego meglio cosa ho fatto. Volendo liberare ram decido che il
form che prima caricavo sin da subito ora lo creo solo quando serve. Questo
fomr contiene una maskedit, 2 bottoni e un campo edit non visibile. Il form
era già creato, semplicemente sono andato sulla voce Options del menu
Project e ho tolto il suddetto form dalla creazione automatica all'avvio del
programma. Nella procedura che fa uso di questo form ho inserito le righe
seguenti:
      form18:=Tform18.create(nil);
      form18.Edit1.Text:='sblocca';
      form18.ShowModal;
      form18.free;
form18 è di tipo TForm dichiarata come public. A questo punto nella uses del
form principale vado ad inserire il modulo che mi contiene il suddetto form
(quello che vado a creare al volo). In questo modo il form mi viene creato
correttamente ma quando arrivo a compilare l'assegnamento mi viene dato il
seguente errore:
Undeclared identifier Edit1
Nel form18 effettivo (quello per intenderci che vado ad includere nel form
principale) edit1 è nella lista degli oggetti presenti nel form. Ti posto il
codice della dichiarazione degli oggetti di questo form
type
  TForm18 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    MaskEdit1: TMaskEdit;
    Label1: TLabel;
    Edit1: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Ho anche provato a dichiarare edit1 nella parte public ma l'errore resta....
Mi sono spiegato? Chiedi pure se non capisci
Davide

> Caption non è una prop di TEdit ma di TLabel........
si, scusami ma mi ero sbagliato, nel programma comunque è scritto giusto
Davide

 questo modo i form e non so cosa intendi con "Application"
Application è una variabile dichiarata nella unit Forms che rappresenta
l'applicazione Windows stessa; il suo compito fondamentale è la raccolta
dei messaggi e deve essere specificata come Owner dei form che crei
tramite il metodo Create() poichè, in questo modo, tale classe provvede
alla distruzione del form se quest'ultima non è esplicitamente scritta
nel tuo codice.
Per il problema dell'errore su Edit1, trovi la spiegazione in uno dei
casi che ti ho elencato dicendoti "a meno che Form1 non appartenga ad un
tipo diverso da TForm1"...
Se la tua variabile "form18" è di tipo TForm, non riuscirai mai ad
accedere a Edit1, poichè la classe TForm da cui discende la classe del
tuo form personalizzato non fa alcun riferimento ad Edit1.
Affinchè tutto funzioni, devi utilizzare una variabile di tipo TForm18,
oppure "castare" la variabile form18 come se fosse TForm18 invece di
TForm.
========================================
  (form18 as TForm18).Edit1.Text := '......';
========================================
Cerco di spiegarti meglio: una variabile di tipo TForm può accettare
riferimenti ad istanze (oggetti) di classi TForm e di tutti i suoi
discendenti, quindi anche riferimenti a TForm18, che eredita da TForm.
Tuttavia, essendo comunque di tipo TForm, non puoi utilizzarla come se
fosse un riferimento a TForm18 in modo esplicito senza fare un casting
(vedi codice sopra); devi informare Delphi che vuoi trattare tale
riferimento a TForm come un riferimento ad un oggetto che appartiene ad
una classe discendente da TForm (TForm18) usando l'operatore "as" ,
dopodichè puoi accedere a tutti i membri che fanno parte del tipo
TForm18.
Puoi anche scrivere il cast in questa forma:
========================================
  TForm18(form18).Edit1.Text := '......';
========================================
ma l'operatore "as" è più sicuro perchè controlla il grado di parentela
tra le classi prima di procedere...in caso contrario, il cast forzato
potrebbe farti incappare in qualche errore di Access Violation o
altro...
Spero di averti spiegato il problema...anche se in modo un po'
criptico...



Altro che criptico, mi sei stato di TROPPO aiuto, ora funziona come deve,
grazie 1000 e speriamo a buon rendere in un futuro prossimo
Saluti
Davide