Problemi per uso della progress bar in una routine

di il
12 risposte

Problemi per uso della progress bar in una routine

Buongiorno.SO w7, versione delphi 7.Ho provato ad usare la progressbar in una rotine per copiare file da una cartella ad un'altra.La routine funziona benissimo,e la mia intenzione nell'usare la Progressbar è quella di vedere la progressione della copia mano a mano che i file passano da una cartella all’altra (come si vede quando lo facciamo usando il SO), ma come lo faccio io non va bene,tralascio i particolari.Il comando della progressbar è nella routine stessa dove faccio eseguire la copia, ma come dico,non va bene perchè funziona ma non nel modo corretto.Posto le righe della routine di copia,dove si trova il comando della progressbar.Prima di chiedere aiuto nel forum ho cercato sul web ma non ho trovato (secondo me) soluzioni esplicite.So che sarebbe utile usare un Timer,ho provato, ma non riesco o non ho capito,come collegare il Timer alla routine di copia, per cui sono qui a chiedere aiuto.
NB.mi scuso se ci sono errori ortografici o di grammatica,colpa della mia vista non buona,ma rinunciare a imparare a programmare mi dispiace molto
esult := FindFirst(un1+'*.*' , faAnyFile, S);
     while Result = 0 do
       begin
         CpyFl(un1 + S.Name,un2 + S.Name);
        Result := FindNext(S);
         // barra: TProgressBar;
       barra.Position:= barra.Position+5;
       end;
R

