Fórum Auto-completar e pesquisa #416407

08/05/2012

0

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
Salomao.coelho

Salomao.coelho

Responder

Posts

08/05/2012

Bruno Leandro

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
Responder

Gostei + 0

08/05/2012

Gilmar Moraes

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
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..
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar