Depois de algum tempo estou de volta com mais um artigo pois, recentemente, necessitei colocar um comando para auto-completar um edit. Procurei na internet e nada! Fui ao velho e bom DTDelphi e nada! Então, a única solução foi sentar na cadeira e desenvolver a seguinte rotina.
Vamos lá! É necessário que seja criada uma tabela cliente
em sua base de dados, para nosso exemplo. Utilizei MSAccess com Conexão
ADO, mas pode ser implementado em qualquer dadabase.
Na tabela cliente, crie o campo nom_cliente do tipo string com tamanho de
100 e cadastre alguns nomes para poder testar posteriormente.
Vá para o Delphi e dentro de um form coloque um edit que chamaremos
de edt_cliente. Faça a sua conexão com o Banco de Dados.
No code editor do Delphi, crie a seguinte função:
function retorna_string(Lstr_sql: string): string;
begin
with adoquery1 do
begin
close;
sql.text := Lstr_sql;
open;
result := fields[0].AsString;
end;
end;
No evento onKeyPress do edt_nome coloque o seguinte código:
procedure Tfrm_emprestimo.edt_nomeKeyPress(Sender: TObject; var Key: Char);
var
Lstr_nome, Lstr_auxiliar: string;
begin
if (key = #25) or // seta para a esquerda
(key = #27) or // seta para a direita
(key = #8) then // backspace
exit;
//limpa o edit para pegar a última digitação
edt_nome.Clear;
//Variável privada que armazena a string q foi digitada
Fstr_nome := Fstr_nome + string(key);
// Consulta utilizada para auto-completar o edit
Lstr_nome := retorna_string(' select nom_cliente from cliente' +
' where nom_cliente like ''' + Fstr_nome + '%''');
//Variável q armazena apenas o texto digitado pelo usuário
Lstr_auxiliar := copy(Lstr_nome,length(Fstr_nome) + 1,length(Lstr_nome));
//Variável que armazena o texto completo
Fstr_auxiliar := Fstr_nome + Lstr_auxiliar;
end;
E para concluir adicione o seguinte código no evento onKeyUp do mesmo
edt_nome:
procedure Tfrm_emprestimo.edt_nomeKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
Lstr_auxiliar: string;
begin
// testa se a tecla pessionad foi a seta para a esquerda
if (key = vk_left) then
begin
//Armazena a posição iniciar do cursor
Fint_posicao := length(Fstr_nome) - 1;
//Seta o cursor para a posição correta
edt_nome.SelStart := Fint_posicao;
//Armazena o texto digitado pelo usuário
Fstr_nome := copy(edt_nome.text, 1, Fint_posicao);
//coloca o cursor na posição correta após a digitação da tecla
edt_nome.SelStart := length(Fstr_nome);
//marca o texto que foi auto-completado
edt_nome.SelLength := length(edt_nome.text) - length(Fstr_nome);
exit;
end
else if (key = vk_right) then
begin
Fint_posicao := length(Fstr_nome) + 1;
edt_nome.SelStart := Fint_posicao;
Fstr_nome := copy(edt_nome.text,1,Fint_posicao);
edt_nome.SelStart := length(Fstr_nome);
edt_nome.SelLength := length(edt_nome.text) - length(Fstr_nome);
exit;
end
else if (key = vk_back) then
begin
Fint_posicao := length(Fstr_nome) - 1;
edt_nome.SelStart := Fint_posicao;
Fstr_nome := copy(edt_nome.text,1,Fint_posicao);
edt_nome.text := Fstr_nome;
edt_nome.SelStart := length(Fstr_nome);
exit;
end;
//limpar o edit para poder exibir apenas o texto desejado
edt_nome.Clear;
//Preenche o edit com o texto auto completo
edt_nome.text := Fstr_auxiliar;
//Armazena o tamanho do texto digitado
edt_nome.SelStart := length(Fstr_nome);
//marca o texto que foi auto-completado
edt_nome.SelLength := length(edt_nome.text) - length(Fstr_nome);
end;
Pronto! Compile o nosso projeto e teste com os nome cadastrados no banco de
dados.
Até a próxima e lembre-se: "O possível do impossível
só é possível
se você tentar".
Por: Ruy Salles
Contato: ruysalles@ig.com.br
|