Newsgroup: it.comp.lang.delphi
Titolo: D2005 mantenimento variabili globali

strano ma vero ... con WebForm , ma succede anche su WinForm
dichiaro le variabili nella sezione, aggiungo 3 Button e 2 Label
1 imposta su True , 1 su False ed il terzo verifica se True o False
bene , anzi male ... Flg_BtnOk e' sempre false
PathPagine e' sempre quello dichiarato su Page_Load , ovvero
PathPagine:='http:\\www.prova...'; mentre doivrebbe essere
http:\\www.prova... btn1 o   http:\\www.prova... btn2
dove cerco la causa ?
  private
    { Private Declarations }
    Flg_BtnOk:Boolean;
    PathPagine:String;
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
begin
  // TODO: Put user code to initialize the page here
  Flg_BtnOk:=False;
  PathPagine:='http:\\www.prova...';
end;
procedure TWebForm1.Button3_Click(sender: System.Object; e: 
System.EventArgs);
begin
  if Flg_BtnOk then Label1.Text:='True'
  else Label1.Text:='False';
  Label2.text:=PathPagine;
end;
procedure TWebForm1.Button2_Click(sender: System.Object; e: 
System.EventArgs);
begin
  Flg_BtnOk:=False;
  PathPagine:='http:\\www.prova... btn2';
end;
procedure TWebForm1.Button1_Click(sender: System.Object; e: 
System.EventArgs);
begin
  Flg_BtnOk:=True;
  PathPagine:='http:\\www.prova... btn1';
end; 

 dove cerco la causa ?
Secondo me, gli errori per cui cerchi ogni tanto aiuto qui sono dovuti 
ad un'unica causa: stai tentando di implementare un'applicazione 
ASP.NET
 
WebForms come se fosse un'applicazione WinForms o 
VCL.NET
 (tanto per 
avere riferimenti paragonabili).
Un'applicazione Web è per sua natura (a causa del mezzo di comunicazione 
utilizzato) diversa da una comune applicazione Windows e, pertanto, i 
meccanismi di comunicazione tra "pagine Web" non sono identici a quelli 
adottati tra "form Windows".
Forse non ho compreso a fondo il tuo problema poichè, codice a parte, 
non ho notato una domanda o un dubbio "secco" e specifico, ma suppongo 
che tu stia cercando di memorizzare all'interno di una variabile privata 
un valore che desideri venga mantenuto tra un PostBack e l'altro della 
pagina; il problema è dato dal fatto che, ogni volta che richiami la 
pagina, indipendentemente che si tratti di un PostBack oppure no, viene 
creata una nuova istanza della pagina stessa.
E' necessario quindi che tu mantenga i valori che ti interessano 
all'interno di più transizioni verso la stessa pagina usando un 
meccanismo differente, come il *ViewState*, ad esempio.
Nel caso non abbia indovinato o centrato il problema, scrivi ancora. :-)
Ciao,
   Marco.
-- 
Marco «Alka» Breveglieri	
http://www.marco.breveglieri.name
  «bvmcnxsjlkhròhyeq, potrei scrivere a questo punto,
   se mi addormentassi sui tasti» (Daniele Luttazzi)

>
il problema l'hai centrato eccome !
dunque con ViewState posso memorizzare il valore di una variabile
es: ViewState['Colore']:='giallo';
e poi andarmelo a recuperare
es: Path:=ViewState['Colore'].ToString;
da quanto leggo su MSDN ViewState gestisce String,ArrayList e HashTable;
ma volendo memorizzare un tipo Boolean o Integer ? con ViewState non
si puo'
ciao Maurizio 

 si puo'
Nel ViewState puoi memorizzare qualsiasi "oggetto", quindi ti viene 
segnalato un errore di compilazione quando tenti di utilizzare un 
*Boolean* (System.Boolean) o un *Integer* (System.Int32) senza prima 
trasformarli in oggetti veri e propri.
La creazione di un oggetto a partire da un Value Type si chiama "boxing" 
e generalmente in Delphi non è un'operazione automatica a meno che non 
si utilizzi la direttiva di compilazione {$AUTOBOX ON} e {$AUTOBOX OFF}.
Trovo che in certi casi sia meglio disabilitare il "boxing automatico", 
poichè così puoi controllare quel tipo di operazione dato che è più 
pesante rispetto al trattamento e all'uso di Value Type (al contrario 
degli oggetti che invece costituiscono dei Reference Type), poichè 
comporta l'allocazione di un oggetto nell'heap, l'intervento del Garbage 
Collector in seguito e così via...
Prendendo il tuo esempio, per ottenere un oggetto che racchiude il 
valore booleano o intero al suo interno da memorizzare nel ViewState (o 
in qualsiasi altra struttura dati come ArrayList o Hashtable) dovresti 
fare così:
   ViewState['Colore'] := System.Object(MyIntegerColorValue);
In alternativa a System.Object puoi usare anche l'alias *TObject*.
Quando recuperi il valore dal ViewState, devi prima verificare che sia 
diverso da *nil* ed effettuare il cast inverso:
   if ViewState['Colore'] <> nil then
     MyIntegerColorValue := System.Boolean(ViewState['Colore'])
   else
     MyIntegerColorValue := MyPredefinedColorDefaultValue;
L'operazione di "unboxing" è più rapida del boxing.
Non ho verificato il codice ma dovrebbe essere concettualmente e 
sintatticamente corretto; in caso contrario, fammi sapere.
