Autore Topic: variabili static  (Letto 2125 volte)

Michele

  • Visitatore
variabili static
« il: 06 Settembre 2009, 22:30:34 »
Ciao

Devo creare una variabile statica all'interno di un timer che si incrementa ogni secondo
ma scrivendo
STATIC PRIVATE Tempo as INTEGER
mi da errore
Come posso fare?
Grazie in anticipo per la risposta

Michele

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: variabili static
« Risposta #1 il: 07 Settembre 2009, 00:44:00 »
Puoi semplicemente dichiarare la viariabiel all'interno della sub timer con

Codice: [Seleziona]
DIM tempo AS Integer


Essa sarà utilizzabile solo all'interno di quella routine e verrà creata e distrutta quando si chiama o si abbandona la sub.

Michele

  • Visitatore
Re: variabili static
« Risposta #2 il: 07 Settembre 2009, 09:31:33 »
la variabile deve essere necessariamente di tipo static poichè non deve perdere il suo valore all'uscita dalla sub, ma incrementarsi ogni volta che vi si entra
non vorrei utilizzare una variabile globale

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: variabili static
« Risposta #3 il: 07 Settembre 2009, 11:00:12 »
potresti assegnare il valore ad una label (anche non visibile) in modo da poterlo recuperare ad ogni utilizzo della sub ( con valore = cint(label.text) ) e sostituirlo di volta in volta con il nuovo valore che la sub genera...

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: variabili static
« Risposta #4 il: 07 Settembre 2009, 12:48:47 »
Ti dà errore se lo stai dichiarando in un modulo.
Se stai dichiarando in un modulo ti basta:

PRIVATE Tempo as Integer

se Tempo viene letto solo dai metodi del modulo. Se deve essere letto
da altre classi, lo dichiari PUBLIC.

Se stai dichiarando in una form è giusto quello che hai scritto e l'errore non ci dovrebbe essere.
Comunque Tips #7 dell'help. Ciao.

Michele

  • Visitatore
Re: variabili static
« Risposta #5 il: 07 Settembre 2009, 13:01:23 »
la variabile l'ho dichiarata nella routine evento di un timer inserito in una form
Il Tips#7 lo vedrò questa sera
ora sono ...sigh....su XP

Grazie per le risposte

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: variabili static
« Risposta #6 il: 07 Settembre 2009, 16:37:42 »
Citazione

akrobaticone ha scritto:
la variabile l'ho dichiarata nella routine evento di un timer inserito in una form
Il Tips#7 lo vedrò questa sera
ora sono ...sigh....su XP

Grazie per le risposte


Forse non ho capito, ma se l'hai dichiarata in quel
modo dentro (per esempio)  l'evento

PUBLIC SUB Timer1_Timer()

ti darà sempre errore. Devi dichiararla all'inizio
della classe della form. Tipo

PRIVATE $iTempo AS Integer

o PUBLIC a seconda delle tue esigenze.

Saluti.

Michele

  • Visitatore
Re: variabili static
« Risposta #7 il: 07 Settembre 2009, 17:24:25 »
ok chiarissimo, grazie
ma allora quando e come si usa la l'opzione  STATIC?

Michele

  • Visitatore
Re: variabili static
« Risposta #8 il: 09 Settembre 2009, 15:54:23 »
UP?

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: variabili static
« Risposta #9 il: 15 Settembre 2009, 16:07:34 »
la differenza tra public - private - static le trovi all'inizio del secondo capitolo del manuale (c'è una versione tradotta in italiano dei primi 6 capitoli nell'area download).
la differenza è nella visibilità della variabile:
public = visibilità globale
static = visibilità da qualunque oggetto della classe
private = visibilità solo dalla classe in cui è dichiarata

