Newsgroup: it.comp.lang.c++
Titolo: Controlli complessi & C++Builder

Ho un problema con il C++ Builder... E' difficile da spiegare...
Dunque... Devo creare alcuni TabSheet(s)... Devono essere "eredi" di
TTabSheet (perchè? Perchè nel TPageControl ci sarà un numero variabile di
ognuno di essi, e li voglio poter controllare singolarmente anche quando
sono uguali)... Ogni "erede" deve avere differenti bottoni, labels, edit...
E voglio che il BCB faccia il tutto per me (nella stessa maniera in cui il
BCB "eredita" la classe TForm per creare i form... Ma io voglio che i
controlli li aggiunga al mio contenitore)
In pratica voglio essere in grado di scrivere qualcosa del genere...
TabSheetPageOne->ButtonOne->Enabled = true;
.
.
.
(il ButtonOne è un bottone del TabSheetPageOne)...
Dunque... Leggendo la guida ho scoperto che la proprietà IsControl della
classe WinControl sembra essere stata fatta apposta... Sta scritto che è
utile per creare "complex controls".... Sembrava essere la scelta giusta...
Quindi ho provato a disegnare il mio TabSheet come un form, porre IsControl
= true, salvare, ricaricare e cambiare tutte le referenze a TForm in
referenze a TTabSheet...
Quindi ho scritto qualcosa del genere (collegandolo a un bottone)
(nota: TMainForm è il Form che contiene tutto, TPagina1 è la mia sottoclasse
di TTabSheet e PageC è un'istanza di TpageControl)
void __fastcall TMainForm::NuovaClick(TObject *Sender)
{
    TPagina1 *pag = new TPagina1(this);
    pag->PageControl = PageC;
    pag->Parent = PageC;
    pag->Show();
    pag->Caption = pag->PageIndex;
}
Ma ho scoperto che i controlli contenuti nel TabSheet non vengono creati
automaticamente (il loro puntatore resta NULL)... Non sono molto felice... E
non so come uscirne fuori...
Qualcuno mi può aiutare?
Grazie
Max (
xan...@geocities.com
)

 non so come uscirne fuori...
La faccenda è un po' più complicata. Quel che c'è scritto a proposito
della proprietà IsControl sembra essere solo un brandello di documentazione su
una feature implementata a metà e poi lasciata perdere. In realtà tutta quella
contorta procedura di creare prima un Form, poi trasformarlo in un componente
"composito"` è una sorta di surrogato di un semplice expert che crei un file DFM
e inserisca nel file CPP l'istruzione #pragma "*.dfm" (che è quella che fa sì
che le cose funzionino A DESIGN TIME) per un componente "contenitore" diverso
dal Form.
Il fatto è che in questo modo manca ancora la parte runtime, cioè il meccanismo
che fa in modo che il compilatore incorpori nel codice il contenuto del file
DFM.
Per ottenere questo bisogna creare un discendente di TCustomModule, una classe
che fa parte della Open Tools API, l'interfaccia di programmazione dell'IDE di
Delphi/BCB. L'unica documentazione che conosca è quella inclusa nel file
dsgnintf.pas (che dovresti avere in $(BCB)\Source\VCL se hai la versione
professional o c/s). Non se ne parla neppure nella "bibbia" degli Open Tools
"Hidden Paths of Delphi 3".
Tuttavia, prima di addentrarti nei meandri degli Open Tools, potresti
considerare la possibilità di andarti a prendere un "pacchetto" formato da
alcuni componenti e un expert, già belli e pronti, che fanno proprio quello che
ti serve, ossia ti consentono di creare automaticamente, in maniera del tutto
analoga al Form, un componente composito. Si tratta del "Composite Components
Pack" (ccpack) di Sergey Orlik, uno che lavora alla Inprise russa, che ha
realizzato anche alcune altre cose piuttosto interessanti, tutte freeware. Tieni
presente che, se usi i componenti del ccpack, devi crearti dei discendenti di
TBox (derivato a sua volta da TCustomPanel) e inserirli nei TTabSheet,
piuttosto che direttamente dei discendenti di TTabSheet. In effetti potresti
anche provare, dato che nel pacchetto trovi il codice sorgente, a scriverti un
componente derivato da TTabSheet, prendendo come modello il codice di TBox, ma
non credo che ne valga la pena, a meno che non lo voglia fare per capire meglio
tutto il meccanismo.
La home page di Orlik è: 
http://www.geocities.com/SiliconValley/Way/9006
P.S. - Se poi ti procuri BCB 4 è ancora più semplice, perchè puoi utilizzare i
nuovi "Component Templates"
Saluti
Paolo