Newsgroup: it.comp.lang.delphi
Titolo: Ma perchè non funziona !!!!!!!! ??????

Ho questo codice semplicissimo che non funziona e non riesco a capire
perchč:
repeat
     readln(file_temp,s);
until (s=str1) or (eof(file_temp)); #Questo ricerca una stringa in un file
di testo quando la trova
  for ct2:=1 to 11 do readln(file_temp,s); # si sposta 11 righe piů in basso
nello stesso file
  readln(file_temp,s);  #Legge la dodicesima riga
  edit1.text:=s; #e fa questo assegnamento
perň la casella edit1 rimane vuota...anzi, se c'č qualcosa dentro diventa
vuota...eppure se vado a vedere il valore di quella variabile con il watch
c'č una stringa...ho provato a fare un'assegnazione alla stringa del tipo
s:='ciao' ed infatti funziona....che cosa succede ?
Daniele

  edit1.text:=s; #e fa questo assegnamento
Dopo l'assegnazione metti edit1.refresh.
In passato mi sembra abbia avuto anche io un problema simile.
Saluti
AS
"Se è Microsoft non funziona"

until (s=str1) or (eof(file_temp));
Questo non e' il modo giusto di leggere dal file.
Usa invece :
repeat
  if ( not eof( file_temp ) ) then
     readln( file_temp, s ) ;
until eof( file_temp ) or ( s = str1 ) ;
file_temp deve essere un TextFile chiaramente.
 
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
--------------------------------------------------------------
"Partire e' un po' morire e morire e' partire un po' troppo !"
--------------------------------------------------------------


   ????
e il buon vecchio while??
perdonami ma non capisco la tua correzzione... è peggio del suo ciclo!
while (Not  eof(file_temp))And(s<>str1) do readln(file_temp,s);
non è piu' elegante?
Cmq, prova ad aprire un file di testo che non ha righe vuote, magari sbagli
semplicemente il
conteggio delle righe e cadi su una riga vuota e non dove vorresti.
Ciao Silvio


Niente, non funziona neanche con il refresh...ma č assurdo veramente
Daniele

 file_temp deve essere un TextFile chiaramente.
Ma non č una questione di eleganza di codice...il problema č che non mi
funziona...e non ha senso, perchč facendo un watch sulla variabile s essa
contiene una bella stringa....
Daniele

 conteggio delle righe e cadi su una riga vuota e non dove vorresti.
No, non è possibile pechè 1. il file non ha righe vuote
2. facendo il watch sulla variabile s mi viene fuori una bella stringa
come è possibile ?
Daniele

Due Domande :
1) La stringa che vedi nel Watch č quella che ti serve?
2) Dove piazzi il BreakPoint? Nel "readln" o nel "edit1.text := s;"??
Perchč ovviamente se il breakpoint č sul readln la stringa che vedi č quella
precedente.

>
Ho questo codice semplicissimo che non funziona e non riesco a capire
perchč:
repeat
     readln(file_temp,s);
until (s=str1) or (eof(file_temp)); #Questo ricerca una stringa in un file
di testo quando la trova
  for ct2:=1 to 11 do readln(file_temp,s); # si sposta 11 righe piů in
basso
nello stesso file
  readln(file_temp,s);  #Legge la dodicesima riga
  edit1.text:=s; #e fa questo assegnamento
perň la casella edit1 rimane vuota...anzi, se c'č qualcosa dentro diventa
vuota...eppure se vado a vedere il valore di quella variabile con il watch
c'č una stringa...ho provato a fare un'assegnazione alla stringa del tipo
s:='ciao' ed infatti funziona....che cosa succede ?
<<
Cosě ad occhio sembra a posto _se il file č come te lo aspetti_.
Qualche domanda per sicurezza, e scusa se si tratta di domande stupide:
a) s č una variabile locale di tipo string?
b) file_temp č una variabile locale di tipo č aperto TextFile?
b1) č aperto con AssignFile / Reset ?
c) str1 č una costante di tipo string correttamente assegnata?
c1) include CRLF?
c) hai pensato di usare una TStringList per leggere il file, trovare la
stringa, avere accesso tramite indice, sapere quante righe ci sono, non
preoccuparsi di dover chiudere il file, ecc.?
Saluti
Paolo Arosio

   edit1.text:=s; #e fa questo assegnamento
Ciao Silvio

