Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    13

    [Turbodelphi] Cambiare Caption ad una label

    Salve a tutti, avrei un problema:
    Devo cambiare la caption ad una label nella mia form. Il problema è che nell'esecuzione del codice relativo al click del mouse su un pulsante c'è un ciclo for che dura per qualche secondo (tipo 5-6) e nonostante io cambi la caption con l'istruzione Label1.Caption:='Pippo' la label cambia la caption sempre e solo dopo aver terminato il ciclo for (quindi io clicco sul pulsante e prima di veder cambiato il nome della label devo aspettare che finisca tutte le altre istruzioni). C'è un modo per evitare ciò?
    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Il problema è legato al fatto che il messaggio Windows (WM_PAINT) viene gestito dal thread principale dell'applicazione solo quando l'evento ha terminato la sua elaborazione.

    Ad ogni modo, puoi sempre invocare il metodo Update del controllo Label prima di iniziare il ciclo per bypassare la coda dei messaggi e aggiornare subito l'etichetta.

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

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    puoi anche mettere un application.processmessages (subito dopo la .caption='qualcosa'), con effetti sostanzialmente equivalenti

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    13
    Grazie mille! Funziona perfettamente =)

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da franzauker
    puoi anche mettere un application.processmessages (subito dopo la .caption='qualcosa'), con effetti sostanzialmente equivalenti
    C'è una differenza abbastanza sostanziale: se qualcuno fa clic o genera un evento in generale, cioè provoca l'invio di un messaggio nella coda dell'applicazione, questo viene gestito prima di effettuare il ciclo (grazie a ProcessMessages), cosa che non avviene nel caso di Update.

    In sostanza, l'uso di ProcessMessages in questo caso è superfluo e apre pure a possibili problemi: se faccio clic rapidamente sul pulsante, avvio più cicli uno dentro l'altro prima che il precedente sia terminato.

    In questo caso specifico, ProcessMessages mi sembra inutile e dannoso per l'effetto che si desidera ottenere, che con la prima soluzione proposta viene espletato in sicurezza senza alcun tipo di effetto collaterale.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    in realtà un effetto collaterale positivo c'è, ovvero quello di non "paralizzare" l'intera applicazione (in particolare il ridisegno delle form) nel caso in cui ci sia un ciclo decisamente CPU-bound.

    L'applicazione rimane diciamo così "responsiva" (per modo di dire, s'intende) piuttosto che "semicongelata"

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da franzauker
    in realtà un effetto collaterale positivo c'è, ovvero quello di non "paralizzare" l'intera applicazione (in particolare il ridisegno delle form) nel caso in cui ci sia un ciclo decisamente CPU-bound.
    Non nel caso in esame. Non è stato chiesto - per quanto ho capito io - di aggiornare la Label durante il ciclo, ma prima del ciclo (il ciclo che segue la modifica della proprietà Caption impedisce di gestire il messaggio che ridisegna l'etichetta, che può essere quindi aggiornata direttamente "una tantum" chiamando semplicemente il metodo Update prima del ciclo.

    L'uso di ProcessMessages, per i motivi descritti sopra, non porta alcun giovamento, non cambia la logica del programma ma introduce solo un rischio in più che eventi non desiderati si possano frapporre tra l'aggiornamento della Label e l'inizio del ciclo che, per la visione dell'autore della discussione, è vista come un'operazione "monolitica".

    Originariamente inviato da franzauker
    L'applicazione rimane diciamo così "responsiva" (per modo di dire, s'intende) piuttosto che "semicongelata"
    Questo vale solo se stiamo parlando di mantenere "viva" l'applicazione durante il ciclo.

    Supponendo che l'autore si riferisse a questo, lo strumento adatto per eseguire elaborazioni parallele lasciando "respirare" il programma è il thread, che occupa meno CPU rispetto alla chiamata di ProcessMessages per ogni iterazione di un qualsivoglia ciclo.

    Ciao!
    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.