Newsgroup: it.comp.appl.access
Titolo: API che non funzionano

Qualcuno di voi ha mai usato sendmessage con il parametro LB_GETTOPINDEX ?
Devo individuare il primo elemento visibile di una casella di riepilogo a 
selezione multipla
Non riesco a farla funzionare
Riesco però a effettuare scroll sulla casella di rieilogo con il parametro 
WM_VSCROLL
Grazie
Ungi 


 Hai pensato che ci sono dei sistemi molto ma molto piů semplici?
Perchč usare le API?
Ciao, Carlo 

Hai dato un'occhiata alla collection Nativa ItemSelected...?
L'Item Zero è il primo selezionato...!
A prescindere da questo alcune volte le API usate su controlli VBA
falliscono, sei certo di avere il Focus sul controllo e di aver passato
l'Hwnd correttamente...?
Saluti
@Alex

 ha scritto nel messaggio 
news:1148201277.6...@i39g2000cwa.googlegroups.com...



Saluti
@Alex
Il problema è che ho bisogno di sapere il valore della prima riga visibile 
(selezionata o meno) in alto  di una casella di riepilogo a selezione 
multipla
L'insieme ItemsSelected mi restituisce le righe selezionate ma non ho 
trovato nessuna funzione che mi dia informazioni sullo stato di scroll di 
una listbox
Il tutto mi serve per fare in modo che alla riapertura di una maschera con 
una listbox il programma mi deve restituire lo stato di scroll precedente, 
in quanto se effettuo il ricalcolo dell'origine riga la listbox si 
riposiziona sul primo elemento (e su un elenco di migliaia di righe ciò è 
abbastanza fastidioso)
Qualcuno ha affrontato e risolto il problema, magari senza le API ?
Grazie
Ungi 

 Ungi
Vuoi dire che se fai uno scroll della listbox e quindi, per esempio, 
visualizzi i record da 10 a 20 vuoi conoscere il valore di 10 e non della 1 
(o 0)? Cosě se fai ancora uno scroll vuoi conoscere la prima del secondo , 
terzo, quarto gruppo...di record visualizzati?
Ciao, Carlo 

[Per Carlo]
Si credo di aver capito solo ora.... ma penso sia così...!
[Per Ungi]
Consiglio di provare a dare un'occhiata al sito di Lebans, che
relativamente all'uso pesante delle API relative ai controlli di Access
può insegnare molto.
Sinceramente trovo l'esigenza molto Bizzarra, e personalmente mi
interesserebbe capire realmente cosa vuoi ottenere
e l'utilità di sapere quale sia il primo ITEM utile visualizzato.
Sei certo che il tutto sia finalizzato alla funzionalità...?
@Alex

In ogni caso penso che tu abbia preso un abbaglio, e mi spiego....!
L'api SendMessage con la costante LB_GETTOPINDEX/LB_SETTOPINDEX
funziona
per la classe ListBox di VB provato ora e non ha nessun problema, ma in
Access... NO.
Ti sei posto il problema che le 2 classi sono differenti e che possono
anche avere qualche
punto in comune, ma come accade spesso tra VB e VBA sono pochi.
Per VB puoi dare uno sguardo a questo è molto semplificato ma poi ti
appoggi a MSDN ed SDK:
http://www.aleax.it/TutWin32/t42.htm
Purtroppo credo che l'unico metodo che hai per trovarti( e dico
trovarti perchè non ci sono
che io sappia documenti chiari per l'accesso alle Classi di controlli
in Access) è quello di
usare SPY++ e perderci qualche ora di sonno....!!
Saluti
@Alex

 Saluti @Alex
Innanzitutto grazie per le risposte, per di più date in giorni festivi
A volte i Clienti chiedono delle cose a cui noi non pensiamo neanche 
lontanamente
Uso molto le caselle di riepilogo, ultimamente anche a selezione multipla, 
la funzionalità che devo aggiungere riguarda il seguente scenario:
l'utente scorre una casella di riepilogo, seleziona un record, esegue il 
comando di modifica del record selezionato, viene aperta un'altra maschera 
che serve per la modifca di un singolo record e al ritorno alla maschera 
precedente vorrebbe trovare la casella di riepilogo nello stato di scroll in 
cui l'ha lasciata, cosa che in una multiselect non succede perchè tra le 
altre cose nel frattempo ho dovuto aggiornare il rowsource della casella e 
l'elenco riparte dall'inizio.
Ecco perchè mi serviva sapere il valore della prima riga visibile, per 
sapere quanti record l'utente aveva "scrollati" in precedenza, inoltre mi 
serviva un comando che mi permettesse lo scroll della casella di riepilogo 
da codice.
In una casella a selezione singole è molto utile la proprietà listindex, che 
serve allo scopo ma in una multiselect listindex non funziona.
Come giustamente suggerito sul sito di Lebans ho trovato la funzione 
sendmessage che con il parametro WM_VSCROLL permette lo scroll di un numero 
a piacere di righe e funziona senza problemi, ho voluto poi usare il 
parametro LB_GETTOPINDEX ma niente da fare e infatti mi dicevate che in vba 
non funziona, questo è il vero problema, perchè si trovano sempre 
informazioni su VB ma applicare le funzione in VBA è sempre una incognita.
Allo stato attuale il problema è parzialmente risolto in quanto utilizzo la 
combinazione tra l'insieme itemselected e la funzione sendmessage con il 
parametro WM_VSCROLL: quando l'utente seleziona uno o più record nella 
casella di riepilogo e poi apre un'altra maschera, al ritorno in quella 
precedente viene eseguita sendmessage che esegue lo scroll di un numero di 
righe sufficienti a visualizzare di nuovo le righe evidenziate in 
precedenza, anche se sono in fondo;
se invece l'utente scorre l'elenco e apre un'altra maschera senza 
evidenziare niente, al ritorno, sempre dopo aver fatto il requery della 
casella di riepilogo, non è possibile riportare lo scroll allo stato 
precedente, ecco perchè mi serviva sapere quale era la prima riga visibile.
In Vb inoltre esiste la proprieta topindex delle listbox, per cui non serve 
neanche utilizzare le API
Notate che ho sempre usato il nome Casella di Riepilogo invece di Listbox, 
perchè mi sa che a questo punto non sono esattamente la stessa cosa.
Scusate per la prolissità ma speriamo sia stata di aiuto a spiegare le 
problematiche
Per quando riguarda il suggerimento di perdere qualche ora di sonno ho già 
dato, basta vedere l'ora in cui ho spedito il primo messaggio!
Grazie
Ungi

