Newsgroup: it.comp.lang.delphi
Titolo: Progress Bar

Alla pressione di un bottone chiamo una funzione onClick piuttosto
complessa che impiega parecchio tempo a giungere a termine.
Ho fatto in modo che si apra un piccolo frame con una progress bar e
la scritta attendi.
Application.CreateForm( TFUpdate,FUpdate );
FUpdate.showmodal;
FUpdate.free;
Peccato che le istruzioni dopo la free della funzione onClick non
vengono eseguite finche non chiudo la progress bar.
Come si fa a far procedere l'esecuzione di onClick lasciando la
progress bar in primo piano ?
Alla fine di onClick o in caso di eccezioni faccio poi
FUpdate .release;
Grazie


se chiami showmodal � chiaro che il thread principale � bloccato fino a che 
non chiudi.
Perch� non eseguire il codice all'interno di FUpdate?
Andrea 

 FUpdate.free;
Chiami ShowModal, ossia la visualizzazione modale della tua form, cambia 
con FUpdate.Show;
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

On 21 Ott, 16:47, ^_Goblin_^

Ci ho provato ma mi esce un'altra form (quella di login
all'applicazione) invece della FUpdate

 Andrea
Buona idea, però avendo una cosa di questo tipo
procedure TFUpdate.Timer1Timer(Sender: TObject);
begin
  UpdateImageProgress(Image1);
end;
procedure TFUpdate.UpdateImageProgress(const img : TImage);
const
  step = 4;
var
  b  : TBitmap;
begin
  with img.Picture.Bitmap do
  begin
    b := TBitmap.Create;
    try
      b.Width  := Width;
      b.Height := Height;
      BitBlt(b.Canvas.Handle, step, 0, Width-step, Height,
Canvas.Handle, 0, 0, SRCCOPY);
      BitBlt(b.Canvas.Handle, 0, 0, step, Height, Canvas.Handle, Width-
step, 0, SRCCOPY);
      Assign(b);
    finally
      FreeAndNil(b);
    end;
  end;
end;
con la showmodal entro in un ciclo infinito.
Devo impostare un flag per uscirne credo ...

 FUpdate .release;
Free, non release.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 progress bar in primo piano ?
Hai gia' giardato su Torry ????
Li c'e' una vasta scelta di progress bar, sicuramente c'e' anche quella che 
fa per te.
Comunque, NON devi chiamare ShowModal perche' con questa chiamata la finstra 
rimane in attesa di un evento (close) per scomparire.
Se ho capito bene, tu ti costuisci la tua bella form con la barra di 
progresso a te piu' congeniale, poi la chaimi con Show.
Ogni volta che devi fare l'update della barra devi anche chiamare, dopo, 
Application.ProcessMessage per vedere la barretta che avanza.
Nei file che trovi su torry ci sono anche gli esempi, piu' pratici di molti 
discorsi.
Ciao, Daniele 
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4529 (20091021) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com

 FUpdate.showmodal;
Ma prima di usare ShowModal hai letto nella guida le differenze
rispetto a "Show"?
Io credo prp di no, altrimenti non avresti aperto questo th....
A.

In che senso spostare la logica fuori dal form ? Sono alle prime armi
con delphi ..

 Sono alle prime armi con delphi ..
Questi concetti non hanno ASSOLUTAMENTE NIENTE  a che vedere con
delphi/vb/c#/java/c++ etc etc etc.
Si tratta di un concetto basilare della programmazione: separare
logica da interfaccia utente.
A.


io ho fatto cosi:
procedure TForm1.SpedisciClick(Sender: TObject);
begin
//Apre la progress bar
with TForm2.Create(Self) do
try
      Release;
finally
      Free;
ma la finestra non compare quando faccio l'invio dell'email.

 ma la finestra non compare quando faccio l'invio dell'email.
Come diceva il mio prof. di Filosofia quando mi interrogava: " Lei ha 
poche idee ... e molto ben confuse !!" :)
quello che hai postato crea form2 e la distrugge 2 volte senza nemmeno 
farla vedere ..
Oltre la soluzione di Alberto (che resta la migliore), puoi fare anche:
<Codice non testato e scritto al volo mi scuso per eventuali errori>
procedure TForm1.SpedisciClick(Sender: TObject);
begin
Form2 := TForm2.Create(self);
   Try
     Form2.progressbar.min := 0;
     Form2.progressbar.Max := 100;
     Form2.Show;
<    Vari passaggi della tua procedura>
     Form2.progressbar.Position := Form2.progressbar.Position+1;
     Form2.progressbar.Update;
   Finally
     FreeAndNil(Form2);
   end;
end;
^_Goblin_^

 ma la finestra non compare quando faccio l'invio dell'email.
Come diceva il mio prof. di Filosofia quando mi interrogava: " Lei ha 
poche idee ... e molto ben confuse !!"  :)
quello che hai postato crea form2 e la distrugge 2 volte senza nemmeno 
farla vedere ..
Oltre la soluzione di Alberto (che resta la migliore), puoi fare anche:
<Codice non testato e scritto al volo mi scuso per eventuali errori>
procedure TForm1.SpedisciClick(Sender: TObject);
begin
Form2 := TForm2.Create(self);
   Try
     Form2.progressbar.min := 0;
     Form2.progressbar.Max := 100;
     Form2.Show;
     begin
<   Loop della tua procedura>
       Form2.progressbar.Position := Form2.progressbar.Position+1;
       Form2.progressbar.Update;
<   end loop della tua procedura>
     end;



la procedura da te descritto mi da la barra ma non la fa muovere fiche
l'email non è spedita, poi ho provato anche quella sugerita da alberto
e non funziona non mi da la finestra.