Newsgroup: it.comp.programmare.win32
Titolo: Esempio sull'MSDN

Linguaggio di programmazione: Visual C++ 6.0
S.O. Windows 98 SE
-------------------------------------------------------
Ho trovato un esempio di gestione di DB tramite le tecniche DAO su MSDN
(DBVLIST) che permette di visualizzare un recordset di una tabella di ACCESS
in una list view o meglio in una virtual list view. Sarei molto grado che
ciascuno di voi, ovviamente solo se interessati, provasse a compilare
l'esempio visto che, dopo qualche giorno di grattacapi, non riesco a venir a
capo di una cosa. Allora: la visualizzazione è in realtà una doppia
visualizz. e quella di sopra, una form view, ha un pulsante di comando che
imposta il filtro di una SELECT secondo il parametro selezionato nella combo
box a sx. Premendo tale pulsante viene appunto effettuato una Requery su di
un recordset appena aperto. La virtual list view notifica alla sua parent
window (quale?) la disponibilità a ricevere dei dati attraverso il messaggio
LVN_GETDISPINFO che la sua parent windows (ripeto... quale?) intercetta con
la funzione OnChieldNotify. Quello che non riesco a capire è: come fa il
recordset ad inviare i suoi dati alla list view? Ovvero, come fa la list
view a generare il messaggio LVN_GETDISPINFO? In merito a cosa la list view
capisce che "gli stanno arrivando" dei dati e che lei deve visualizzare?
Grazie mille a tutti
Sergio


Diciamo che č l'opposto. Non č il record-set che invia i suoi dati al
listview, bensě č il listview che se li va a prendere.
Con la gestione della lista virtuale il listview non ha piů i dati in
memoria (che tu andavi a inserire con le InsertItem) ma sa che i dati sono
da qualche altra parte. Quando il list-view ha bisogno ad esempio di
ridisegnare una parte, ha bisogno del testo da visualizzare e quindi t'invia
la notifica specificando l'item ed il subitem da ridisegnare.
Se nel progetto cerchi le istruzioni Invalidate del list-view vedrai che ce
ne sono due:
una č chimamata dall'UpdateFilter a sua volta richiamata dalla OnFetch;
l'altra č chiamata dal column-click del list-view.
Il funzionamento č quindi molto semplice quando premo una colonna devo
riordinare il contenuto del list-view, quindi č sufficiente rieffettuare la
query con un nuovo ordinamento; quindi forzo il ridisegno (Invalidate) di
tutto il listview, che quindi spara una sfilza di LVN_GETDISPINFO (solo
quelle relative agli item in vista).
La stessa cosa per l'OnFetch: rieffettuo la query ed invalido tutto il
list-view.
Spero di esserti stato utile e chiaro.
Porlock.


Scusami Porlock, ma ho bisogno di ulteriori chiarimenti. Supponiamo che il
mio DB abbia 100 record, pertanto la list view si prepara ad "ospitare" 100
record e per capire questo interroga il recordset sulla sua capacità. Ma
come fa a capire che ci sono dei dati in arrivo da un recordsete che,
invece, la list view non è messa lì "per bellezza"? In effetti sarebbe
possibile il fatto che io abbia voluto (chissà per quale motivo astratto)
mettere una list view lì senza affidargli alcun compito. Ok...andiamo
avanti...la list view capisce che gli devono arrivare 100 record ed ogni
record è suddiviso in tanti campi quante sono le colonne della list view. La
list view invia alla sua parent window (e quindi la CSplitterWnd...grazie
per avermelo detto) il messaggio LVN_GETDISPINFO per dirle che lei è pronta
a ricevere i dati....vero? Successivamente invia tanti LVN_ODCACHEHINT
indicando il range di dati da invalidare (e quindi dal primo al 100
record)...e poi non so continuare, anche perchè non so se ho ragionato nel
modo giusto.
Questo un ulteriore esempio:
                                                            MIO RECORDSET
                                                        ____________________
ID                    COGNOME            NOME                INDIRIZZO
01                    Bianchi                    Luigi
via Roma, 34
02                    Mattiello                  Enrico                 via
Pomezia, 48/B
03                    Marzano                   Marco                  via
Gerusalemme, 88
04                    Setteposi                  Federico
Piazza Dante, 90
.......................
......................
.......................
100                 Ottaviani                    Alessandro        via
Spalato, 44
Quindi ho una list view con le colonne Cognome, Nome, Indirizzo. Preparo la
SELECT ed apro il recordset. Adesso la list view dovrebbe prelevare 100
record e, di ciascuno, i rispettivi campi. Quale è l'esatta pila di messaggi
che vengono spediti dalla list view alla CSplitterWnd? Potresti farmi dei
riferimenti precisi con il recordset qui sopra?
Ti ringrazio 1000
Sergio

 Ti ringrazio 1000
Prego.
Porlock.

Grazie mille per avermi risposto, sei stato fantastico! Ne approfitteri
anche per chiederti alcuni chiarimenti su istruzioni di C++ (incontrate nel
solito esempio che io non conosco...perdonami, ma provengo da VB ed altri
linguaggi (esclusi il C eC++) e da un anno circa mi sono avvicinato al mondo
meraviglioso, se non difficoltoso, di MFC. Ovviamente rispondimi solo se ti
va...non sei
obbligato a farlo (ma noi non c'eravamo già sentiti in precedenza?):
*******************
CDBVListDoc* CDBVListView::GetDocument() // non-debug version is inline
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDBVListDoc)));
 return (CDBVListDoc*)m_pDocument;
}
Questa funzione la si trova per ciascuna vista ereditata da CView ed
altre...tranne che per
la FormView. Siccome io sono stato tanto intelligente da non ereditare la
vista superiore
della splitter da CDaoRecordView ma da CFormView la suddetta funzione non me
la trovo.
Posso aggiungerla manualmente? O deve rifare tutto il mio progetto stando
molto attento ad
ereditare la vista da CDaoRecordView?
*******************
*******************
void CDBVListView::OnFetch()
{
 CMainFrame* pFrame=static_cast<CMainFrame*>(AfxGetMainWnd());
 CEmpView* pView=static_cast<CEmpView*>(pFrame->m_wndSplitter.GetPane(1,0));
A cosa servono le due istruzioni qui sopra? static_cast cosa significa?
*******************
*******************
La funzione GetDispInfo richiamata a fronte del messaggio LVN_GETDISPINFO
permette di prelevare l'item. Ma c'è bisogno di mandare ulteriori messaggi
LVN_GETDISPINFO per i subitem? Il ciclo switch(pItem->iSubItem) non preleva
i subitem dall'item già recuperato? Perchè inviare ulteriori messaggi?
*******************
*******************
La funzione non implementata FindItem a cosa serve? Dal nome è
comprensibile, ma perchè, appunto, non implementata?
*******************
Ti ringrazio anticipatamente
Sergio
PS: prenditi tutto il tempo che vuoi..non ho fretta!!

 Ti ringrazio anticipatamente
Prego.
Porlock.