Newsgroup: it.comp.lang.c++
Titolo: Variabili "globali" : help me!

Ciao a tutti,
volevo chiedere una cosa.
Io dichiaro una variabile ( un buffer ) nella mia classe vista e lo
chiamo m_buffer. Li' leggero' i dati da un file.
Poi creo una classe CMyDialog che gestisce una mia finestra dialog
dove c'e il pulsante ApriFile.
Gestisco ApriFile con una funzione OnApriFile della classe CDialog;
ora il mio problema e' questo : il compilatore mi dice che m_buffer
non esiste.Infatti l'ho dichiarato nella classe vista, non 
nella CMyDialog.
Come posso fare perche' accetti m_buffer nella finestra dialogo? 
Ecco un pezzo di pseudo-codice:
class CProvaView : public CView
{
public:
    BYTE* m_buffer;  // il mio buffer
    CMyDialog dlg;  // la mia finestra dialogo appartiene alla vista
    ...
 
class CMyDialog : CDialog
{
  void OnFileOpen();
  ...
void CMyDialog::OnFileOpen()
{
 CFile file;
 file.Open....
 file.Read( m_buffer )
            ^^^^^^^^
            ovviamente non riconosce questa variabile.
            Come posso fargliela riconoscere?
Grazie.
    _.._        _.._    << HH Creation© >>
  ,','"_:./\/\,'_ `.`.  
 /_:--:_ ( oo ) _:--:_\  §orrow The Prince 
/'      `'`vv'`'      `\

Ci sono varie possibilita':
La maniera piu' rapida e' quella di dichiarare una variabile m_buffer
nell'oggetto derivato da CWinApp. Con la funzione AfxGetApp() si puo'
ottenere in qualsiasi momento il puntatore dell'applicazione e quindi
anche ai dati in esso contenuti.
class CMyApp : public CWinApp
{
....
	BYTE m_buffer;
}
Piu' tardi nel codice...
CMyApp* pApp = (CMyApp*) AfxGetApp();
pApp->m_buffer = ....
Un' altra possibilita' e di passare un riferimento della classe
contenente m_buffer con il costruttore di CMyDialog.
Ciao
Claudio, Svizzera

Ciao,
ringrazio tutte le risposte che avete scritto ( e con che velocita'!
:), soprattutto perche' non essendo un esperto di C++ ( ne' di MFC )
ho imparato qlc. Grazie veramente.
Terminati i ( dovuti ) preliminari veniamo al punto della situazione.
Siccome la dlg che ho creato e' STRETTAMENTE legata alla vista,
non posso fare come qlc mi ha suggerito.
Inoltre il buffer non e' sempre lo stesso ( ossia non ha sempre lo
stesso indirizzo ), quindi non posso inizializzarlo una volta sola nel
costruttore di CMyDialog.
Il metodo per risolvere il mio dilemma e' probabilmente quello di
dichiarare una variabile nell'applicazione principale e fare
riferimento ad essa.
La mia questione e' ora questa. Qlc mi ha suggerito di osservare la
parola chiave FRIEND, e cosi' ho fatto.
Ho letto che scrivendo cosi'
class CProvaView : public CView
{
public:
    BYTE* m_buffer;  // il mio buffer
    friend class CMyDialog;          <------------- -_^
    CMyDialog dlg;  // la mia finestra dialogo appartiene alla vista
    ....
}
 
class CMyDialog : CDialog
{
  void OnFileOpen();
  ...
}
la classe CMyDialog avrebbe potuto accedere a tutti i dati ( anche i
privati! ) della classe CProvaView. La soluzione al mio problema!
Invece no, perche' MVC mi dice sempre che m_buffer e' "undeclared
identifier".
Allora ho letto male, o no?
PS: Penso di risolvere cosi' il mio problema.
    Una volta che premo il tasto Load inserisco nella coda dei   
    messaggi un messaggio creato da me ( es: IDM_LOADMYPIC )
    e lo elaboro nella vista. Elegante, non vi pare?
Ringrazio tutti per l'interessamento. Non per mancanza di fiducia ^_^,
ma avevo spedito lo stesso msg su ng come microdoft.MFC.. etc e su
altri, ma l'unico ng dal quale ho ricevuto idee e/o aiuti e' stato
questo!
Non mi pento di averlo votato!


Sorrow The Prince (
sor...@promix.shiny.it
) wrote:
: Ciao a tutti,
: volevo chiedere una cosa.
: Io dichiaro una variabile ( un buffer ) nella mia classe vista e lo
: chiamo m_buffer. Li' leggero' i dati da un file.
: Poi creo una classe CMyDialog che gestisce una mia finestra dialog
: dove c'e il pulsante ApriFile.
: Gestisco ApriFile con una funzione OnApriFile della classe CDialog;
: ora il mio problema e' questo : il compilatore mi dice che m_buffer
: non esiste.Infatti l'ho dichiarato nella classe vista, non 
: nella CMyDialog.
: Come posso fare perche' accetti m_buffer nella finestra dialogo? 
: Ecco un pezzo di pseudo-codice:
: class CProvaView : public CView
: {
: public:
:     BYTE* m_buffer;  // il mio buffer
:     CMyDialog dlg;  // la mia finestra dialogo appartiene alla vista
:     ...
:     
: class CMyDialog : CDialog
: {
:   void OnFileOpen();
:   ...
: void CMyDialog::OnFileOpen()
: {
:  CFile file;
:  file.Open....
:  file.Read( m_buffer )
:             ^^^^^^^^
:             ovviamente non riconosce questa variabile.
:             Come posso fargliela riconoscere?
: Grazie.
Il problema e` che la classe CMyDialog non conosce le dichiarazioni in
CProvaView. Devi riarrangiare opportunamente le definizioni, magari aggiungendo
delle dichiarazioni che anticipino le rispettive definizioni.
Dal codice che hai inviato non riesco a capire come sono sistemate le
dichiarazioni tra loro (intendo come posizione rispetto al resto del codice),
ma mi sono gia` imbattuto in un problema simile
causato appunto dall'ordine delle dichiarazioni
Saluti,
Paolo

 Paolo
Vorrei sapere come hai risolto il problema simile a quello posto da
Sorrow, perché io ho provato a impostare le dichiarazioni delle classi
prima delle definizioni (ho provato entrambe le possibilità), e a
mettere file.Read(CProvaView::m_buffer) in CMyDialog, ma il compilatore
(DJGPP) mi dà un errore proprio a quella riga dicendomi che CMyDialog
non è una sottoclasse di CProvaView. A questo punto mi viene il dubbio
che un'alterazione dello scope come l'ho fatta io non valga per la
composizione, ma solo per l'ereditarietà.
TIA,
-- 
 Andrea Glorioso Pelliccioni 
 
sa...@intercity.shiny.it
 
 
glor...@intercity.shiny.it

Grazie!!
class CMyView: public CView
{
...
CString m_text;
...
};
class CMyDialog: public CDialog
{
...
CMyView *m_pView;
...
};
void CMyView::OnMyCommand()
{
CMyDialog dlg;
dlg.m_pView=this;
DoModal();
} 
void CMyDialog::OnInitDialog()
{
 CDialog::OnInitDialog();
 ASSERT(m_pView!=NULL);
 SetDlgItemText(IDC_MYTEXTCONTROL,m_pView->m_text);
}
ecco fatto. Comunque al di la' di casi particolari secondo me e'
sempre meglio utilizzare dei membri di appoggio nella dialog piuttosto
che utilizzare un puntatore alla View. Se utilizzi un puntatore ad una
particolare view non potrai richiamare quella dialog da altre view
oppure dalla classe del documento o dell'applicazione mentre a volte
durante lo sviluppo di un programma capita di spostare la gestione di
certi comandi dalla view al documento o viceversa. Senza contare che
se cambi l'implementazione dei dati aumenti a dismisura il numero di
modifiche da fare al codice.
Gianpaolo Bottin
- Live Long and Prosper -