Newsgroup: it.comp.lang.delphi
Titolo: Valore incomprensibile

Non ne esco e chiedo aiuto.
Questo è il metodo di una classe. Se Self.Count è zero, viene eseguita la 
istruzione idx:= i; dove i è un valore assurdo. Perchè e da dove vien questo 
valore ?
 
function  TListOfAccounts.ItemNotFound(const aConto: string; var idx: 
integer): boolean;
var i: integer;
begin
   result:= true;
   for i := 0 to Self.Count - 1 do
   begin
      if Self.Items[i].AccountCode = aConto then
      begin
         result:= false;
         idx:= i; // Item trovato. Restituisci posizione nella lista
         break;
      end;
   end;
   idx:= i;      // item non trovato. Restituisci posiz dove va aggiunto
end; 
 

Ciao,
 
[Quoto]

[Fine]
 
Io metterei un controllo sul count, una cosa del tipo
 
If self.count=0 then exit; questo perche' se self.count e' zero il tuo ciclo 
e' impostato per for I:=0 to -1 do.
Prova e di se hai risolto ....
 
ciao
 
Daniele 
 

 Non ne esco e chiedo aiuto.
 
// CUT
 
Se il valore di Self.Count è 0 nel ciclo for non entra. Ma quello che stai 
facendo è comunque sbagliato: non puoi assegnare Idx := i; alla fine del 
 ciclo for perché il valore di i è indefinito.
 
https://stackoverflow.com/questions/2610900/what-is-the-loop-variable-after-a-for-loop-in-delphi
 
 
Leggi il commento di Nick Hodges alla prima risposta: "The variable is specifically 
documented to be undefined after the loop is complete. If you need a defined 
variable after the loop, use while or repeat"
 
In pratica, detto in parole povere, basta che assegni Idx := -1; quando imposti 
result := True;
 
function TListOfAccounts.ItemNotFound(const aConto: string; var idx: integer): 
boolean;
var
  i: integer;
begin
  result:= true;
  idx := -1;
  for i := 0 to Self.Count - 1 do
  begin
    if Self.Items[i].AccountCode = aConto then
    begin
      result:= false;
      idx:= i; // Item trovato. Restituisci posizione nella lista
      break;
    end;
  end;
end; 
 
HTH,
David
 
 

E' proprio quello c he avete detto entrambi. In effetti la prima volta che 
la funzione era richiamata self.count era zero!
Quanto tempo ho perso ... Grazie e.. Buone Feste !!!
 

Ciao Stark,

A prescindere dal fatto che Self.Count sia zero o meno, l'assegnazione "idx 
:=  i", fuori dal ciclo for, essendo i la variabile indice per il ciclo for 
stesso, E' SBAGLIATA E NON VA FATTA! Hai capito?
 
HTH
David
 
 

 ciclo for stesso, E' SBAGLIATA E NON VA FATTA! Hai capito?
 
Nella sua funzione, come giustamente hai fatto notare, l'errore e' nella non 
inizializzazione della variabile.
Cosi' se il count=0 la funzione restituiva un valore assurdo.
Invece una cosa del genere (anche se non ha una rilevanza giustificativa)
 
function  TListOfAccounts.ItemNotFound(const aConto: string; var idx:
integer): boolean;
var i: integer;
begin
   result:= true;
   I:=-1;
   for i := 0 to Self.Count - 1 do
   begin
      if Self.Items[i].AccountCode = aConto then
      begin
         result:= false;
         idx:= i; // Item trovato. Restituisci posizione nella lista
         break;
      end;
   end;
   idx:= i;      // item non trovato. Restituisci posiz dove va aggiunto
end;
 