tutte vanno dichiarate all'inizio della form (o classe).

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: variabili static
« Risposta #10 il: 15 Settembre 2009, 16:36:46 »
A parte quanto descritto nella doc seganalata, nel tuo caso puoi dichiararla statica all'interno di un modulo, oppure in una classe.
Nel caso di una classe, la variabile viene trattata come proprietà della stessa classe, ma se preceduta dal prefisso STATIC viene definita come indistruttibile, nel senso che vivrà fino a che non muore il programma stesso.
Una volta inizializzata, questa vive a prescidere dalla classe che la contiene (o il modulo), e può essere analizzata ogni volta si desideri. Modifiche del suo valore vengono mangtenute e, come detto, restano tali fino al termine dell'applicazione.

Sempre come descritto nella doc, non è possibile definire variabili statiche all'interno di una funzione (o metodo). In alcuni linguaggi questo invece è ammesso, anche se quasi mai usato.

Michele

  • Visitatore
Re: variabili static
« Risposta #11 il: 18 Settembre 2009, 22:48:43 »
Vediamo se ho capito
Una variabile static dichiarata in una classe (o form) sopravvive al form stesso
In una applicazione con più form dichiaro una variabile static in uno dei form ed essa sopravvive al form stesso nel caso venga chiuso
è visibile da tutti gli oggetti della classe

Una variabile public viene vista da tutte le classi
una private è visibile solo all'interno della classe

se dichiarata all'interno di una funzione solo con dim è visibile solo all'interno della funzione stessa

In c, ma anche in VB, una static se dichiarata all'interno di una funzione  conserva il valore anche uscendo dalla funzione stessa

nel mio caso intendevo usare una variabile che si incrementasse ogni volta che veniva chiamato l'evento timer senza crearla globale
rimanendo cioè visibile solo all'interno della routine timer

nel mio programma gambas l'ho dichiarata public all'inizio del form
e funziona

Grazie per le risposte

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: variabili static
« Risposta #12 il: 21 Settembre 2009, 10:41:51 »
Non è necessario dichiarala PUBLIC, se questa è usata solo all'interno della stessa classe, basta utilizzare la sintassi:
Codice: [Seleziona]

STATIC PRIVATE AS INTEGER = 0

In questo esempio, viene dichiara la variabile static all'interno della classe, e inizializzata con il valore 0.
La prima volta che la classe viene utilizzata (istanziata), viene creata anche , e questa rimane in memoria fino alla chiusura dell'applicazione. Il suo valore, a questo punto, si mantiene in memoria.
Se, per esempio, la classe và ad incrementare il valore di , la nuova impostazione rimarrà valida anche se l'oggetto padre viene distrutto.

Michele

  • Visitatore
Re: variabili static
« Risposta #13 il: 21 Settembre 2009, 22:10:20 »
quindi se dichiaro una variabile STATIC in un form secondario che apro da uno pricipale questa verrà inizializzata la prima volta che apro il form
chiudendolo e riaprendolo ritroverò la stessa variabile con il valore che aveva prima della chiusura

si cancellerà solo quando termino completamente l'applicazione

scusate se ripeto le stesse cose, ma è un po che non smanetto con i linguaggi e l'ultima volta era ancora VB6 e faccio un po di confusione
ora non mi rimane che fare un po di esperimenti

Grazie

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: variabili static
« Risposta #14 il: 22 Settembre 2009, 16:43:26 »
Sì...

Il fatto che ci sia necessità di creare almeno un'oggetto, contenente la var statica, è perchè il codice non viene applicato tutto all'avvio dell'applicazione.
E' ovvio che se la form non viene mai utilizzata, e magari non esiste nessuna chiamata che la istanzi, è inutile che si tenga un'area di memoria occupata inutilmente. Questo finchè non viene creata... a questo punto Gambas si accorge della cosa e tiene la proprietà da conto, in area protetta.
La volta successiva che viene utilizzata la stessa classe, la variabile ritorna in superficie, permettendone l'interazione all'interno della classe (se PRIVATE) o dall'esterno (se PUBLIC).