O TEgStrParser é um componente não visual que envolve o
ParseInput. Arraste-o da categoria
Easygate na Paleta de Ferramentas para um formulário ou
módulo de dados, defina SqlDialect,
DefaultOptions, DefaultRangeSep e
DefaultOperator uma vez no Inspetor de Objetos e chame
Parse() a partir dos manipuladores de eventos. Normalmente,
basta um único componente para todo o formulário; utilize vários
componentes apenas quando diferentes secções do formulário necessitarem
de dialetos ou operadores predefinidos diferentes.
O componente nunca lê o valor de entrada diretamente de um controlo —
o chamador passa sempre o texto explicitamente. Isto é intencional: a
propriedade relevante varia consoante o tipo de controlo
(Text, ItemIndex, Value, etc.) e
apenas o chamador sabe qual se aplica.
O componente é declarado na unidade EgStrParserComp;
todos os tipos e constantes da biblioteca (TParseResult,
TInputType, TSqlDialect, ERR_*,
etc.) são declarados na unidade EgStrParser. Quando o
componente é arrastado para um formulário ou módulo de dados, o IDE
adiciona EgStrParserComp à cláusula uses
automaticamente, mas não adiciona
EgStrParser. Qualquer unidade que faça referência a
TParseResult, TInputType,
TSqlOperator, TParseOptions ou a qualquer
constante ERR_* deve incluir EgStrParser
explicitamente na sua própria cláusula uses.
As chamadas simultâneas a Parse() em diferentes
instâncias de TEgStrParser são seguras em termos de
threads. As chamadas simultâneas na mesma instância não o são. Consulte
Segurança de threads para obter
a análise completa e os padrões recomendados.
TEgStrParser = class(TComponent)
public
constructor Create(AOwner: TComponent); override;
// Sobrecarga 1: todos os parâmetros explícitos.
function Parse(const Input: *string*; ValueType: TInputType;
RangeSep: Char; Options: TParseOptions;
SqlOperator: TSqlOperator;
Sender: TComponent = nil): TParseResult; sobrecarga;
// Sobrecarga 2: utiliza DefaultRangeSep.
função Parse(const Input: *string*; ValueType: TInputType;
Options: TParseOptions; SqlOperator: TSqlOperator;
Sender: TComponent = nil): TParseResult; sobrecarga;
// Sobrecarga 3: utiliza DefaultRangeSep e DefaultOperator.
função Parse(const Input: *string*; ValueType: TInputType;
Options: TParseOptions;
Sender: TComponent = nil): TParseResult; sobrecarga;
// Sobrecarga 4: utiliza DefaultRangeSep e DefaultOptions.
função Parse(const Input: *string*; ValueType: TInputType;
SqlOperator: TSqlOperator;
Sender: TComponent = nil): TParseResult; sobrecarga;
// Sobrecarga 5: todos os valores por defeito provenientes das propriedades do componente.
função Parse(const Input: *string*; ValueType: TInputType;
Sender: TComponent = nil): TParseResult; sobrecarga;
propriedade LastResult : TParseResult leitura FLastResult;
propriedade LastControl: TComponent leitura FLastControl;
publicada
propriedade SqlDialect : TSqlDialect leitura FSqlDialect escrita FSqlDialect padrão sqlElevateDB;
propriedade DefaultOptions: TParseOptions leitura FDefaultOptions gravação FDefaultOptions padrão [];
propriedade DefaultRangeSep: Char leitura FDefaultRangeSep gravação FDefaultRangeSep padrão '~';
propriedade DefaultOperator: TSqlOperator leitura FDefaultOperator escrita FDefaultOperator valor por defeito sopEqual;
fim;propriedade SqlDialect: TSqlDialect valor por defeito sqlElevateDB;O dialeto SQL passado para ParseInput em cada chamada a
Parse(). Defina-o uma vez em tempo de design para
corresponder à base de dados de destino. O valor é armazenado por
componente e passado diretamente para a sobrecarga 1 de
ParseInput; a variável global GDefaultDialect
nunca é lida nem gravada.
Padrão: sqlElevateDB. Consulte dialetos SQL.
property DefaultOptions: TParseOptions default [];O conjunto de sinalizadores TParseOption utilizados
pelas sobrecargas que não aceitam um parâmetro Options
explícito. As sobrecargas que aceitam Options utilizam, em
vez disso, o valor fornecido.
Predefinição: []. Consulte Opções de análise.
property DefaultRangeSep: Char default '~';O separador de intervalo utilizado pelas sobrecargas que não aceitam
um parâmetro RangeSep explícito. Não pode ser
,, ;, -, .,
' (aspas simples) ou espaço; qualquer um destes caracteres
faz com que ParseInput devolva
ERR_INVALID_RANGESEP.
Valor predefinido: '~'.
property DefaultOperator: TSqlOperator default sopEqual;O operador SQL utilizado pelas sobrecargas que não aceitam um
parâmetro SqlOperator explícito.
Predefinição: sopEqual. Consulte Operadores.
property LastResult: TParseResult;O TParseResult devolvido pela chamada mais recente a
Parse() nesta instância. Não tem significado antes da
primeira chamada.
propriedade LastControl: TComponent;O argumento Sender passado à chamada mais recente a
Parse(), ou nil quando Sender foi
omitido. Útil em manipuladores de eventos partilhados para identificar
qual o controlo que desencadeou a análise. O componente armazena a
referência, mas não é o seu proprietário.
Todas as sobrecargas devolvem um TParseResult e
armazenam-no em LastResult. SqlDialect é
sempre obtido a partir da propriedade do componente e não pode ser
substituído por chamada. Sender é opcional em todas as
sobrecargas e o valor predefinido é nil.
| Sobrecarga | RangeSep | Opções | SqlOperator |
|---|---|---|---|
| 1 — forma completa | explícito | explícito | explícito |
| 2 | DefaultRangeSep |
explícito | explícito |
| 3 | DefaultRangeSep |
explícito | DefaultOperator |
| 4 | DefaultRangeSep |
DefaultOptions |
explícito |
| 5 — mínimo | DefaultRangeSep |
DefaultOptions |
DefaultOperator |
// Mínimo: todos os valores por defeito das propriedades do componente.
R := EgParser1.Parse(Edit1.Text, itInteger);
// Com Sender: identifica o controlo num manipulador partilhado.
R := EgParser1.Parse(Edit1.Text, itDate, Sender as TComponent);
// Substituir apenas o operador.
R := EgParser1.Parse(Edit1.Text, itString, sopLikeRight);
// Substituir apenas as opções.
R := EgParser1.Parse(Edit1.Text, itString, [opTrim, opUpperCase]);
// Substituir opções e operador.
R := EgParser1.Parse(Edit1.Text, itDate, [opNotNull], sopGreaterEqual);
// Forma explícita completa (também substitui RangeSep).
R := EgParser1.Parse(Edit1.Text, itInteger, '|', [opRequired], sopEqual);Um único componente num módulo de dados pode servir vários campos,
verificando o Sender:
procedure TdmOrders.FilterFieldExit(Sender: TObject);
var
Edit: TEdit;
R: TParseResult;
begin
Edit := Sender as TEdit;
if Edit = edOrderDate then
R := Parser1.Parse(Edit.Text, itDate, Sender as TComponent)
else if Edit = edAmount then
R := Parser1.Parse(Edit.Text, itDecimal, Sender as TComponent)
else
Exit;
if R.ResultType = otInvalid then
Edit.Color := clYellow
else
Edit.Color := clWindow;
end;