Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Resizeform universale

Dopo il successo del thread "resizing a diverse risoluzioni" mi è venuto in
mente di fare un modulo di resize universale. In realtà non mi interessa
solo ingrandire o rimpicciolire i controlli a runtime, ma anche
eventualmente spostarli in modo che mantengano la posizione relativa al
bordo della form.
Ho identificato la metodologia con l'idea di "agganciare" i controlli ai
bordi della form. Se agganci solo la parte in basso, il controllo scende se
la form si ingrandisce, o sale se si rimpicciolisce. Se agganci sia la parte
in alto che quella in basso, il controllo si stretcha per mantenere le
distanze dai bordi. Lo stesso ragionamento vale per l'asse X.
Per gestire l'aggancio mi sono inventato una stringa standard da inserire
nel tag del controllo in design time.
Posto la procedura esatta qui di seguito, e poi proseguo con la domanda:
 Per ogni controllo cerca nel TAG la stringa "___RES". Se la trova,
 le 4 cifre successive identificano le modalità di resize rispettivamente
per Top, Right, Bottom, Left (in senso orario a partire dall'alto)
 0 significa che il lato non ha alcun rapporto con il bordo della form
(nessun resize)
 1 Significa che il lato è collegato col bordo della form (si deve spostare
quando la dimensione si modifica)
 2 Significa che quel lato e quello opposto devono restare equidistanti dai
due bordi della form
 Esempi di TAG:
- La configurazione ___RES0110 significa che il controllo si deve mantenere
sempre alla stessa distanza
 dai bordi destro e basso della form, senza cambiare dimensione (es. i
pulsanti Ok e Annulla in basso a destra)
- La configurazione ___RES1111 significa che il controllo si deve ingrandire
o rimpicciolire
 lungo tutte le dimensioni, mantenendo quindi la stessa distanza tra i suoi
bordi e quelli della form (es. una griglia)
- La configurazione ___RES1212 significa che il controllo si deve ingrandire
o rimpicciolire
 lungo l'asse Y mantenendo la distanza dai bordi, e centrarsi sull'asse X
mantenendo le dimensioni originali
A questo punto nella form load mi salvo in una collection larghezza e
altezza della form prima del resize. Nell'evento resize chiamo una routine
standard che fa un po' di calcoli basandosi sulla nuova dimensione e sulla
posizione dei controlli rispetto alla dimensione precedente e sposta tutti i
controlli al posto giusto. Quando faccio l'unload della form scarico il suo
elemento dalla collection.
Tutto perfetto? Neppure per sogno!
Il problema sta nella dimensione della form la prima volta. Nella form_Load
mi aspettavo di trovarmi con la stessa height e width che avevo settato in
design mode, invece le form MDI figlie si aprono già con una dimensione
diversa, a secondo di quanto è grande la MDI padre. Si può risolvere
forzando durante la form load a mano nella collection le dimensioni della
form come erano in design time, ma la soluzione non è affatto elegante e
quando si modifica la form in design bisogna ricordarsi di aggiornare le
dimensioni anche nel codice della form_load.
D'altra parte il resize serve soprattutto per le form MdiChild, mica posso
ignorarle.
Avete qualche idea? Dai, che poi si mette tutto sul sito comune!
Ciao
*Roby*
P.S.
Grazie per avere letto fino a qui. 8-)

 Avete qualche idea?
La piu' stupida che mi e' venuta: le dimensioni che desideri mantenere sono
scritte nei file .FRM... giusto? Programmillo che le legge e le riporta in
un file .INI.
Ciao. Corro a nascondermi.
Maurizio


 Ciao. Corro a nascondermi.
Vieni fuori. Ho bisogno di aiuto! 8-)
Ciao
*Roby*

 modifica alla form.
Perche' non metti allora nell'evento di resize la chiamata alla routine
che scrive sull'INI ?

 che scrive sull'INI ?
Il problema è avere il valore di height e width della form come erano in
design time. Quando scatta l'evento resize, è troppo tardi e quel valore lì
te lo sei già perso.
Ciao
*Roby*

 te lo sei già perso.
in qti casi di solito uso tipo defw, defh e le definisco in (twips/px) nel
frm_load, oppure le scrivo nel registro e le recupero da li'.
poi se voglio che il frm non si riduca troppo, eventualmente anche minw,
minh:
if width < minw then width=minw (o width=defw)
sfarfalla un po' ma e' il modo piu' pulito.



 frm_load, oppure le scrivo nel registro e le recupero da li'.
