BufDataSet
Criar campos, ordenação e indice:
-
Ordenar por mais campos
Inserir Registros:
Alterar Registros:
Deletar Registros:
Salvar em Disco:
Carregar do Disco:
Buscar parcial:
Busca parcial com caracteres especiais:
-
O filtro simples com
Dataset.Filter := '...'não funciona quando o texto tem acentos, cedilhas ou outros caracteres especiais, pois a comparação é literal. A solução é usar o evento OnFilterRecord do dataset, que é chamado para cada registro enquanto o filtro está ativo, permitindo aplicar sua própria lógica de comparação.São necessários quatro elementos, na ordem abaixo:
-
Passo 1 — Função para remover acentos:
Percorre a string caractere por caractere e substitui letras acentuadas pelas equivalentes sem acento. Funciona com strings WIN1252 (AnsiString), padrão nos projetos Lazarus/Firebird com charset WIN1252.
-
Passo 2 — Função para comparar texto (ignora acento e maiúscula):
Remove os acentos de ambos os textos, converte para maiúsculo e verifica se o texto buscado está contido no texto do campo. É o equivalente a um
LIKE '%BUSCA%'do Firebird, mas funcionando em memória no TBufDataset. -
Passo 3 — Criar o procedure "Evento de Filtro" (OnFilterRecord):
Este procedure não é o evento do campo de busca. Ele é chamado automaticamente pelo dataset para cada registro enquanto
Filtered = True. O parâmetrovar Accept: Booleandefine se o registro atual será exibido (True) ou ocultado (False).Pense nele como um filtro de linha do Firebird —
WHERE campo LIKE '%busca%'— só que executado em Pascal, registro por registro, dentro do TBufDataset já carregado em memória.Atenção: a assinatura obrigatória é
(DataSet: TDataSet; var Accept: Boolean). Use o parâmetroDataSetpara ler os campos do registro atual. -
Passo 4 — Atribuir o evento ao dataset (geralmente no FormCreate):
Liga o procedure criado acima ao evento
OnFilterRecorddo dataset. A partir daí, toda vez queFilteredfor alternado, o Lazarus chamaráBufFilterRecordpara cada registro. -
Passo 5 — Evento do campo de busca (EditBuscaChange):
Este sim é o evento
OnChangedoTEditde busca. Ele não filtra nada diretamente — apenas "desliga e liga" o filtro para forçar o dataset a percorrer todos os registros novamente, chamandoBufFilterRecordpara cada um.O
DisableControlseEnableControlsevitam que os componentes visuais (DBGrid, etc.) piscarem a cada registro avaliado — equivalente a usarBeginUpdate/EndUpdateem listas visuais no Delphi/Lazarus.