Artigo Clube Delphi 62 - Oráculo da Clube
Artigo da Revista Clube Delphi Edição 62 - Oráculo da Clube
Atenção: por essa edição ser muito antiga não há arquivo pdf para download desta revista. os artigos disponíveis somente em doc.
Oráculo da Clube
Nova coluna sobre dicas, soluções, segredos e técnicas avançadas de programação Delphi
Costumo dizer que jamais se pergunta para um desenvolvedor Delphi se "dá pra fazer determinada coisa”. A pergunta deveria ser "pra quando ele consegue fazer': E não se surpreenda se ao virar as costas você ouvir "tá pronto chefe". Constantemente somos obrigados a encarar os mais difíceis desafios, mas não há limites para um Delphiano, já que temos a melhor ferramenta RAD a nossa disposição!
Na edição 60 trouxemos várias soluções para serem adaptadas as suas aplicações Delphi. Nesta edição, dando continuidade à idéia, iniciamos uma nova coluna mensal, destinada a trazer muitas dicas e segredos (alguns bastante inusitados) sobre o desenvolvimento com o Delphi. O objetivo é apresentar problemas da "vida real”, que enfrentamos no dia a dia como desenvolvedor.
Para cada questão apresentamos a solução encontrada, mostrando o porquê de ter usado determinada tecnologia para resolver o problema naquela situação, com o mínimo de codificação possível. Vou procurar trazer dicas que não são encontradas com freqüência, nem em livros, nem na Web (afinal, ordenar o DBGrid ao clicar no título da coluna já está um tanto "batido"!). Vamos lá!
DBGrid: procura incremental estilo Tool Palette do Delphi 2005
A Tool Palette do Delphi2005 tem um recurso especial: conforme o desenvolvedor vai digitando o nome de um componente, ela vai filtrando os itens e negritando as letras correspondentes ao que foi digitado. Essa procura incremental é bastante interessante, de forma que resolvi adaptar a idéia para que funcionasse em um DBGrid da VCL.
A Figura 1 mostra o exemplo em execução. Quando o usuário digita um texto no Edit ("R”, por exemplo), filtramos o DataSet correspondente e destacamos as letras digitadas em cada campo do DBGrid. Repare que a busca é feita em qualquer coluna do DBGrid, ou seja, são filtrados todos os registros que começam com "R" em qualquer campo (comprove pela figura). O código também funciona para campos numéricos e datas.
Figura1.Procura no DBGrid negrita ocorrências dos caracteres digitados, semelhante à Tool Palette do Delphi 2005
Tomei o cuidado de construir o exemplo usando apenas recursos da classe TDataSet, de forma que funcionasse para qualquer descendente que você esteja utilizando em suas aplicações: TClientDataSet, TQuery, TTable, TIBQuery etc. Neste exemplo, utilizei um ClientDataSet ligado pelo FileName ao arquivo employee.xml dos demos do Delphi. Vamos ver como o exemplo funciona. Destacar itens e colorir o DBGrid é algo relativamente simples de ser feito. Podemos usar o seu evento OnDrawColumnCell para pintar manualmente cada célula (veja um artigo completo sobre vários recurso de pintura no DBGrid na edição 44). O grande problema aqui é outro: negritar parte da palavra e continuar a escrever com fonte normal exatamente onde a parte destacada terminada. Calcular coordenadas pelo número de letras não funcionaria, a menos que usássemos uma fonte mono espaçada.
A técnica que usei consiste em usar uma importante função da APIWindows, DrawText. O Delphi usa internamente essa função de baixo nível para pintar vários controles de tela. Por exemplo, quando configuramos o Caption de uma Label, a VCL usa DrawText para "pintar" o texto em um DeviceContext (HDC), nesse caso o Canvas do formulário.
DrawText tem um truque. Podemos usar a função para "simular" a pintura de um texto em uma área delimitada (nesse caso um TRect), apenas para fins de cálculo(basta passar a constante DT_CALCRECT no último parâmetro).Ou seja, chamamos a função como se fossemos pintar algo,mas na verdade o Windows não pinta. Qual a moral?
O TRect, passado no quarto parâmetro, é redimensionado automaticamente para comportar o texto "pintado': Isso é suficiente para saber qual é o espaço necessário para exibir as primeiras letras em negrito e continuar usando texto normal exatamente na coordenada seguinte. De posse dessa informação, usamos normalmente o método TextOut de Canvas. Veja na Listagem 1 o código que deve ser colocado no evento OnDrawColumnCell do seu DBGrid (método DBGrid1DrawColumnCell).
Listagem 1.Código para negritar busca no DBGrid
procedure TForm1.DBGrid1DrawColumnCell(
Sender: TObjeet; eonst Reet: TReet;
DataCol: lnteger; Column: TColumn;
State: TGridDrawState):
var
r1, r2: TReet;
s1, s2: string;
begin
if (Edit1.Text = ‘’) or
(Pos(UpperCase(Edit1.Text).
UpperCase(Column.Field.AsString)) <> 1) then
exit;
r1 := Rect; r2 := Rect;
s1 := copy(Column.Field.AsString,1,
length(Edit1.Text));
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.Canvas.Font.Style := [fsbold];
DrawText(DBGrid1.Canvas.Handle,PChar(s1),
Length(s1), r1,DT_CALCRECT);
" [...] continue lendo...
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo