Newsgroup: it.comp.lang.vo-clipper
Titolo: uso di Access/Assign per sostituire variabili globali

buonasera a tutti i nottambuli di Visual Objects. 
ho un problema che mi toglie qualche notte di sonno e provo a sottoporlo al gruppo, con la certezza che sicuramente, insieme una soluzione si trova.
 
METHOD Buttoncerca() CLASS DocTraspoReso
 
    LOCAL oResoRiceddt  as ResoRiceddt // finestra dalla quale rilevo la presenza del Doc. di reso se presente in archivio
    LOCAL oTestaddt    AS Testaddt //Archivio dei documenti
    LOCAL oTabdocU := TabdocU{} AS  OBJECT /Archivio tabella tipi di documenti
    LOCAL oConsegne    AS Consegne //Achivio di dettaglio del documento
    LOCAL fatturata AS LOGIC
    LOCAL Datafattura, fattura as STRING
    //LOCAL sDataReso, sNumreso as STRING
    //local aResoDDT as ARRAY
 
    fatturata := FALSE
 
    IF Empty(NumeroConsegna) .and. Empty(DataConsegna) // due variabili globali da sostituire
    	   //Ricerca per la prima volta
	   //SELF:sModo := "MODIFICA"
    	   //SELF:SETUP()
	   SELF:Caption := "MODIFICA del documento di Trasporto" //  si scrive il titolo della finestra
           //cerco il movimento e se lo trovo lo gestisco
           oResoRiceddt := ResoRiceddt{self:Owner,,,}
	   oResoRiceddt:Show()
 
	ELSE
	   //Annullo i movimenti dell'archivio di appoggio temporaneo
	   self:oSFTestaresi_DETAIL:Server:Gotop()
          DO WHILE !self:oSFTestaresi_DETAIL:Server:EOF
		IF NetRecLock(self,self:oSFTestaresi_DETAIL:Server, 1200)
	   	   self:oSFTestaresi_DETAIL:Server:DELETE()
	           self:oSFTestaresi_DETAIL:Server:Commit()
	           self:oSFTestaresi_DETAIL:Server:Unlock()
		ENDIF
	    	self:oSFTestaresi_DETAIL:Server:Skip()
	  ENDDO
	  self:oSFTestaresi_DETAIL:Server:Pack()
	  self:oSFTestaresi_DETAIL:Server:Refresh()
	  SELF:Caption := "MODIFICA del documento di Trasporto"      //  si scrive il titolo della finestra
           //cerco il movimento e se lo trovo lo gestisco
	  oResoRiceddt := ResoRiceddt{self:Owner,,,}
	  oResoRiceddt:Show()
       ENDIF
    else
        //Proseguo per la visualizzazione ed elaborazione
    endif
Ecco il quesito: 
Come posso evitare l'uso delle variabili globali ???
Premessa: sapendo che la procedura di access/assign, mi pare lavori solo in ambito della stessa classe, mentre, da come si evince dallo stralcio io uso una classe per effettuare la ricerca e la selezione con l'uso delle variabili globali che comporranno il filtro di ricerca nell'ambito del metodo che al termine del rilevamento provvede a popolare la windows della procedura "DocTraspoReso".
Ho fiducia che saprete darmi suggerimenti in grado di sbrogliare questa matassa che mi affrancherebbe dall'uso eccessivo di variabili globali a vantaggio di variabili "export" o altro e che terminano la loro funzione una volta conclusa la procedura interessata, liberando risorse importanti.
Grazie ed attendo ogni vostro prezioso suggerimento in merito.
Mario Summa
 

Ciao Mario,
 
da anni uso una propria classe derivata dalla classe App.
Tutto quello che mi serve in maniera globale non è poi altro che una
variable della classe App estesa.
L'unica variabile globale perciò è il oggetto App stesso.
Il bello di questa soluzione è che al termine programma il garbage
collector "pulisce" questo oggetto automaticamente.
 
La mia funzione Start() è questa:
 
FUNCTION Start()
 
ErrorBlock( {|oError| WDefError(oError)} )
 
oApp		:= EnhancedApp{}
__SetAppObject( oApp )
oApp:Start()
 
oApp:Quit()
oApp:Destroy()
oApp 		:= NULL_OBJECT
 
RETURN NIL
 
e la classe EnhancedApp inizia così (in certi programmi ha qualche
centinaio di variabili perchè ci metto tutte le impostazioni, cache di
dati ecc.
 
class EnhancedApp inherit App
  export cPrgPath as string
  export cDataPath as string
  export oShell as AppShellWindow
 
Saluti
 
Wolfgang
 
P.S. in X# per queste impostazioni uso un oggetto tipo Singleton (che
può esistere una sola volta).

--