Pagina 2 di 5 primaprima 1 2 3 4 ... ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 41
  1. #11
    Utente di HTML.it L'avatar di lyllo
    Registrato dal
    Apr 2001
    Messaggi
    832
    ecco la mia procedura:

    codice:
    procedure TForm1.TimeTimer(Sender: TObject);
    var pos,i:integer;
        prop:TProgressBar;
        nome:string;
    begin
      pos:=0;
      if sender.ClassName='TProgressBar' then
        begin
          prop:=sender as TProgressBar;
          if prop.position<rel then
            prop.position:=prop.position+rel;
        end;
    end;
    ma il riempimento è "istantaneo" l'interval è a 100000!!!

    grazie.

  2. #12
    prop.position:=prop.position+rel;

    credo che tutto dipenda da questo,quanto vale 'rel'??prova con lo step..

  3. #13
    Utente di HTML.it L'avatar di lyllo
    Registrato dal
    Apr 2001
    Messaggi
    832
    ho provato rel, perchè usando position+10, o StepIt la pb aumentava di una sola tacca...

  4. #14
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487
    Credo proprio che ci sia molta confusione in quel pezzo di codice.

    Innanzitutto, non si spiega come il controllo TProgressBar possa figurare come Sender dell'evento OnTimer dell'oggetto TTimer: solo quest'ultimo sarà il "mittente" (sender) ufficiale per ogni evento che lo riguarda.

    In secondo luogo, ciò che si deve implementare è una cosa molto semplice, pertanto deduco che ci siano anche altri fattori esterni ad influire sugli effetti collaterali e sul fatto che il programma non fa quello che dovrebbe.

    Ad esempio, ho creato un progetto Delphi vuoto, ho messo un TTimer e una TProgressBar sul form predefinito; le uniche proprietà che ho modificato sono Max e Mix del controllo ProgressBar, impostandole rispettivamente a 70 e a 20 (tanto per avere valori differenti da quelli di default); la proprietà Position viene ovviamente spostata a 20, il valore del minimo.

    Inserendo nell'evento OnTimer del componente TTimer questo codice:
    codice:
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if ProgressBar1.Position < ProgressBar1.Max then
        ProgressBar1.StepBy(10);
    end;
    all'avvio dell'applicazione ottengo esattamente un riempimento graduale della barra, partendo dal valore minimo fino al valore massimo, incrementando Position di 10 unità per volta attraverso il metodo StepBy (da utilizzare al posto di StepIt).

    Non c'è nient'altro da fare. Del resto, sul controllo TProgressBar c'è ben poco da dire; in sostanza, credo che il problema di visualizzazione sia derivato direttamente da un errato calcolo dei valori da attribuire alle proprietà del controllo, e non da un problema di funzionamento del controllo stesso che, dall'esempio sopra, funziona a dovere.

    Inoltre, il pezzo di codice postato include la dichiarazione di variabili che non vengono mai utilizzate...si tratta dell'effettivo codice dell'evento oppure ci sono parti che non sono state postate e che potrebbero contenere proprio l'errore che dà origine all'intero problema?

    Ciao a tutti!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #15
    Utente di HTML.it L'avatar di lyllo
    Registrato dal
    Apr 2001
    Messaggi
    832
    si chiaramente il codice è molto più complesso e non potevo postarlo tutto, speravo di poter semplificare la domanda e di ottenere la risposta che cercavo
    in realtà però non credo che l'errore dipenda da ciò che c'è intorno..
    il fatto è che in una procedura viene calcolata la position della barra in questione e sembre nella stessa viene impostata con il tipico xxx.position:=yyy;
    al posto di quel comando in quella procedura, speravo fosse sufficiente inserire la chiamata alla pricedura timer1timer(sender);
    in cui il sender fosse la pb che deve essere incrementata.
    questo perchè visto che vi sono MOLTEPLICI barre nel form, non sapevo come comunicare alla procedura del timer quale barra incrementare.

    grazie, e ciao.
    spero di essere stato chiaro.

  6. #16
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487
    Originariamente inviato da lyllo
    si chiaramente il codice è molto più complesso e non potevo postarlo tutto, speravo di poter semplificare la domanda e di ottenere la risposta che cercavo
    in realtà però non credo che l'errore dipenda da ciò che c'è intorno..
    La TProgressBar svolge un numero limitato di funzioni: basta impostare, se lo si vuole, le proprietà Max e Min e, successivamente, Position per indicare il valore da rappresentare. Non c'è altro da aggiungere. Proprio per questo sono convinto che il problema sia proprio dovuto ad un errato calcolo dei punteggi oppure al fatto che l'assegnazione del valore viene fatto all'interno di una gestione di evento nella sua totalità. Spiego il concetto più avanti.

    Originariamente inviato da lyllo
    il fatto è che in una procedura viene calcolata la position della barra in questione e sembre nella stessa viene impostata con il tipico xxx.position:=yyy;
    al posto di quel comando in quella procedura, speravo fosse sufficiente inserire la chiamata alla pricedura timer1timer(sender);
    in cui il sender fosse la pb che deve essere incrementata.
    Forse non è stata chiara l'indicazione dell'utilizzo del TTimer: non è sufficiente richiamarne il metodo di gestione dell'evento per ottenere l'effetto di riempimento graduale che si desidera.

    Originariamente inviato da lyllo
    questo perchè visto che vi sono MOLTEPLICI barre nel form, non sapevo come comunicare alla procedura del timer quale barra incrementare.
    Cerco di riassumere il problema. Un evento viene generato solitamente a seguito di un'azione compiuta dall'utente, che dà luogo all'invio di un messaggio all'applicazione che, alla fine, si traduce nell'esecuzione di un evento, appunto.

    Se la procedura che "riempie" la ProgressBar si trova all'interno del metodo di gestione di un evento, tale procedura modificherà più volte il valore di Position attraverso più iterazioni, indicando altrettante volte a Windows che il controllo deve essere ridisegnato; l'operazione di ridisegno, però, avverrà solo quando al termine della procedura di evento, quando il controllo si troverà a gestire il messaggio WM_PAINT, che verrà ricevuto e gestito solo dopo il termine della procedura che aggiorna Position, appunto; in poche parole, durante il processo (l'esecuzione del ciclo che aumenta il valore di Position) l'applicazione apparirà bloccata e il controllo verrà ridisegnato solo al termine, visualizzando direttamente il valore finale.

    La soluzione del TTimer era stata proposta poichè funzionando con l'intercettazione di un messaggio WM_TIMER che viene inviato ogni "n" millisecondi all'applicazione, ciascun "tick" del timer stesso poteva comportare l'aggiornamento del valore di Position e, successivamente, la visualizzazione istantanea di quel valore dovuta al fatto che l'applicazione procede con la gestione dei messaggi che arrivano in coda, incluso WM_PAINT per il ridisegno. In questo modo, gradualmente, a intervalli periodici, l'applicazione esegue un incremento della barra, la aggiorna, incrementa, aggiorna e così via, ad ogni "tick" del timer.

    Concludendo, hai due possibili strade: o richiami il metodo Update del controllo ProgressBar ogni volta che cambi il valore di Position, forzando l'aggiornamento del controllo e bypassando la normale gestione di refresh di Windows (che viene così anticipata), rallentando però i tempi di esecuzione, oppure utilizzi un timer che, prelevando i dati delle ProgressBar da una struttura dati appropriata, si occupino periodicamente di riflettere tali valori sui rispettivi controlli ProgressBar, impostando Position, e mantenendoli aggiornati ma consentendo all'applicazione di "respirare", continuando a ricevere e gestire i messaggi in coda, inclusi i WM_PAINT per l'aggiornamento visuale dell'aspetto dei controlli.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #17
    Utente di HTML.it L'avatar di lyllo
    Registrato dal
    Apr 2001
    Messaggi
    832
    mi pare doveroso ringraziarti per la lunga, precisa e semplice spiegazione che mi hai fornito.
    quello che ti chiedo è, a questo punto,
    oltre ad inserire nel codice una procedura sul Timer che altro devo fare?
    o meglio,
    essendo in gioco ben 6 progress bar, come dico al timer di incrementare SOLO quella specifica?

    grazie.

  8. #18
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487
    Originariamente inviato da lyllo
    essendo in gioco ben 6 progress bar, come dico al timer di incrementare SOLO quella specifica?
    Non saprei...attribuisci a ciascuna ProgressBar un indice, o un identificatore quale può essere il nome stesso del controllo; quando è necessario incrementare gradualmente una specifica barra, memorizzane il riferimento all'interno di una variabile apposita, riservata esclusivamente a questo scopo, e utilizza tale riferimento all'interno dell'evento OnTimer del TTimer di incremento per aumentare la ProgressBar fino al punto desiderato; quando il processo è terminato (la barra ha raggiunto la posizione che si voleva ottenere), è sufficiente disabilitare il timer, oppure impostare la variabile di riferimento di cui sopra al valore nil (controllando nel timer che la variabile stessa sia diversa da nil prima di accedere alle sue proprietà e incrementare il valore di Position).

    Concludendo, le soluzioni possibili sono tante e molteplici.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #19
    Originariamente inviato da alka
    Concludendo, le soluzioni possibili sono tante e molteplici.
    Potresti anche creare un componente ad-hoc per la tua applicazione.

  10. #20
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487
    Originariamente inviato da AlbertoPicca
    Potresti anche creare un componente ad-hoc per la tua applicazione.
    E' un ottima idea! Non mi era venuto in mente, però in effetti è senz'altro la soluzione migliore; creando dinamicamente un TTimer all'interno del controllo derivato e assegnando un metodo per la gestione dell'evento OnTimer dello stesso, è possibile integrare in un discendente diretto di TProgressBar le caratteristiche di "auto incremento graduale temporizzato", magari aiutandosi con l'aggiunta di metodi alla classe che svolgano già tutte le operazioni (ad esempio, vai da 10 a 70 con 100 millisecondi di intervallo) impostando poi le proprietà del controllo e del timer incorporato al suo interno.

    Complimenti ad Alberto!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.