Cioè ti salvi i valori da codice in due variabili e poi le usi a runtime? E'
quello che faccio anche io, ma non mi piace.
Comunque da 'sta faccenda sto imparando delle cose di VB6 che mi erano
sconosciute (magari invece tu le sapevi già, ma te le dico lo stesso):
- esiste una proprietà AutoShowChildren nella MDIForm padre che stabilisce
se quando si fa la load di una qualunque MDIChild, questa venga
automaticamente mostrata. di default è true, quindi se non la cambi non puoi
fare la Load di una MDIChild senza mostrarla a video (in VB4 non c'era
sicuramente. Non so in VB5)
- Se la MDIChild ha il bordo di tipo Sizable (2), windows determina altezza,
larghezza e posizione in fase di caricamento e se ne frega di quello che
avevi settato tu in editing del progetto. Se invece il bordo non c'è o è
fisso, le dimensioni restano quelle che hai settato in editing. Il bello è
che se ad una MDIChild senza bordo mandi da codice il comando di
massimizzarsi, compare anche il gadget di ripristino in alto a destra, ma
quando lo premi ti ritrovi di nuovo con una form non ridimensionabile.
- Il vate massimo Francesco Balena ha fatto anche lui un OCX di gestione del
resize, rilasciando anche i sorgenti, che si basa sull'uso di WithEvents per
recuperare l'evento di resize della form parent, ma neppure lui ha risolto
il problema delle MDIChild, tanto è vero che anche il suo OCX fallisce
miseramente se ce lo posizioni sopra. Se interessa, l'URL è:
www.vb2themax.com/Articles/Resizer/Article.asp
A questo punto sono fortemente indeciso se mollare tutto o se fare un OCX
che cominci a monitorare la dimensione della form MDIChild fin dall'IDE di
VB. Con WithEvents non funziona, ho già provato. Resta da capire come fare e
da trovare il tempo per provarci.
Ciao
*Roby*

 da trovare il tempo per provarci.
p.f., mi spieghi meglio cosa hai in mente ?
ciao, a.

 p.f., mi spieghi meglio cosa hai in mente ?
Eccoci al punto:
Per fare una routine di resize automatico bisogna basarsi sulla differenza
che c'è tra le dimensione Height e Width della form rispetto a come erano
precedentemente.
Il primo dei valori che serve (quello precedente al primo resize) lo devo
recuperare dal valore di Height e Width che avevo settato quando ho creato
la form nell'IDE di VB, ma per le form MDIChild resizabili quersto è
impossibile (come dimostrato dal codice + sopra scritto).
A questo punto come si fa?
Whew! Spero di essermi spiegato.
Ciao
*Roby*

 Whew! Spero di essermi spiegato.
direi di si'. non so se ci sono altre strade: gli unici valori che sembra
tenere direi siano quelli relativi basati sull'mdi. ma dubito ti possa
servire.
ps -- lo strano e' che nel secondo if, col control, da me il child prende
1740*1000 quali che siano le dimensioni dell'mdi. tu ne avevi altri. come
verranno individuati questi valori ?
ciao, a.

 verranno individuati questi valori ?
Forse dipende dalla risoluzione video a cui lavoriamo? Io sto a 1024x768.
Ciao
*Roby*

 Forse dipende dalla risoluzione video a cui lavoriamo? Io sto a 1024x768.
anch'io. forse dipende dal cap della citta' di residenza... o
dall'ascendente... :)

 da trovare il tempo per provarci.
Piu' ci penso piu' la tua idea mi sembra... contronatura!
Mi spiego: se e' vero che "nomina sunt imago rerum" allora, visto che MDI
vuol dire "Multiple Document Interface" delle due l'una: o il form e' un
"documento", allora ha senso che sia MDIChild, o non lo e' ed allora perche'
impostarlo MDIChild?
Cosa si intende per "documento"? Direi che gli esempi classici di Word o
Excel sono sufficienti per esimermi da una definizione.
Tra l'altro mi sembra che nelle interfacce per il mondo Windows si vadano
sempre piu' diffondendo delle tipologie che si discostano dall'originario
schema Genitore/Figlio. Cosi' trovo sempre piu' usato o lo schema tipo IDE o
quello apparso per la prima volta, credo, in Outlook, quello cioe' imperante
in Office 2000.
--
Ciao.
Maurizio

 schema Genitore/Figlio.
Anche all'interno della stessa applicazione esistono sia MDIChild che form
normali. Semplificando, le form resizabili sono MDIChild, quelle fisse (ad
esempio l'about, o il setup, etc) sono form standard.
All'utente non gli importa gran ché di che schemi usi, basta che sia comodo
da utilizzare.
Ciao
*Roby*

comodo da utilizzare.
Su questo sono pienamente d'accordo. Sul resto anche, in linea di massima.
Solo volevo un po' sottilizzare, perche' credo che quando si affrontano
discorsi che riguardano l'interfaccia non sia tempo sprecato e piu' carne si
mette al fuoco meglio e'.
--
Ciao.
Maurizio

 mette al fuoco meglio e'.
Sono d'accordissimo. Fammi qualche esempio e sarò felice di discutere
l'argomento.
Ciao
*Roby*