[CUT]
Notate che ho sempre usato il nome Casella di Riepilogo invece di
Listbox,
perchè mi sa che a questo punto non sono esattamente la stessa cosa.
[Risposta]
Quì potremo parlare di errore, in VBA sono la stessa cosa, quello che
cambia da VB a VBA
è la Classe oggetto usata, ma sempre di ListBox stiamo parlando...!
Scusate per la prolissità ma speriamo sia stata di aiuto a spiegare le
problematiche
Per quando riguarda il suggerimento di perdere qualche ora di sonno ho
già
dato, basta vedere l'ora in cui ho spedito il primo messaggio!
Grazie
Ungi
[Risposta]
Hai provato a pensare di memorizzare l'Item selezionato e di
riselezionarlo
al ritorno...?
Me!NomeCasella = Me!NomeCasella.ItemData(0)
L'indice della proprietà ItemData inizia con 0 = riga 1, 1 = riga 2
ecc.
Quindi se memorizzi l'Index prima di eseguire l'Editing, al ritorno
ripristini
l'Index tramite ItemData...!
Non sono certo che venga effettuato lo Scroll(anzi è probabile di
no)...!
Ciao
@Alex

Hai provato a pensare di memorizzare l'Item selezionato e di riselezionarlo 
al ritorno...?
Me!NomeCasella = Me!NomeCasella.ItemData(0)
L'indice della proprietà ItemData inizia con 0 = riga 1, 1 = riga 2
ecc.
[Risposta]
Così funziona, prima memorizzo l'item selezionato in un array
Quindi se memorizzi l'Index prima di eseguire l'Editing, al ritorno 
ripristini l'Index tramite ItemData...!
[Risposta]
Dopo l'Editing faccio una scansione della casella combinata e attribuisco il 
valore selected=true alle righe che corrispondono come Itemdata agli 
elementi dell'array
Non sono certo che venga effettuato lo Scroll(anzi è probabile di no)...!
[Risposta]
E qui interviene la funzione API con il parametro WM_SCROLL che effettua lo 
scrolling della listbox fino a visualizzare al centro il primo elemento 
evidenziato, in questo modo anche cambiando l'ordine di visualizzazione la 
funzione scorre in giù l'elenco fino a scovare l'elemento evidenziato 
ovunque si trovi, devo dire che funziona molto bene ed è velocissima credo 
come tutte le API (non le Piaggio)
In pratica con una listbox a selezione singola tutte queste funzionalità 
sono già incorporate
Ciao
@Alex
[Risposta]
Ciao
Ungi 

Io questo problema l'ho risolto utilizzando la proprietà Value del
controllo listbox in questo modo:
Il controllo listbox deve avere 2 colonne di cui la prima (nascosta)
contiene ID del record selezionato (che non dovrebbe mai cambiare anche
se aggiorni i dati del record) e la seconda la descrizione da
visualizzare.
La colonna associata della listbox deve essere la prima (l'ID).
Memorizza l'ID del record\riga della listbox selezionato in una
variabile pubblica e poi, dopo aver ricaricato la listbox mediante la
proprietà RowSource e il comando Requery del controllo scrivi:
TuaListbox.Value = VariabilePubblicaConID
Silvio

Silvio Vitale ha scritto:

Mi correggo! Il problema l'ho risolto su una ComboBox! Non so se la
ListBox può funzionare alla stessa maniera! Scusate
Silvio

No con la ListBox non funziona.
@Alex

 Silvio
Mi correggo ancora! Ho appena provato con una ListBox e funziona lo
stesso :)
Poi magari non ho capito nulla del problema (ho letto molto
velocemente) e a llora chiederò ancora scusa ;)
Silvio

 @Alex
No, funziona ma solo se non è impostata la selezione multipla :(
Ho appena provato...
Bisognerà chiedersi se è proprio necessaria la selezione multipla...
Silvio