Una soluzione molto pratica potrebbe essere quella di mantenere memorizzato il valore TTime in una variabile separata dalla casella di testo TMaskEdit usata per l'input.
Ad esempio, si potrebbe aggiungere un campo FMyTime alla dichiarazione del form affinchè contenga il valore dell'ora introdotta dall'utente:
codice:
TTimeForm = class(TForm)
private
FMyTime: TTime;
public
end;
Magari, si può inizializzare la variabile al momento della creazione del form usando l'ora corrente (oppure un valore caricato da un'altra sorgente):
codice:
procedure TTimeForm.FormCreate(Sender: TObject);
begin
FMyTime := Now;
TimeMaskEdit.Text := FormatDateTime('hh:nn', FMyTime);
end;
TimeMaskEdit è il controllo MaskEdit usato per l'input.
Sull'evento OnExit, puoi tentare di convertire il valore inserito dall'utente usando la funzione StrToTimeDef, la quale converte il valore dell'ora assegnando un valore di default in caso di errore; ovviamente, il valore di default sarà il valore precedente memorizzato nel campo FMyDate:
codice:
procedure TTimeForm.TimeMaskEditExit(Sender: TObject);
begin
FMyTime := StrToTimeDef(TimeMaskEdit.Text, FMyTime);
TimeMaskEdit.Text := FormatDateTime('hh:nn', FMyTime);
end;
L'effetto del codice è quello di memorizzare l'ora se la conversione va a buon fine e di ripristinare nella casella di testo il valore dell'ora convertito; in caso di input non valido, il valore restituito da StrToTimeDef è quello precedente, pertanto sulla casella apparirà nuovamente tale valore.
Il campo FMyTime è quello che dovrai considerare quando vorrai sapere l'ora introdotta dall'utente (senza leggere direttamente il contenuto della casella di testo "mascherata").
Se vuoi "tagliare la testa al toro", considera l'uso del TDateTimePicker così come ti è già stato suggerito.
Ciao!