di per se lavora (nel senso che essendo I una variabile locale alla fine del 
ciclo rimane impostata sull'ultimo valore Self.Count - 1)
Se lui vuole che la funzione restituisca (oltre a true/false) anche la nuova 
posizione allora la funzione dovrebbe essere
 
begin
   result:= true; // non esiste
   I:=-1;  // Setto la posizione come non trovato e che verra' restituita
   If Self.count=0 then Exit; // Non serve andare avanti, mantengo tutto 
come in origine
   for i := 0 to Self.Count - 1 do // Procedo
   begin
      if Self.Items[i].AccountCode = aConto then
      begin
         result:= false;
         idx:= i; // Item trovato. Restituisci posizione nella lista
         break;
      end;
   end;
   if Result then
   Begin
       // Ho terminato il ciclo, la stringa passata non e' stata trovata
       // ora I=Self.Count - 1 in questo blocco, se serve, lavoro su idx, 
che a ragion d'essere dovrebbe avere il valore originale.
   end;
End;
 
Tutto perfezionabile e semplificabile !!
 
Ciao
 
Daniele
 

"David Lastrucci"  ha scritto nel messaggio 
news:c547f374142298...@news.eternal-september.org...
A prescindere dal fatto che Self.Count sia zero o meno, l'assegnazione "idx
:=  i", fuori dal ciclo for, essendo i la variabile indice per il ciclo for
stesso, E' SBAGLIATA E NON VA FATTA! Hai capito?
David
 
Certo, certo. L'ho tolta. Tra l'altro non serve nemmeno, perchè se la 
funzione restituisce true per indicare che l'item non è stato trovato, a 
quel punto posso usare il valore  .Count per aggiungere l'item mancante.
 

 di per se lavora (nel senso che essendo I una variabile locale alla fine 
del ciclo rimane impostata sull'ultimo valore Self.Count - 1
 
Ne sei convinto?
 
Il valore della variabile i, dopo il ciclo for, è indefinito: vuol dire che 
se ti funziona lo fa perché hai avuto fortuna.
 
Leggi qua:
 
https://stackoverflow.com/questions/2610900/what-is-the-loop-variable-after-a-for-loop-in-delphi
 
 
Saluti,
David
 
 

> Il valore della variabile i, dopo il ciclo for, è indefinito: vuol dire 
che se ti funziona lo fa perché hai avuto fortuna.
 
Ti aggiungo che nelle ultime versioni dei compilatori di Delphi ti viene 
segnalato un Warning: [dcc32 Warning] Unit1.pas(42): W1037 FOR-Loop variable 
'i' may be undefined after loop
 
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/W1037_FOR-Loop_variable_%27%25s%27_may_be_undefined_after_loop_(Delphi)
 
 
Fate attenzione ai Warning non sono errori di compilazione ma poco ci manca!
 
Spero vi sia di aiuto.
David
 
 

 che se ti funziona lo fa perché hai avuto fortuna.
Onestamente la fortuna credo centri poco !!!
Saranno quei misteri del compilatore !!!
Sempre per essere onesti, i valori delle variabili dei cicli for,while ecc.. 
li leggo solo quando devo controllare un ciclo con il break point e (a 
volte) uscito dal ciclo vedo il valore.
Non ho mai settato fuori dai cicli .....
 
Ok, ora spengo e per una settimanaina .... solo riposo !!!
 
Ciao e buon Natale
 
Daniele
 
 

 quel punto posso usare il valore  .Count per aggiungere l'item mancante.
 
Scusami ... non ho ben capito quello che stai facendo !!!!
A spanne, stai lavorando su un db dove esiste una tabella con dei conti.
I conti sono UNIVOCI (non puo' esserci un numero di conto doppio).
Cosa ti vieta di lavorare sul db attraverso una bella griglia?
Se poi hai creato un file indice con il numero di conto settato come unique 
il controllo lo fa gia' lui (il db).
Nella tua logica, se trovi il numero di conto cosa fai? Stai modificando il 
record o per errore ne stai inserendo uno nuovo ?
Le due opzioni sono gestite in modo estremamente diverso !!! se modifichi 
... salvi, se e' nuovo esci.
 
Sono solo supposizioni ....
 
Buon Natale
 
ciao
 
Daniele
 

 end;
 
Forse cosi' e' anche piu' semplice
 
function  TListOfAccounts.ItemNotFound(const aConto: string; var idx: 
integer): boolean;
var i: integer;
begin
   result:= true;
   idx:=-1;	
   for i := 0 to Self.Count - 1 do
   begin
      if Self.Items[i].AccountCode = aConto then
      begin
         result:= false;
         idx:= i; // Item trovato. Restituisci posizione nella lista
         break;
      end;
   end;
end;

 ciclo rimane impostata sull'ultimo valore Self.Count - 1)
 
Non e` garantito. Non va usata con quello scopo. 
Comunque l'impostazione generale di quella funzione e` sbagliata. Dovrebbe essere chiamata "Find" o "FindItem" e seguire la firma standard delle funzioni che cercano qualcosa in una lista: restituire la posizione o -1 quando non trovato. Le funzioni (come le variabili booleane) dovrebbero di norma testare la condizione positiva (Item trovato) e non quella negativa (item non trovato).