Auto-completar e pesquisa
Galera,
Estou com um probleminha aqui, tenho um formulario com uma pesquisa ele tem um edit e um dbgrid, quando digito no edit aparece no dbgrid o resultado de uma consulta.
Mas quando dou um dubloclick na 1ª e 2ª linha a consulta não funciona na 3ª em diante ela já faz a consulta. Segue os códigos abaixo
Código do Auto-Completar
procedure TfrmCad_Telefones.txtprocuraKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
Var
Aux : Integer;
Posicao : Integer;
begin
Try
bancodados.cdsSQLautocompleta.Active:=False;
bancodados.SQLautocompleta.SQL.Clear;
If txtprocura.Text <> then
begin
bancodados.SQLautocompleta.SQL.Add(SELECT nome from agenda where nome like + #39 + txtprocura.text+ #37 + #39 + and user_id like :cod_Id order by nome ASC);
bancodados.SQLautocompleta.Params.ParamByName(cod_Id).AsString:=frmPrincipal.txtLetra.Text;
bancodados.cdsSQLautocompleta.Active := True;
If bancodados.SQLautocompleta.FieldByName(Nome).AsString <> then
begin
Posicao := length(txtprocura.Text);
For Aux := length(txtprocura.Text)+1 to Length(bancodados.SQLautocompleta.FieldByName(Nome).AsString) do
begin
txtprocura.Text := txtprocura.Text + bancodados.SQLautocompleta.FieldByName(Nome).AsString[Aux];
end;
txtprocura.SelStart := Posicao;
txtprocura.SelLength := length(txtprocura.Text);
end;
end;
Except
end;
end;
Códido do doublo Click
procedure TfrmCad_Telefones.dbgProcuraDblClick(Sender: TObject);
begin
txtprocura.Text:=dbgProcura.Fields[0].value;
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[]);
txtcod.Text:=inttostr(bancodados.cdsSQLagendaid.Value);
txtnome.Text:=bancodados.cdsSQLagendanome.AsString;
txtemail.Text:=bancodados.cdsSQLagendaemail.AsString;
txtendereco.Text:=bancodados.cdsSQLagendaendereco.AsString;
txtnumero.Text:=bancodados.cdsSQLagendaNumero.AsString;
txtbairro.Text:=bancodados.cdsSQLagendaBairro.AsString;
txttelefone.Text:=bancodados.cdsSQLagendatelefone.AsString;
txtfax.Text:=bancodados.cdsSQLagendafax.AsString;
txtcelular.Text:=bancodados.cdsSQLagendacelular.AsString;
txtcidade.Text:=bancodados.cdsSQLagendacidade.AsString;
txtcep.Text:=bancodados.cdsSQLagendacep.AsString;
txturl.Text:=bancodados.cdsSQLagendaurl.AsString;
txtprofisao.Text:=bancodados.cdsSQLagendaprofissao.AsString;
txtdatanasc.Text:=bancodados.cdsSQLagendadata_nasc.AsString;
txtmes.Text:=bancodados.cdsSQLagendames.AsString;
txtcategoria.Text:=bancodados.cdsSQLagendacategoria.AsString;
tabCadastro.Show;
end;
Espero ter sido claro nas explicações
Estou com um probleminha aqui, tenho um formulario com uma pesquisa ele tem um edit e um dbgrid, quando digito no edit aparece no dbgrid o resultado de uma consulta.
Mas quando dou um dubloclick na 1ª e 2ª linha a consulta não funciona na 3ª em diante ela já faz a consulta. Segue os códigos abaixo
Código do Auto-Completar
procedure TfrmCad_Telefones.txtprocuraKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
Var
Aux : Integer;
Posicao : Integer;
begin
Try
bancodados.cdsSQLautocompleta.Active:=False;
bancodados.SQLautocompleta.SQL.Clear;
If txtprocura.Text <> then
begin
bancodados.SQLautocompleta.SQL.Add(SELECT nome from agenda where nome like + #39 + txtprocura.text+ #37 + #39 + and user_id like :cod_Id order by nome ASC);
bancodados.SQLautocompleta.Params.ParamByName(cod_Id).AsString:=frmPrincipal.txtLetra.Text;
bancodados.cdsSQLautocompleta.Active := True;
If bancodados.SQLautocompleta.FieldByName(Nome).AsString <> then
begin
Posicao := length(txtprocura.Text);
For Aux := length(txtprocura.Text)+1 to Length(bancodados.SQLautocompleta.FieldByName(Nome).AsString) do
begin
txtprocura.Text := txtprocura.Text + bancodados.SQLautocompleta.FieldByName(Nome).AsString[Aux];
end;
txtprocura.SelStart := Posicao;
txtprocura.SelLength := length(txtprocura.Text);
end;
end;
Except
end;
end;
Códido do doublo Click
procedure TfrmCad_Telefones.dbgProcuraDblClick(Sender: TObject);
begin
txtprocura.Text:=dbgProcura.Fields[0].value;
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[]);
txtcod.Text:=inttostr(bancodados.cdsSQLagendaid.Value);
txtnome.Text:=bancodados.cdsSQLagendanome.AsString;
txtemail.Text:=bancodados.cdsSQLagendaemail.AsString;
txtendereco.Text:=bancodados.cdsSQLagendaendereco.AsString;
txtnumero.Text:=bancodados.cdsSQLagendaNumero.AsString;
txtbairro.Text:=bancodados.cdsSQLagendaBairro.AsString;
txttelefone.Text:=bancodados.cdsSQLagendatelefone.AsString;
txtfax.Text:=bancodados.cdsSQLagendafax.AsString;
txtcelular.Text:=bancodados.cdsSQLagendacelular.AsString;
txtcidade.Text:=bancodados.cdsSQLagendacidade.AsString;
txtcep.Text:=bancodados.cdsSQLagendacep.AsString;
txturl.Text:=bancodados.cdsSQLagendaurl.AsString;
txtprofisao.Text:=bancodados.cdsSQLagendaprofissao.AsString;
txtdatanasc.Text:=bancodados.cdsSQLagendadata_nasc.AsString;
txtmes.Text:=bancodados.cdsSQLagendames.AsString;
txtcategoria.Text:=bancodados.cdsSQLagendacategoria.AsString;
tabCadastro.Show;
end;
Espero ter sido claro nas explicações
Salomao.coelho
Curtidas 0
Respostas
Bruno Leandro
08/05/2012
parece que o motivo eh no locate do duplo clique, um motivo pode ser que o registro procurado nao esteja no clientdataset, ou motivo pode ser case sensitive
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[]);
tente utilizar
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[loCaseInsensitive]);
e tambem verifique se no momento da carga o clientdataset esta incluindo os registros procurados
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[]);
tente utilizar
bancodados.cdsSQLagenda.Locate(nome,txtprocura.Text,[loCaseInsensitive]);
e tambem verifique se no momento da carga o clientdataset esta incluindo os registros procurados
GOSTEI 0
Gilmar Moraes
08/05/2012
Olha.. eu uso deste jeto usando um combobox se for para mostar um registro e não for muita coisa acho que vale a pena eu uso em minha aplicação de ordem de serviço..no combobox em style coloque como csSimple para ter aparencia de um edit..
no evento onkeydown do combobox coloque
esta variável preenche o formulário não é nescessário se for somente consulta.
neste ponto é chamado a função acima no evento on key press do combobox..
e o pulo do gato no evento onkeyup vc coloca
é claro que vc terá que estudar um pouco o que fiz más é bem simples o legal desta função é que quando vc digita além de aparecer a lista abaixo no combobox aprece o registro completo parecido com o internet explore muito bacana..estuda ele aí acho que vc vai gostar..
no evento onkeydown do combobox coloque
case key of VK_Down:wwDBGrid1.SetFocus;
esta variável preenche o formulário não é nescessário se for somente consulta.
procedure T_FORM_OS_CAD.Pular(Sender: TObject); begin BD_OFC_ELE.Edit; BD_OFC_ELEGS_OOE_NOME.Value := ComboBox1.text; BD_OFC_ELEGS_OOE_CREDSN.Value := BD_CLIENTESGS_CLI_CONCREDITO.Value; BD_OFC_ELEGS_OOE_END.Value := BD_CLIENTESGS_CLI_END.Value; BD_OFC_ELEGS_OOE_COMP.Value := BD_CLIENTESGS_CLI_COMP.Value; BD_OFC_ELEGS_OOE_BAIRRO.Value := BD_CLIENTESGS_CLI_BAIRRO.value; BD_OFC_ELEGS_OOE_CIDADE.Value := BD_CLIENTESGS_CLI_CIDADE.Value; BD_OFC_ELEGS_OOE_UF.Value := BD_CLIENTESGS_CLI_UF.value; BD_OFC_ELEGS_OOE_TEL_01.Value := BD_CLIENTESGS_CLI_TEL_01.value; BD_OFC_ELEGS_OOE_TEL_02.Value := BD_CLIENTESGS_CLI_TEL_02.value; BD_OFC_ELEGS_OOE_TEL_03.Value := BD_CLIENTESGS_CLI_TEL_03.value; BD_OFC_ELEGS_OOE_TEL_04.Value := BD_CLIENTESGS_CLI_TEL_04.value; BD_OFC_ELEGS_OOE_CEP.Value := BD_CLIENTESGS_CLI_CEP.Value; BD_OFC_ELEGS_OOE_CODACES.Value := BD_CLIENTESGS_CLI_CODIGO.Value; wwDBGrid1.Visible := False; DBEdit11.SetFocus; end;
neste ponto é chamado a função acima no evento on key press do combobox..
if key=#13 then begin
Key := #0;
Perform(WM_nextdlgctl,0,0);
if BD_CLIENTESGS_CLI_NOME.value <> then Pular(Sender);
end
e o pulo do gato no evento onkeyup vc coloca
var
l:Integer;
begin
if (key=VK_BACK) or (key=VK_DELETE) or (key=VK_LEFT) or (key=VK_RIGHT)
or (KEY=vk_home) or (key=VK_END) or (key=VK_SHIFT) or (key=VK_TAB) then exit;
l:=Length(Combobox1.text);
with BD_CLIENTES do
begin
Close;
SQL.Clear;
SQL.Add(SELECT * FROM CLIENTES);
SQL.Add(WHERE UPPER(GS_CLI_NOME) LIKE:GS_CLI_NOME);
BD_CLIENTES.Params[0].AsString := UpperCase(ComboBox1.Text) + %;
BD_CLIENTES.Open;
end;
if Copy(BD_CLIENTES.Fieldbyname(GS_CLI_NOME).asString,1,L)=
Copy(ComboBox1.Text,1,L) then begin
Combobox1.Text:= BD_CLIENTES.Fieldbyname(GS_CLI_NOME).asString;
Combobox1.SelStart:=l;
ComboBox1.SelLength:=Length(ComboBox1.Text)-l;
end;
é claro que vc terá que estudar um pouco o que fiz más é bem simples o legal desta função é que quando vc digita além de aparecer a lista abaixo no combobox aprece o registro completo parecido com o internet explore muito bacana..estuda ele aí acho que vc vai gostar..
GOSTEI 0