Italian community of Lazarus and Free Pascal

Programmazione => Graphics => Topic aperto da: Fabio - Dicembre 14, 2011, 03:52:28 pm

Titolo: Forzare aggiornamento form
Inserito da: Fabio - Dicembre 14, 2011, 03:52:28 pm
Ho una procedura che cicla su tutti i file e directory e dovrebbe aggiornare un controllo con dei parametri, dico dovrebbe perchè la finestra esce solo quando il ciclo è terminato quindi l'applicazione risulta come bloccata fino a che non finisce.

In visual basic se non ricordo male si usava DoEvents o una roba simile per dare un po' di ossigeno al programma e dargli il tempo di aggiornare le finestre e i controlli, qui come si fa?

Ho già provato Application.Processmessages, Refresh, Repaint e Update ma niente da fare, quando parte il ciclo si blocca tutto e si sblocca solo quando il ciclo è terminato.
Titolo: Re:Forzare aggiornamento form
Inserito da: Fabio - Dicembre 14, 2011, 04:03:07 pm
Aggiorno il thread, dunque il problema è che la procedura viene eseguita all'apertura di un form che viene usato per mostrare l'avanzamento della procedura, e il form non viene proprio mostrato.

Se io sposto l'avvio della procedura dal FormShow a un FormClick e avvio la procedura a mano con un click allora mettendo un Update nel ciclo si vede l'aggiornamento delle statistiche in tempo reale.

Quindi cambio la domanda in, come fare a far partire una procedura dopo che il form supplementare risulta caricato e visibile ?
Titolo: Re:Forzare aggiornamento form
Inserito da: Fabio - Dicembre 14, 2011, 04:44:14 pm
E già che ci sono rincaro anche la dose  ;D , come posso far si che l'utente possa interrompere la procedura?

Ok che il form viene aggiornato però l'applicativo è comunque ingestibile, anche se ho un pulsante per annullare non riesco a cliccarlo fino a che la procedura è terminata.

Grazie.
Titolo: Re:Forzare aggiornamento form
Inserito da: xinyiman - Dicembre 14, 2011, 04:48:10 pm
Allora, metti quel codice in un timer. Il timer lo fai partire all'apertura della form valorizzando il parametro .Intervall a un valore superiore a 0 (si tratta dei millisecondi). E all'avvio del tuo timer imposti il paratetro interval=0 in maniera tale da eseguire quel blocco di codice una volta sola. Esempio

procedure TForm1.FormShow(Sender: TObject);
begin
    timer1.interval:=100;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    timer1.interval:=0;
    {tuo blocco di codice}
end;

Titolo: Re:Forzare aggiornamento form
Inserito da: Fabio - Dicembre 14, 2011, 05:13:45 pm
Ok perfetto, per l'avvio a form visibile è ok funziona.

Se avete poi un idea di come poter cliccare il pulsante che risulta non cliccabile fino al termine della procedura fate un fischio.

Grazie.
Titolo: Re:Forzare aggiornamento form
Inserito da: xinyiman - Dicembre 15, 2011, 08:23:38 am
Credo che l'unico modo per fare quello che dici sia la programmazione Multithreaded. Prova a dare un occhiata a questo tutorial

http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial
Titolo: Re:Forzare aggiornamento form
Inserito da: Fabio - Dicembre 15, 2011, 11:07:16 am
Leggendo quel documento ho trovato la risposta, non mi serve il multithread infatti anche li sconsigliano salvo rari casi, basta mettere Application.ProcessMessages ogni tanto nel ciclo, io l'ho messo nel momento in cui aggiorno a video le statistiche ( circa mezzo secondo )

L'avevo già provato ma si vede sbagliavo a usarlo.
Titolo: Re:Forzare aggiornamento form
Inserito da: xinyiman - Dicembre 15, 2011, 11:17:10 am
Bene comunque, vuol dire che hai risolto lo stesso :)