Newsgroup: it.comp.lang.delphi
Titolo: [Lungo]Ancora Componenti Grafici (TCustomControl)

Salve a tutti,
Ho ancora qualche piccolo intoppo con la realizzazione di un componente
visuale.
Allora, posto che il controllo debba poter ospitarne altri (già fatto), mi
si presentano le seguenti
necessità:
1) Impedire che un altro componente possa essere inserito in quello da me
fatto, in una posizione qualsiasi.
    In altri termini, esiste una barra di intestazione che non dovrebbe mai
essere coperta da altra roba.
Questa cosa l'ho risolta così nel metodo Paint:
    for i:=0 to ControlCount-1 do
    begin
        if Controls[i].Top<rectIntestazione.Bottom then
            Controls[i].Top:=rectIntestazione.Bottom+2;
        if Controls[i].Left<rectIntestazione.Left then
            Controls[i].Left:=rectIntestazione.Left+2;
    end;
rectIntestazione è il rettangolo che definisce forma e posizione
dell'intestazione (quella che non
dovrebbe mai essere nascosta).
Funziona anche se non come vorrei. Infatti, non appena ci metto sopra un
TButton ad esempio,
e lo lascio proprio lì sull'intestazione (che carogna :) ), in prima istanza
non accade nulla.
Ovviamente al primo Paint tutto va come dovrebbe.
Mi/Vi domando, c'è un modo per sistemare la cosa oppure mi devo scomporre
l'intestazione ed il corpo
in due componenti distinti?
2) Non mi funziona correttamente l'allineamento del mio controllo a quello
Parent.
    La proprietà Align non la posso utilizzare ereditandola dal
TCusomControl così com'è.
    Tutto questo perchè ho dei vincoli sulle dimensioni minime e
sull'altezza massima del mio controllo.
    Se cerco di utilizzare Align standard, mi crea casini quando la imposto
a alClient inquanto cerca
    di cambiare l'altezza del controllo oltre il massimo consentito (con
conseguente sfarfallio).
    ** non ho ancora provato a giocare con le Constraints **
    Ho provato a ridefinire il funzionamento di Align, e con gli
allineamenti: None,Left,Right va benone.
    Con alTop ed alBottom funziona maluccio perchè:
    2.1) Allinea il controllo in alto od in basso, ma non tiene conto dello
ZOrder nè di altri componenti
           con lo stesso tipo di allineamento.
    2.2) Se trascino il componente dopo l'allineamento, esso beatamente si
posiziona dove l'ho lasciato
            fregandosene del tipo di allineamento specificato.
Scusate se sono stato poco chiaro e grazie per il Vs interessamento.
Saluti,
Carmine


    ABLS Team (
www.abls.it
)

 :-)
Si tratta di un componente piuttosto stupido :) In effetti è un contenitore
per altri componenti
visuali, con la caratteristica di essere a "scomparsa".
Doppio click sull'intestazione si apre, dinuovo doppio click e si chiude.
Ha la possibilità di associare un glifo a sinistra della caption. Glifo che
può essere un semplice "+/-" tipo
TreeView, oppure un icona. Nell'ultimo caso, si può impostare uno dei due
seguenti stati: Selezionato,
Disabilitato.
Ha la cataerva classica di eventi dei controlli visuali.
Avrei pensato anche alla possibilità di aggiungere dei "temi" al componente,
ma non so quanto
possa essere appetibile, vista la spartanità del tutto. :)
Tutto questo "casino" per risparmiare un pò di spazio sullo schermo :)
Saluti,
Carmine


Ti ho chiesto il motivo per il quale realizzavi quel controllo perchè mi
sembrava abbastanza simile ad un controllo che ho realizzato io. Anche il
mio scopo era quello di risparmiare spazio sullo schermo nella realizzazione
di un'interfaccia utente. Praticamente, ho realizzato una copia Delphi dei
pannellini che si trovano nelle edizioni MX delle applicazioni Macromedia
(Flash, DreamWeaver, ecc.).
Un tempo avrei optato anche io per un TCustomControl, ma con l'esistenza dei
Frame risulta molto più comodo realizzare quella interfaccia inserendo i
controlli di cui è composta all'interno di quel tipo di finestre. Spiego
brevemente cosa ho fatto: ho creato un package runtime in cui ho inserito un
frame che rappresenti il mio pannello espandibile; ho inserito al suo
interno un TPanel per l'instestazione in cui venga visualizzato il titolo
della finestra, un'icona ed eventuali pulsanti per l'aggiunta di un menu
popup, in modo del tutto simile all'interfaccia di Macromedia Flash.
Alla mia classe derivata da TFrame ho aggiunto diverse proprietà (Expanded,
ExpandedHeight, AdvancedMenu...) affinchè fossero visibili a designtime. A
differenza della tua implementazione, sono stato molto più permissivo: non
ho effettuato alcun controllo di posizionamento sui controlli visuali
figli...se lo sviluppatore mi inserisce un componente nel pannello di
intestazione (che non verrebbe comunque salvato) cavoli suoi! ;-)
Per concludere, ho creato un package designtime (lo faccio per abitudine)
che includa il package runtime e registri il Frame come nuovo componente.
Dopodichè, basta posizionarlo sul form, allinearlo in alto in un pannello,
magari inserendone più di uno...e il gioco è fatto. :-)
In definitiva, credo che per il tuo scopo sia più rapido un Frame per lo
sviluppo.


 sviluppo.
Delle volte, la natura umana è strana. Ho già usato i frame ma, questa
volta,
chissà perchè, mi sono proprio sfuggiti di mente...colpa di Delphi3 con cui
ho lavorato per parecchio.
Comunque, ormai sono l'ho quasi ultimato. Magari, per sfizio, proverò ad
implementarne una versione anche con i frame.
Saluti,
Carmine