12 Risposte

  • Re: Problemi per uso della progress bar in una routine

    caviccun ha scritto:


    Buongiorno.SO w7, versione delphi 7.Ho provato ad usare la progressbar in una rotine per copiare file da una cartella ad un'altra.La routine funziona benissimo,e la mia intenzione nell'usare la Progressbar è quella di vedere la progressione della copia mano a mano che i file passano da una cartella all’altra (come si vede quando lo facciamo usando il SO), ma come lo faccio io non va bene,tralascio i particolari.Il comando della progressbar è nella routine stessa dove faccio eseguire la copia, ma come dico,non va bene perchè funziona ma non nel modo corretto.Posto le righe della routine di copia,dove si trova il comando della progressbar.Prima di chiedere aiuto nel forum ho cercato sul web ma non ho trovato (secondo me) soluzioni esplicite.So che sarebbe utile usare un Timer,ho provato, ma non riesco o non ho capito,come collegare il Timer alla routine di copia, per cui sono qui a chiedere aiuto.
    NB.mi scuso se ci sono errori ortografici o di grammatica,colpa della mia vista non buona,ma rinunciare a imparare a programmare mi dispiace molto
    esult := FindFirst(un1+'*.*' , faAnyFile, S);
         while Result = 0 do
           begin
             CpyFl(un1 + S.Name,un2 + S.Name);
            Result := FindNext(S);
             // barra: TProgressBar;
           barra.Position:= barra.Position+5;
           end;
    R
    Dovresti mettere all'interno del while un bel Application.ProcessMessage, questo fa si che il SO elabori i task pendenti.
  • Re: Problemi per uso della progress bar in una routine

    Veramente la progressione la vedo anche senza Application.ProcessMessage, il problema è che non segue la copia,cioè se mancano ancora alcuni file da copiare, i segmenti arrivano alla fine della casella. Non so se allungando la casella della progressbar si vedrebbbe che non sono ancora arrivati alla fine della copia,ma non posso certo allungare la casella per tutto lo schermo,è per quello che penso non vada bene come faccio io,infatti quando copiamo e incolliamo qualcosa, la barra è corta anche se i file da copiare sono molti,ed è quello che vorrei ottenere.
  • Re: Problemi per uso della progress bar in una routine

    caviccun ha scritto:


    NB.mi scuso se ci sono errori ortografici o di grammatica,colpa della mia vista non buona,ma rinunciare a imparare a programmare mi dispiace molto
    La cattiva vista scusa solo gli errori ortografici... la grammatica devi mettercela tu!

    TProgressBar ha come proprietà fondamentali: Min, Max, Step e Position.
    Vanno impostate PRIMA dell'uso.

    Per farla avanzare devi o modificare Position o usare il metodo StepIt.
    Il timer serve a poco se prima non imposti in maniera corretta il valore di Max (cosa che tu non sembri fare).

    Inoltre devi stare attento perché la FindFirst ti restituisce anche i due pseudofile '.' e '..' che vanno ignorati.
    TUTTO ciò è ben scritto nella guida in linea di Delphi.
  • Re: Problemi per uso della progress bar in una routine

    Forse non uso in modo corretto le proprietà min,max,step,position,quindi grazie dell'avvertenza.Per me è una esperienza nuova l'uso di questo oggetto, e come tutte le cose nuove bisogna perderci qualche minuto per capire.Ti ringrazio, mi sei stato d'aiuto per il consiglio di porre attenzione sulle proprietà menzionate.Buona giornata, e grazie ancora.
  • Re: Problemi per uso della progress bar in una routine

    caviccun ha scritto:


    bisogna perderci qualche minuto per capire
    Vorrei far notare a te e a TUTTI quelli che vengono a chiedere aiuto che anche a noi che cerchiamo di aiutarvi servono MOLTI minuti per capire cosa volete davvero e come aiutarvi.
    Se imparaste a studiare la documentazione in maniera decente avreste MOLTI meno problemi e risparmiereste tempo...
    N
  • Re: Problemi per uso della progress bar in una routine

    Dire che hai ragione potrebbe offenderti,ma è così.Le tue parole mi fanno sentire piccolo piccolo.Però,senza voler trovare scuse banali, c'è un però.Anche se studiando la documentazione (l’ho fatto) non si capisse bene come fare una cosa, non si dovrebbe chiedere comunque nulla al forum?Quando andavamo a scuola non chiedevamo al prof di spiegarci una cosa che non avevamo capito?Comunque aiutare qualcuno dovrebbe essere gratificante,no? Sono già abbondantemente OT, scusami se ti replico, non vorrei essere ripreso dal moderatore.Come ti ho detto in precedenza, farò tesoro delle tue parole e presterò più attenzione alle proprietà dell'oggetto.Grazie tante.Ri:Buona giornata.
  • Re: Problemi per uso della progress bar in una routine

    caviccun ha scritto:


    Dire che hai ragione potrebbe offenderti,ma è così.Le tue parole mi fanno sentire piccolo piccolo.Però,senza voler trovare scuse banali, c'è un però.Anche se studiando la documentazione (l’ho fatto) non si capisse bene come fare una cosa, non si dovrebbe chiedere comunque nulla al forum?Quando andavamo a scuola non chiedevamo al prof di spiegarci una cosa che non avevamo capito?Comunque aiutare qualcuno dovrebbe essere gratificante,no? Sono già abbondantemente OT, scusami se ti replico, non vorrei essere ripreso dal moderatore.Come ti ho detto in precedenza, farò tesoro delle tue parole e presterò più attenzione alle proprietà dell'oggetto.Grazie tante.Ri:Buona giornata.
    Non ce l'ho con te ma visto che siamo in argomento ti esplicito la mia opinione, in generale.

    È gratificante quando non ripeti per la centesima (millesima?) volta le stesse stupide cose.
    È gratificante quando la gente non ha la coda di paglia e si offende perché gli fai notare che è un pigro o non ha letto con attenzione o...
    È gratificante quando perdi (impieghi) del tempo per aiutare qualcuno che ha cercato di aiutarsi prima.

    Se leggi i post del forum C/C++ degli ultimi giorni capisci di cosa parlo!
    In alcuni (troppi) casi la documentazione è scarsa ma non è sempre così: Delphi è un esempio di documentazione eccellente e Visual Studio pure.
    Ciao
    N
  • Re: Problemi per uso della progress bar in una routine

    È gratificante quando non ripeti per la centesima (millesima?) volta le stesse stupide cose
    Concordo senza ipocrisia, ma non mi pare che tu mi abbia ripetuto per la centesima volta la stessa cosa
    È gratificante quando la gente non ha la coda di paglia e si offende perché gli fai notare che è un pigro o non ha letto con attenzione o...
    non avrò mai la coda di paglia con chi cerca di aiutarmi anche perchè il mio interlocutore potrebbe avere ragione a redarguire bonariamente.Anche quì te lo dico senza ipocrisia
    È gratificante quando perdi (impieghi) del tempo per aiutare qualcuno che ha cercato di aiutarsi prima.
    Ma io l'ho fatto, l'ho anche specificato quando sono entrato : "So che sarebbe utile usare un Timer,ho provato, ma non riesco o non ho capito come collegare il Timer alla routine di copia, per cui sono qui a chiedere aiuto."

    saluti
  • Re: Problemi per uso della progress bar in una routine

    caviccun ha scritto:


    So che sarebbe utile usare un Timer,ho provato, ma non riesco o non ho capito come collegare il Timer alla routine di copia
    Dipende come vuoi usare la TProgressBar:
    A) mostra la percentuale di completamento dell'operazione;
    B) si muove, arrivando alla fine anche più volte, per mostrare che il programma è "vivo".

    Nel caso A non puoi usare un timer perché non sai (almeno in maniera abbastanza precisa) quanto durerà l'operazione.

    Nel caso B puoi usare un timer, es. ogni 500 ms e semplicemente chiamare TProgressBar.StepIt.
  • Re: Problemi per uso della progress bar in una routine

    Grazie per la risposta.Penso però di non aver capito.Nell'evento onTimer del Timer non compare la voce della progressbar che l'ho chiamata semplicemente - barra,quind non saperei come chiamare la barra dal Timer.
  • Re: Problemi per uso della progress bar in una routine

    Allora se volessi fare qualcosa di vagamente "professionale"

    (1) useresti la funzione che copia i file e mostra i foglietti che viaggiano
    (2) in alternativa PRIMA costruisci un elenco dei file da copiare (così sai quanti sono),
    POI mentre li lavori aggiorni man mano al barra.
    Per fare una cosa meno bozambica, a seconda di cosa fai, non metterai il numero dei file, ma la dimensione.
    Quindi oltre a fare l'elenco potresti determinare la dimensione complessiva.

    E mentre li copi man mano sommi i byte copiati.

    Ovviamente calcolare l'ETA sarebbe cosa buona e giusta.
    ---
    Se vuoi qualcosa di ancora meglio farai un TIMER che aggiorna poniamo ogni 2 secondi lo stato di avanzamento della barra, prendendo un dato globale sui byte copiati.
    In questa ipotesi il programma è sempre "vivo", altrimenti avresti momenti in cui è "morto" (copia file molto grandi).

    Infine, sempre nel mondo reale, useresti una copia a blocchi dei file, invece di una funzione di libreria, così da poter avanzare in misura esatta l'avanzamento (ciclo di lettura su buffer diciamo da 8 o 32KB fino a quando non ritorna meno della dimensione).

    Se poi sei fanatico come me nel frattempo calcoli l'hash del file sorgente, ed alla fine calcoli quello del file copiato per essere certo siano identici.
    Serve nel caso utilizzi VPN o roba simile, dove la copia non è garantita come in locale.

    un saluto
  • Re: Problemi per uso della progress bar in una routine

    No no, non sono fanatico e nemmeno intendo fare una cosa professionale.Ti contatto su skype(se riesco)
Devi accedere o registrarti per scrivere nel forum
12 risposte