2013-08-21 10 views
5

Ho un TListView con alcune aree specializzate che mostrano suggerimenti sugli strumenti. Poiché non è possibile definire aree specifiche su un TListView per la visualizzazione in modo da visualizzare più di un suggerimento per Subitem.Come calcolare la distanza di scorrimento di un utente in un TListView ma non mentre l'utente sta scorrendo?

Quindi ho creato una struttura che contiene la loro posizione così come la punta dello strumento (suggerimento). Questa parte funziona bene. Tuttavia, queste posizioni sono relative all'interno dello TListView nella parte superiore, pertanto, una volta che l'utente ha eseguito lo scorrimento, lo MousePos fa ancora riferimento alla completa visibilità dello TListView, indipendentemente da dove viene fatto scorrere lo TListView.

Questo ha senso; ma desidero aggiungere alla coordinata Y quanto lontano l'utente ha fatto scorrere verso il basso. (Mi piacerebbe anche fare lo stesso per la coordinata X, ma questo è meno rilevante.) Ma per quanto posso raccogliere c'è A) nessun meccanismo su un TListView per rilevare questo e B) la maggior parte delle guide che parlano di TListView e lo scorrimento si riferisce alla cattura dello scrolling come sta accadendo, e non nel mio caso, durante un evento diverso (in questo caso, con il mouse).

Quindi, come posso rilevare o calcolare fino a che punto l'utente ha eseguito lo scorrimento mentre non si è verificato un evento di scorrimento?

+0

La proprietà 'TopItem' di' TListView' è di aiuto? – lurker

+0

@mbratch: Beh, questa è certamente una proprietà interessante. Ma il suo 'Position.Y' è la sua posizione all'interno del tavolo, e non so come ottenere l'altezza di ogni oggetto. – Svip

+1

@TLama: Grazie, ha funzionato esattamente come avevo bisogno. – Svip

risposta

6

C'è un meccanismo: ListView.ViewOrigin.

Leggere ViewOrigin per determinare l'origine logica dell'immagine dell'elenco. Quando la vista elenco non scorre, ViewOrigin è (0,0). Altrimenti, usa la coordinata x per determinare il numero di pixel che la vista è in ordine orizzontale, e la coordinata y per determinare il numero di pixel la vista viene fatta scorrere verticalmente.

var 
    Pt: TPoint; 
begin 
    Pt := ListView1.ViewOrigin; 


Questo dovrebbe funzionare solo se il vostro ListView è in vsIcon o vsSmallIcon vista lo stile. (Sembra che tu non abbia menzionato quale stile di visualizzazione stai usando). Tuttavia con un semplice test qui, sembra che funzioni anche nello stile vsReport. ViewOrigin.Y restituisce esattamente lo stesso valore di un 'nPos' di TScrollInfo recuperato da una chiamata GetScrollInfo.

Problemi correlati