Newsgroup: it.comp.lang.visual-basic
Titolo: SCROLLING: Ovvero quando le cose più semplici diventano difficilissime!

Prima di tutto vi invito a leggere il messaggio "APPELLO AL NG!". Spero
che vi interessi.
Veniamo al mio problema. Sto progettanto un programma di gestione
presenze, paghe, ecc. per la caserma dove sto facendo la naia.
Uso un'interfaccia tipo MDI e gli oggetti DAO su un database Mdb. Ogni
form figlia avrà (molto probabilmente) un controllo Tab al suo interno
con varie schede. Faccio un esempio: la form figlia Anagrafe contiene
(almeno) tre schede (Visualizza/modica; inserimento; ricerca avanzata).
La scheda Inserimento conterrà tutti i controlli necessari per inserire
i valori nei campi della tabella anagrafe del mio Db. Siccome i campi
saranno parecchi e voglio tenere la possibilità di usare la form con
qualsiasi dimensione si voglia, avrò sicuramente bisogno di effettuare
lo scrolling all'interno della finestra.
Il primo problema riguarda le scroll bar. Inserendo nell'evento resize
della form il codice necessario per spostare le scroll bar di
conseguenza, ottengo un effetto ottico non troppo gradevole in fase di
esecuzione: le scroll bar non si muovono uniformemente insieme alla
form, ma si spostano a scatti. Non si comportano così, invece, le scroll
bar che appaiono automaticamente nella form MDI, il cui andamento è
decisamente fluido.
Per dare un'idea, uso un codice del tipo:
VScroll.Top = Form.ScaleTop
VScroll.Left = 0
VScroll.Height = From.Height
HScroll.Top = Form.ScaleTop
HScroll.Left = 0
HScroll.Width = Form.ScaleWidth
chiaramente non è così perché, come in tutte le applicazioni, voglio le
scroll bar a destra ed in basso e non a sinistra ed in alto e certamente
non sovrapposte come avverrebbe utilizzando il codice qui sopra.
Sempre riguardo alle scroll bar, devo riuscire a dimensionare il cursore
interno in modo da riflettere la percentuale di form visibile e quella
ancora da visualizzare: se riesco a visualizzare l'80% di tutto quello
che c'è sulla form, il cursore dovrà essere lungo (largo se orizzontale)
quanto l'80% della lunghezza (larghezza) della scroll bar stessa. Ho
avuto qualche successo con la proprietà LargeChange, ma, così com'è
impostata, la trovo pressoché inutilizzabile (a questo proposito potete
vedere il msg "Scroll bar" che ho inviato pochi giorni fà).
Il problema più grosso, però, rimane sempre lo scrolling effettivo.
La cosa è complicata dal fatto che ho il controllo Tab e che ogni scheda
ha un titolo (una semplicissima Label). Pertanto l'area di scrolling
dovrà essere inferiore alla dimensione della finestra.
Per effettuare lo scrolling ho provato a usare le funzioni API
ScrollWindow e ScrollWindowEx.
Purtroppo non sono riuscito ad ottenere il risultato sperato: con
ScrollWindow funziona egregiamente solo specificanto tutta l'area client
della form; non sono riuscito a specificare un'area minore. Con
ScrollWindowEx riesco ad impostare un'area minore, ma (anche utilizzando
tutta l'area client) i controlli dopo essere usciti dalla zona visiva
spariscono e non tornano più.
Inoltre, da quello che ho capito, con entrambe le funzioni è solo
l'immagine dei controlli a spostarsi e non i controlli veri e propri. In
effetti, ho verificato che le coordinate Top e Left rimangono invariate
anche dopo lo scrolling. La cosa è grave perché l'utente potrebbe
spostarsi da un campo visibile ad un altro campo non visibile usando la
tastiera. In questo caso dovrei effettuare automaticamente lo scroll per
portare il campo selezionato nella zona visibile, ma, se le coordinate
non cambiano, non so immaginarmi un altro modo per sapere se il
controllo in questione sia visibile o no, e, in questo secondo caso, di
quanto (pixels, centimentri, ecc.) è necessario effettuare lo scroll
perché diventi visibile.
Ho in mente un altro modo radicalmente diverso per effettuare lo scroll:
inserisco una PictureBox all'interno di ogni controllo Tab e la
dimensiono secondo le mie preferenze riguardo l'area che deve subire lo
scroll. Tutti i controlli li inserisco all'interno della PictureBox e
ogni volta eseguo un ciclo per modificare di conseguenza le loro
coordinate. I controlli tracciati all'interno della Picture Box
risultano nascosti se si impostano delle coordinate esterne all'area
della PictureBox stessa.
Sicuramente così funziona, ma, oltre ad essere abbastanza complicato e
lento (dovendo eseguire un ciclo su tutti i controlli ogni volta che si
vuole uno scroll), sono altrettanto sicuro che questo NON è il modo in
cui viene gestito lo scroll da tutte le applicazioni che conosco.
La via giusta sta quasi certamente nelle funzioni API ScrollWindow e
ScrollWindowEx. Se solo riuscissi a farle funzionare.
Concludo qui questo messaggio che sembra più un romanzo e ringrazio
chiunque abbia avuto la pazienza di leggerselo tutto.
Ciao a tutti.
--
Paolo De Laurentiis
E.Mail: 
pd...@tin.it
HomePage 1: 
http://space.tin.it/io/pdelau
HomePage 2: 
http://www.freeweb.org/freeweb/pdelau

l'Odissea....
Dunque non ho letto nei particolari il tuo... ciclopico messaggio ma
forse qualche chiarimento potresti averlo scaricando il progetto
autoscroll a questo URL:
http://space.tin.it/computer/ronegr/autoscrol.zip
Questo vale anche per il WEBMASTER corrente di it_lang_vb, lo zip e'
gia' organizzato per essere accolto dalle capaci fauci del sito
comune... (insomma capaci mica tanto!!!)
Ciao a tutti

Ho trovato il progetto di esempio indicato e devo dire che mi piace
proprio.
Mi permetto di inoltrare una miglioria farina del sacco di "Daniele" nella
sua risposta al mio msg "Scroll bar":
Utilizzando la riga:
VScroll1.LargeChange = Parte della picture da visualizzare - VScroll1.Max
invece di:
VScroll1.LargeChange = Parte della picture da visualizzare
si riesce ad avere il cursore della scroll bar di dimensioni anche minori
della metà della grandezza della scroll bar.
Per curiosità, usando le funzioni API ScrollWindow e ScrollWindowEx mi
complico semplicemente la vita o hanno qualche utilità?
Grazie ancora.
Ciao
Roberto Negro wrote:

--


Grazie ancora.
Grazie a te!!!
Ciao
Roberto

comune... (insomma capaci mica tanto!!!)
Non leggo tutti i msg del NG, sono troppi, comunque questo l'ho letto :-)
Vado a recuperarlo.
Salutoni