Ja li sobre pesquisa e dbgrid mas não encontro o tópico

Delphi

30/06/2004

Olá amigos, estou querendo fazer uma consulta com dbgrid em que o foco é no dbgrid, e a medida que se digita vai se posicionando no registro desejado, li num tópico só que não encontro, em que ia digitando e o valor da digitação ia sendo armazenado em um edit oculto, e com seu conteúdo, ia sendo disparada a consulta sql.

Um outro problema que enfrento é o seguinte, inclui uma rotina no menu principal para tratamento da tecla enter em toda aplicação, só que quero num cadastro de bairros, por exemplo, assim que o usuário digitar no campo código e pressionar enter, quero consultar se o bairro já existe, só que com essa rotina, não tenho controle sobre o enter nos forms, pois ele já passa para o outro componente.

Obrigado pela atenção

Mario


Aldus

Aldus

Curtidas 0

Respostas

Aldus

Aldus

30/06/2004

Poderiam me ajudar?


GOSTEI 0
Paulo_amorim

Paulo_amorim

30/06/2004

Olá

e a medida que se digita vai se posicionando no registro desejado, li num tópico só que não encontro, em que ia digitando e o valor da digitação ia sendo armazenado em um edit oculto, e com seu conteúdo, ia sendo disparada a consulta sql.


Não precisa de um edit, mas sim uma variável String (global, claro)
Você pode fazer um Locate na Query para procurar o que o usuário digitou (coloque no OnClick), assim a cada letra ele deverá filtrar mais.


não tenho controle sobre o enter nos forms, pois ele já passa para o outro componente.

Como vc fez esse tratamento?

Espero que ajude
Até+


GOSTEI 0
Aldus

Aldus

30/06/2004

Olá Paulo, como eu poderia capturar por exemplo o usuário digita:

SAO PAULP (Até aqui vou alimentando minha variável)
variavel := Variavel + LetraDigitada

E quando pressionar BACKSPACE ?

Segue abaixo o código que utilizo no form principal:

***********************

procedure TfPrincipal.ProcessaMsg(var Msg: TMsg; var Handler: Boolean);
begin
if (Msg.message = WM_KEYDOWN) then
if not (Screen.ActiveControl is TCustomMemo) and
not (Screen.ActiveControl is TButtonControl) then begin
if not (Screen.ActiveControl is TCustomControl) then begin
if (Msg.wParam = VK_Down) and
not(Screen.ActiveControl is TListBox) and
not(Screen.ActiveControl is TComboBox) then
Msg.wParam:= VK_Tab;
if (Msg.wParam = VK_UP) and
not(Screen.ActiveControl is TListBox) and
not(Screen.ActiveControl is TComboBox) then begin
Msg.wParam:= VK_CLEAR;
Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
end;
if (Msg.wParam = VK_Escape) and
not (Screen.ActiveForm is TfPrincipal) then
Screen.ActiveForm.Close;
end;
if (Msg.wParam = VK_Return) then
Msg.wParam:= VK_Tab;
end;
end;

procedure TfPrincipal.FormCreate(Sender: TObject);
begin
Application.OnMessage := ProcessaMsg;
end;

***********************

Obrigado pela atenção


GOSTEI 0
Rômulo Barros

Rômulo Barros

30/06/2004

procedure Localizar(parClientDataSet: TClientDataSet;
  parCampo, parValor: String);
begin
  If(Trim(parValor) = ´´)Then
    Exit;
  parClientDataSet.Locate(parCampo,parValor,[loCaseInsensitive,loPartialKey]);
end;


Agora, basta chamar o método:

Localizar(ClientDatasetUsuarios,´CodigoUser´,edit1.Text);




:P :P


GOSTEI 0
Aldus

Aldus

30/06/2004

No dbgrid vou utilizar o seguinte código, e não o método locate, até porque não tenho indice para o campo desejado na procura que é o nome do bairro, então a medida que vou digitando vai filtrando todos que iniciam por aquela descrição, em testes feitos digitando num edit funciona perfeitamente, mas eu queria que o usuário digita-se com o foco no dbgrid para assim que localizar o bairro , até mesmo com as setas, já tecla enter e carrega o cadastro:

******************
DM.SQLDataSet_Bairros.Close ;
DM.SQLDataSet_Bairros.CommandText := ´SELECT * FROM bairros WHERE nombai LIKE :NomeBairro ORDER BY nombai´;
DM.SQLDataSet_Bairros.ParamByName(´NomeBairro´).AsString := CampoProcura.Text+´¬´ ;
DM.SQLDataSet_Bairros.ExecSQL;
******************


GOSTEI 0
Paulo_amorim

Paulo_amorim

30/06/2004

Olá

Declarando uma variavel Pesq: String

No OnClick tente

if Key in [0..9,a..z,A..Z] then
Pesq := Pesq + Key;

//E então vc realiza seu locate...

if Key in [VK_DEL, VK_BACKSPACE] then
Pesq := ´´;
//No caso eu tolimpando, vc faz o que quiser...


Espero que ajude
Até+


GOSTEI 0
Aldus

Aldus

30/06/2004

Não há evento onclick no dbgrid e no evento keypress dá erro de incompatible types: char e integer

**********
if Key in [0..9,a..z,A..Z] then
**********

Mario


GOSTEI 0
Aldus

Aldus

30/06/2004

Poderiam me auxiliar?


GOSTEI 0
Sandra

Sandra

30/06/2004

DM.SQLDataSet_Bairros.Close ; DM.SQLDataSet_Bairros.CommandText := ´SELECT * FROM bairros WHERE nombai LIKE :NomeBairro ORDER BY nombai´; DM.SQLDataSet_Bairros.ParamByName(´NomeBairro´).AsString := CampoProcura.Text+´¬´ ; [b:3afb8dbfa8]DM.SQLDataSet_Bairros.ExecSQL;[/b:3afb8dbfa8]

aldus,

Somente uma correção, da maneira como eu havia respondido em um outro [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=47350&highlight=]tópico[/url], faça a alteração da última linha para:
DM.SQLDataSet_Bairros.ExecSQL;

Lembre-se:
- utilize o Open nos casos de consulta (Select);
- o ExecSQL você utiliza quando for Insert, Delete ou Update.


Não há evento onclick no dbgrid e no evento keypress dá erro de incompatible types: char e integer ********** if Key in [0..9,a..z,A..Z] then ********** Mario

Tentou no onEnter do DBGrid?

Teste e verifique se funciona.


GOSTEI 0
Aldus

Aldus

30/06/2004

Olá Sandra, obrigado pela dica do ExecSQL, mas a procura não funciona no OnEnter pois ele não possui variavel key.

Mario
aldusinfo@terra.com.br


GOSTEI 0
POSTAR