Componente TEgStrParser

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.

Declaração da classe

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;

Propriedades publicadas

SqlDialect

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.

DefaultOptions

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.

DefaultRangeSep

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: '~'.

DefaultOperator

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.

Propriedades de leitura apenas

LastResult

property LastResult: TParseResult;

O TParseResult devolvido pela chamada mais recente a Parse() nesta instância. Não tem significado antes da primeira chamada.

LastControl

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.

Método Parse()

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);

Gestor de eventos partilhado

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;
(C) 2026 Easygate, Lda