Immagino tu intenda avere un comportamento simile a quelle che si ottiene con i controlli MaskEdit...
Purtroppo gli eventi OnEnter e OnExit vengono eseguiti per segnalare l'acquisizione o la perdita del focus dopo che il controllo lo ha rispettivamente acquisito o perso, perciò qualsiasi tentativo di generare un'eccezione o impedire lo spostamento del focus fallisce poichè questo è già avvenuto, sebbene non sia ancora rappresentato visualmente.
L'unica soluzione è quella di crearsi un controllo personalizzato derivato da TEdit (o dal controllo che si intende utilizzare come base) e intercettare i messaggi WM_SETFOCUS e WM_KILLFOCUS.
In genere, tendo ad odiare un comportamento di questo tipo da parte dei controlli: potrei voler abbandonare in qualsiasi momento il controllo per fare qualcos'altro senza per questo implicitamente indicare che il dato inserito mi aggrada. Solo quando si preme un pulsante di conferma si passa alla validazione dei valori inseriti nei vari controlli visuali segnalando opportunamente gli errori.
Una seconda tecnica che ho visto utilizzare con profitto è questa: all'uscita dal controllo (evento OnExit) si esegue una "prevalidazione" del dato inserito (analogamente a quanto si fa nel confermare i dati del form): se il dato non è valido, si imposta la proprietà Color ad un valore opportuno, differenziando il colore del controllo da quello degli altri onde segnalare che quel dato, probabilmente, non verrà accettato.
Secondo me, questo è un buon compromesso tra l'usabilità del programma e la semplicità della sua implementazione.
Infine, puoi anche cercare qualche controllo aggiuntivo nell'apposita sezione del sito Torry Delphi's Pages.
Ciao!![]()

Rispondi quotando