Quando a função ParseInput não consegue produzir um
resultado válido, define ResultType como
otInvalid e devolve um valor diferente de zero em
ErrorCode. Todas as condições de erro são comunicadas desta
forma; a função ParseInput nunca lança uma exceção em
compilações de versão final.
| Constante | Valor | Condição |
|---|---|---|
ERR_NONE |
0 |
Sucesso. Sem erros. |
ERR_INVALID_FORMAT |
1 |
Não foi possível converter um token para o TInputType
declarado. |
ERR_INVALID_RANGE |
2 |
O limite esquerdo do intervalo é maior do que o limite direito. |
ERR_LIST_SEPARATOR_CONFLICT |
3 |
Foram encontrados tanto um separador de lista (, ou
;) como o separador de intervalo na mesma entrada. |
ERR_NULL_NOT_ALLOWED |
4 |
opNotNull foi definido e pelo menos um token foi
resolvido como NULL. |
ERR_EMPTY_NOT_ALLOWED |
5 |
opRequired foi definido e toda a entrada estava
vazia. |
ERR_INVALID_RANGESEP |
6 |
O caractere RangeSep é um dos caracteres reservados:
,, ;, -, .,
' (aspas simples) ou espaço. |
A entrada contém um token que não pode ser analisado como o tipo declarado.
Causas comuns:
itInteger: caracteres não numéricos, ponto decimal,
expoente (3.14, 3e4).itDecimal / itFloat: o token contém tanto
. como , (1,234.5).itBoolean: a palavra não é um dos aliases aceites.itDate: string não pode ser analisado como uma
data por nenhum dos formatos reconhecidos.itTime: o formato não é hh:mm,
hh:mm:ss ou hh:mm:ss.f[ff[fff]]; ponto final;
mais de 6 dígitos decimais; AM/PM combinados com segundos decimais.itDateTime: a parte da data ou a parte da hora não pode
ser analisada.itFloat: o valor absoluto excede o máximo de
Double (~1.8E308).R := ParseInput('3.14', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_INVALID_FORMATAplica-se a itInteger, itDecimal,
itFloat, itDate, itTime e
itDateTime quando a entrada é um intervalo e o limite
esquerdo é estritamente maior do que o limite direito.
Os intervalos de itString e itBoolean nunca
são verificados quanto à ordem.
R := ParseInput('100~1', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_INVALID_RANGE
R := ParseInput('2026-12-31~2026-01-01', itDate);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_INVALID_RANGESão permitidos limites iguais: 10~10 produz
BETWEEN 10 AND 10.
A entrada contém tanto um separador de lista (, ou
;) como o separador de intervalo fora de regiões entre
aspas. O parser não consegue determinar se a entrada é uma
lista ou um intervalo.
R := ParseInput('1,2~3', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_LIST_SEPARATOR_CONFLICTEste erro pode ser evitado utilizando um separador de intervalo que não apareça na entrada, ou colocando entre aspas os valores que contenham os caracteres em conflito.
O opNotNull foi definido e pelo menos um token na saída
foi resolvido como NULL. Isto acontece quando uma posição
da lista está vazia (1,,3), um limite do intervalo está
vazio (~100) ou toda a entrada está vazia para um tipo que
não seja string.
Para itString, os tokens vazios produzem ''
(não NULL), a menos que opEmptyStringNull
também esteja definido.
R := ParseInput('1,,3', itInteger, [opNotNull]);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_NULL_NOT_ALLOWEDERR_NULL_NOT_ALLOWED não é definido quando
ERR_EMPTY_NOT_ALLOWED já tiver sido devolvido para a mesma
chamada.
opRequired foi definido e toda a entrada (após
opTrim, quando presente) está vazia ou contém apenas
espaços em branco.
R := ParseInput('', itDate, [opRequired]);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_EMPTY_NOT_ALLOWED
R := ParseInput(' ', itDate, [opRequired, opTrim]);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_EMPTY_NOT_ALLOWEDO caractere RangeSep passado à sobrecarga 1 de
ParseInput é um dos caracteres reservados: ,,
;, -, ., ' (aspas
simples) ou espaço. Estes caracteres estão reservados porque são
utilizados por outras partes do parser:
, e ; são separadores de listas.- aparece na data ISO strings
(2026-03-25).. aparece em números decimais e segundos
fracionários.' é utilizado para delimitar valores entre aspas
strings; consumi-lo como separador de intervalos descartaria
silenciosamente os intervalos dentro dos valores entre aspas.itDateTime.Quando este erro ocorre, SQLExpression está vazio e
Values e SQLValues são nil.
R := ParseInput('a,b', itString, ',', [], sopEqual, sqlElevateDB);
// R.ResultType = otInvalid
// R.ErrorCode = ERR_INVALID_RANGESEPO padrão recomendado é verificar primeiro ResultType e,
em seguida, ramificar com base em ErrorCode para apresentar
mensagens ao utilizador:
R := ParseInput(Edit1.Text, itDate, [opRequired]);
case R.ResultType of
otEmpty:
; // sem entrada; não é necessária nenhuma cláusula WHERE
otInvalid:
case R.ErrorCode of
ERR_EMPTY_NOT_ALLOWED:
ShowMessage('Por favor, introduza uma data.');
ERR_INVALID_FORMAT:
ShowMessage('O formato da data não foi reconhecido.');
ERR_INVALID_RANGE:
ShowMessage('A data de início não pode ser posterior à data de fim.');
else
ShowMessage('Entrada inválida (erro ' + IntToStr(R.ErrorCode) + ').');
end;
else
Query1.SQL.Text := 'SELECT * FROM Orders WHERE OrderDate ' + R.SQLExpression;
Query1.Open;
end;O ParseInput nunca lança uma exceção por entrada
inválida nas compilações de versão final. A exceção
EDemoRestriction é lançada apenas pelas compilações de
demonstração quando a entrada excede o limite de comprimento da
demonstração ou quando o IDE do Delphi não está a ser executado.