Newsgroup: it.comp.programmare.win32
Titolo: GetDlgItem

Salve.
In una funzione di classe1 devo ottenere il contenuto di una listbox che si trova nella classe2.
classe2 *pclasse2;
CListBox* pLB2 = (CListBox*) (pclasse2->GetDlgItem(IDC_LIST2));
 
Mi genera un eccezione a livello di esecuzione.
A quanto ho capito non trova l'Handle della finestra.
Come devo modificare questa funzione?
Ciao
--
TiscaliFreeNet, libero accesso ad Internet.
http://www.tiscalinet.it
--
Posted from 
twingo.tiscalinet.it
 [195.130.224.85] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Come devo modificare questa funzione?
Rinunciando ai tentativi di accedere a cose inesistenti.  In
altri termini, devi sicuramente ristrutturare a livello piu`
"macro".  Perche` senti il bisogno di accedere a una certa
listbox della finestra (di dialogo?) associata a pclasse2
quando quella finestra di dialogo e quindi quella listbox non
esistono...?  Cosa intendi farci...?
Alex

Ciao.
Vi spiego una volta per tutte il mio problema.
Ho 1 lista su una dialog che appartiene alla classe CListaDialog (nome di esempio).
Ho la necessità di salvare il suo contenuto alla pressione di un bottone che si trova in un altra classe CALtra!
Quindi ho pensato di dichiarare in CAltra una variabile CStringList (non è associata a nessun controllo lista,anche perchè in quella Classe non è presente nessun controllo ListBox).
Come faccio a salvare il contenuto della ListBox nella variabile CStringList (appartenente alla classe CAltra) in modo che ad un successivo ricaricamento degli elementi della lista,la lista della classe CListaDialog (quella che possiede il controllo CListBox) sia riempita con gli elementi della lista che è definita nella classe CAltra?
Non so se sono stato chiaro.
Fatemi un esempio.
Nel mio caso ,sono riuscito a riempire la lista della classe CAltra con gli elementi della ListBox (appartenente alla classe CListaDialog) ma quando ho la necessità di riempire la ListBox con gli elementi della variabile CStringList della classe CAltra,sembra che la variabile sia vuota.
Ciao e scusate la contorsione del testo.


 della classe CAltra,sembra che la variabile sia vuota.
Il fatto che parli sempre di cose "appartenenti alla classe" fa pensare
che si tratti di static (ma allora perche` non lo dici...?!), visto
che altrimenti appartengono a una *specifica istanza* di quella classe
(a un DATO OGGETTO, *non* ALLA CLASSE).  E` possibile che il problema
sia questo, cioe` che siano ISTANZE DIVERSE quelle in gioco nei vari
momenti cruciali...?  Come vengono reperite le specifiche istanze da
usare per i vari salvataggi e ripristini?
Alex

Questa è la funzione OnInitDialog della classe che contiene i controlli ListBox.
In teoria qui dovrebbe leggere dalle liste (CStringList) salvate e riempire le listbox.
POSITION pos
CSistemi1Ctrl *ctrl = (CSistemi1Ctrl *)((CMyPropertySheet *)GetParent())->m_Parent;
 
for( pos = ctrl->m_router1.GetHeadPosition(); pos != NULL; )
m_router1.AddString(ctrl->m_router1.GetNext( pos ));
for( pos = ctrl->m_router2.GetHeadPosition(); pos != NULL;)
m_router2.AddString(ctrl->m_router2.GetNext( pos ));
 
ctrl è il puntatore alla classe che contiene le liste (CStringList) salvate,ma non i controlli ListBox!.
Qui non mi legge nulla ,è come se si fossero svuotate queste liste.
m_router1 e m_router2 sono variabili associate ai controlli ListBox.
Attenzione! ctrl->m_router1 e ctr->m_router2 non sono gli stessi elementi di m_router1 e m_router2.
In pratica c'e' una PropertySheet che fa visualizzare 1 scheda.Questo è il codice di InitDialog della scheda che contiene le ListBox.
Spero di essere stato chiaro.
Ciao. 


 In pratica c'e' una PropertySheet che fa visualizzare 1 scheda.Questo è il
codice di InitDialog della scheda che contiene le ListBox.
Puo` darsi che ci sia qualche confusione con tutti questi cast,
e le istanze coinvolte.  Visualizza nei vari punti importanti
del tuo programma gli indirizzi degli oggetti in gioco (con
OutputDebugString o qualsiasi funzione o macro che la rivesta,
di solito si usa la macro TRACE).  Se puoi confermare che le
CStringList in gioco sono esattamente le stesse istanze sia in
fase di riempimento, sia quando cerchi di usarle (e non sono
state distrutte e ri-create; metti TRACE anche ai costruttori
e distruttori delle tue classi, magari) visualizza sempre con
TRACE il loro GetCount() alla fine del riempimento e quando
stai iniziando a leggerle.
Alex

Ho capito cosa era il mio problema:
in pratica le liste (ovvero il contenuto delle ListBox)vengono salvate in altre liste (di tipo CStringList) di appoggio (per chiarimenti vedere mail precedenti).
Purtroppo non essendo delle variabili associate ad un controllo che io sappia perdono il contenuto appena si esce dalla funzione.
Stavo pensando di dichiarare delle variabili associate a 2 ListBox però nella classe in cui devo salvare queste liste non devono essere presenti delle ListBox!
Come mi consigliate di procedere?
Le variabili di tipo CStringList perdono il contenuto!
Non so se sono stato chiaro.
Ciao


 Le variabili di tipo CStringList perdono il contenuto!
Se sono membri di un oggetto che non viene distrutto, non
"perderanno il contenuto".  Devi solo accertarti di questo.
Alex

In effetti l'oggetto viene creato e distrutto.
In questa famosa classe (quella del salvataggio delle liste),prima di salvare c'e' un 'istruzione 
m_dlg = new CPropSheet1(m_title,this);
 
poi c'e' il salvataggio e poi 
delete m_dlg;
Come faccio a conservare il valore di queste liste?


 Come faccio a conservare il valore di queste liste?
Ponendone, invece che come membri di un oggetto che
viene distrutto e poi ricostruito, come membri di un
oggetto che vive intonso nel corso dell'intero
passaggio.  Ad esempio, a seconda di cosa siano
questi dati, un posto appropriato potrebbe essere
l'oggetto-documento, oppure l'oggetto-vista, o
magari l'oggetto-applicazione o quello mainframe.
Non conoscendo la semantica di questi dati, non
si puo` dare una risposta univoca, poiche` la giusta
residenza dei dati dipende anzitutto dalla semantica,
giustappunto.  Cosi` a naso, si potrebbe pensare in
particolare all'oggetto, qualsiasi esso sia, che
contiene (e nelle righe suddette genera e poi
distrugge) il membro m_dlg; accanto ad esso potrebbe
avere un altro membro, contenente le famose due
liste (e quant'altro vada conservato).  Oppure,
specie se i dati devono vivere a lungo, puo` essere
il caso di persisterli (su file, database, registry,
dipende) e depersisterli secondo necessita`.
Alex