> non è piu' elegante?
Forse e' piu' elegante e del tutto equivalente.


   edit1.text:=s; #e fa questo assegnamento
Ciao!
Allora... intanto dovresti specificare cosa è str1 .... una costante?
un'altra variabile?
Poi, ripetendoti i consigli che ti hanno già dato sulla questione dell'
EOF...,
passiamo al sodo :
In generale... non puoi essere mai sicuro di cosa contiene un file... vuoi
per errori nel
disco, vuoi per un utente che lo va a modificare... voi per mille altre
ragioni...
quindi devi implementare un minimo di gestione degli errori...
Qui di seguito ti presento un metodo, suscettibile oviamente di modifiche e
adattamenti
... e correzioni!!
Vedi un po' se ti funziona!!
const str_comp = 'Prova di stringa di comparazione';
Var
f : textfile;
c : boolean; // Questa variabile ci serve per sapere *perchè* siamo usciti
dal ciclo while!!
s : string;
i : integer;
s := '';
c:= true;
While ((not eof(F)) or C) do begin
   Readln (f,s);
   C := (S <> str_comp); // Sei sicuro che debba essere _uguale_ e non
_contenuta_ ???
 End;
If C Then begin MessageDlg ( ... stringa non trovata... ); exit; end;
// se invece ha trovato la stringa...
i := 1;
While i <= 12 do  begin
   if not eof (f) then readln (f,s) else break;
   inc (i);
end;
if i <> 12 then ... c'è stato qualche errore ...
// se invece è tutto a posto, la stringa s contiene i dati della 12esima
riga dopo la Str_Comp :
Edit1.Text := s;
Se vuoi avere un comferma su s, puoi fare  qualcosa tipo Memo1.Lines.Add
(S);
Ciao!!!
Davide DG

 Il tuo ultimo readln non legge nulla perche' č quasi sicuramente (95%!)
EOF
Sei cosě sicuro ? Il file ha piů di 50 linee ed esce dal repeat proprio nel
punto in cui io mi aspettavo che dovesse uscire....salta 11 righe che
esistono, perchč le ho controllate una ad una, arriva proprio alla riga dove
deve arrivare ma non funziona....č ovvio che i controlli vanno fatti, ma
questo era solo un abbozzo che deve funzionare anche cosě

 Vedi un po' se ti funziona!!
proverò


la stringa la trova !!!
Scusa, ma perche' non mandi il sorgente intero ? solo cosi' temo ti si
possa aiutare...


Daniele Tessaro,
č davvero strano. Sono tutti metodi di oggetto o hai procedure _normali_?
stai lavorando su GUI o console? Prova ad abilitare tutti i warnings del
compilatore, dice q.cosa dopo la modifica del sorgente? Prova a rimpiazzare
i readln delle righe che skippi con readln(File).
Se ancora non funziona, per favore prova il codice che segue da un nuovo
progetto con un Button e un Edit. Come vedi Button1Click č il tuo codice e
funziona senza problemi; facci sapere cosa succede.
Saluti
Paolo Arosio
-------------------------
const
  NUMLINES: integer = 99;
  Fn: TFileName = 'c:\temp\tmp.txt';
  fmtStr2Find: string = 'Questa č la linea %d di un file di testo';
procedure TForm1.FormCreate(Sender: TObject);
var Sl: TStringList;
    i: integer;
begin
  Sl := TStringList.Create;
  try
    for i := 0 to NUMLINES-1 do
      Sl.Add(Format(fmtStr2Find, [i+1]));
    Sl.SaveToFile(Fn);
  finally
    Sl.Free;
  end;
  Randomize;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
  Lines2Skip: integer = 11;
var s, Str2Find: string;
    F: TextFile;
    i: integer;
begin
  {$I+}
  if not FileExists(fn) then
    Exit;
  Str2Find := Format(fmtStr2Find, [1 + random(NUMLINES-Lines2Skip-1)]);
  ShowMessage('Str2Find = ' + Str2Find);
  AssignFile(F, fn);
  Reset(F);
  try
    repeat
      readln(F, s);
    until (s = Str2Find) or (eof(F));
    for i := 1 to Lines2Skip do
      readln(F, s);       // si sposta 11 righe piů in basso nello stesso
file
    readln(F, s);       // Legge la dodicesima riga
    Edit1.Text := s;    // e fa questo assegnamento
  finally
    CloseFile(F);
  end;
end;
-------------------------