La Web del Programador: Comunidad de Programadores
 
    Pregunta:  7259 - QUIERO UTILIZAR EL FIND
Autor:  Hermann s
tengo en una ventana un single line edit, y luego tengo una datawindow en forma grid con datos de clientes,nombre y rut lo que quiero hacer es que cuando yo digite una letra en el single line edit me busque en la datawindow el primer nombre que comience con esa letra y lo destaque en la datawindow.

  Respuesta:  Victor //:-) Arreola
Teniendo la sle y la dw en una window, yo haria esto:

En el evento KEY de la Window pon esto:
--
long ll_reg=0
string ls_busco=''
ls_busco=trim(sle_1.text)

if not(isnull(ls_busco)) and len(ls_busco)>0 then
ll_reg = dw_1.Find(" nombre like '%"+ls_busco+"'", 1, dw_1.RowCount())
if ll_reg>0 then
dw_1.SetRow(ll_reg)
dw_1.SelectRow(0, FALSE)
dw_1.SelectRow(ll_reg, TRUE)
dw_1.ScrollToRow(ll_row)
end if
end if
--
PD: Esto localiza el PREFIJO mas parecido, pero tambien puedes
buscar el CONTENIDO mas parecido cambiando esto :
" nombre like '%"+ls_busco+"%'"
--
Espero te sirva. Atte Victor //:-)

  Respuesta:  Jorge Reynoso
Debes crear dentro del Control datawindos un evento de usuario
Por ejemplo: ue_keyup con el Event ID -> pbm_keyup
y alli poner el siguiente codigo

Long ll_row
integer li_key, li_temp, li_pos
String ls_column, ls_temp

li_key = Message.WordParm

ls_temp = THIS.Describe(\"DataWindow.Table.Sort\")
li_pos = Pos(ls_temp,\",\")
li_temp = Pos(ls_temp,\"A\")

If (li_temp=0) or (li_temp > li_pos) then
//li_temp = Pos(ls_temp,\"D\")
End if

ls_column=left(ls_temp,li_temp -1)

if ((li_key > 64) and (li_key < 91)) or ((li_key > 47) and (li_key < 58)) then
if li_key = ii_last_key then
ll_row= THIS.GetRow()+1
else
ll_row=1
end if

ls_temp=\"Asc(Upper(left(\"+ls_column+\",1)))>=\"+String(li_key)
ll_row=this.find(ls_temp,ll_row,this.rowcount())

if ll_row > 0 then
this.selectrow(0,false)
this.selectrow(ll_row,true)
this.ScrollToRow(ll_row)
this.SetRow(ll_row)
end if

ii_last_key = li_key
end if


Espero que te sirva
Saludos